雜篇:一首詩認識[- Git -]

張風捷特烈發表於2019-04-28

本文用一首詩的版本控制,簡單認識一下Git,原始碼可見:
Git的安裝,環境配置什麼的我就不廢話了(新手請進,高手慎入...)


一、建立與提交

1.《應龍》: v0.01

捷特寫了一首詩《應龍》 如下:J:\git\捷特詩集\應龍.txt

雜篇:一首詩認識[- Git -]


2.將J:\git\捷特詩集資料夾作為repository(版本庫)

然後開啟git-bash (相比cmd而言,git-bash可以識別Linux的命令)

$ cd /j/git/捷特詩集

$ git init
Initialized empty Git repository in J:/git/捷特詩集/.git/
複製程式碼

雜篇:一首詩認識[- Git -]


3.將剛才寫的《應龍》提交
$ git add 應龍.txt

$ git commit -m "《應龍》 張風捷特烈第一次提交"
[master (root-commit) c42ecee] 《應龍》 張風捷特烈第一次提交
 1 file changed, 3 insertions(+)
 create mode 100644 "\345\272\224\351\276\231.txt"
複製程式碼

4.《應龍》: v0.02

然後發現忘記寫大名了,所以修改了一下,再提交

雜篇:一首詩認識[- Git -]

$ git add 應龍.txt

$ git commit -m "《應龍》v0.0.2 忘記加作者了,已加"
[master 25a0323] 《應龍》v0.0.2 忘記加作者了,已加
 1 file changed, 1 insertion(+), 1 deletion(-)
複製程式碼

5.《應龍》: v0.03

然後捷特斟酌了一下,稍加修改

雜篇:一首詩認識[- Git -]

$ git add 應龍.txt

$ git commit -m "《應龍》v0.0.3 稍微優化措辭"
[master cca5e1b] 《應龍》v0.0.3 稍微優化措辭
 1 file changed, 1 insertion(+), 1 deletion(-)
複製程式碼

二、時空穿梭

1.提交的日誌

是不是很強大,可以將你提交的時間、備註顯示出來
其中每次提交會有一個SHA1的commit版本號,用來唯一表識

$ git log
commit cca5e1b9ea7e28dbc608f4191f1b0ea0f15e60e9 (HEAD -> master)
Author: Administrator <1981462002@qq.com>
Date:   Sat Apr 27 22:10:27 2019 +0800

    《應龍》v0.0.3 稍微優化措辭

commit 25a0323bc71a8c8c436d94bcb6c9d472c88d6931
Author: Administrator <1981462002@qq.com>
Date:   Sat Apr 27 22:02:52 2019 +0800

    《應龍》v0.0.2 忘記加作者了,已加

commit c42eceed619d5d90b631fd6587240fdfd04fc1e9
Author: Administrator <1981462002@qq.com>
Date:   Sat Apr 27 21:56:42 2019 +0800

    《應龍》 張風捷特烈第一次提交
複製程式碼

那master和HEAD又是什麼呢?這裡先看下圖

雜篇:一首詩認識[- Git -]


2.版本回溯

現在我想看看V0.0.2版的內容可不可以呢? reset --hard HEAD~1 移動頭節點 ~移多少個

$ git reset --hard HEAD~1
HEAD is now at 25a0323 《應龍》v0.0.2 忘記加作者了,已加
複製程式碼

然後你會發現V0.0.2版的內容就回來了,但當你再git log時,發現v0.0.3版的木有了,怎麼回去呢?

雜篇:一首詩認識[- Git -]

$ git log
commit 25a0323bc71a8c8c436d94bcb6c9d472c88d6931 (HEAD -> master)
Author: Administrator <1981462002@qq.com>
Date:   Sat Apr 27 22:02:52 2019 +0800

    《應龍》v0.0.2 忘記加作者了,已加

commit c42eceed619d5d90b631fd6587240fdfd04fc1e9
Author: Administrator <1981462002@qq.com>
Date:   Sat Apr 27 21:56:42 2019 +0800

    《應龍》 張風捷特烈第一次提交
複製程式碼

雜篇:一首詩認識[- Git -]


3.怎麼回到V0.0.3版

突然想到那個SHA1的提交號應該不是吃乾飯的,往上一翻,還在:

$ git reset --hard cca5e1b9ea7e28dbc608f4191f1b0ea0f15e60e9
HEAD is now at cca5e1b 《應龍》v0.0.3 稍微優化措辭
複製程式碼

然後你會發現V0.0.3版的內容就回來了,git log 看一下又回到剛才了
但是我要是關了終端,找不到SHA1值怎麼辦?

雜篇:一首詩認識[- Git -]


4.git reflog 前來救駕

這裡可以看到v0.0.3提交的資訊, cca5e1b 就是提交的SHA1開頭的幾個字母
注意:git reset --hard不須要完整的SHA1值,它會自己找:所以SHA1手中握,版本任穿梭

$ git reflog
25a0323 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
cca5e1b HEAD@{1}: reset: moving to cca5e1b9ea7e28dbc608f4191f1b0ea0f15e60e9
25a0323 (HEAD -> master) HEAD@{2}: reset: moving to HEAD~1
cca5e1b HEAD@{3}: commit: 《應龍》v0.0.3 稍微優化措辭
25a0323 (HEAD -> master) HEAD@{4}: commit: 《應龍》v0.0.2 忘記加作者了,已加
c42ecee HEAD@{5}: commit (initial): 《應龍》 張風捷特烈第一次提交

$ git reset --hard cca5e1b
複製程式碼

三、遠端倉庫 : Github

你可以將Github當成一個有圖形介面的檔案儲存伺服器,簡稱遠端倉庫
現在我想邀請遠在火星的龍少來幫我推敲一下這首詩

1.Github 賬號上建立一個ssh Key
$ ssh-keygen -t rsa -C "1981462002@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:3uKFITBRP8RXzkgiN9QG1qySSxitzokD2jjHOGKkuJ4 1981462002@qq.com
The key's randomart image is:
+---[RSA 2048]----+
|    .oooO=...    |
|    ...*.+*+     |
|    o+ .o+. o    |
|..  oo+ ..       |
|=* + o.oS        |
|X.* + .o +       |
|o= .    + o      |
|. .    . o       |
|.E      .        |
+----[SHA256]-----+
複製程式碼

雜篇:一首詩認識[- Git -]


1.將遠端倉庫專案拷貝到本地
$ git clone git@github.com:toly1994328/Poem-GitTest.git
Cloning into 'Poem-GitTest'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.
複製程式碼

2.將剛才的詩拷貝一下提交

這樣龍少就可以用瀏覽器訪問Github看到了

雜篇:一首詩認識[- Git -]

$ git add 應龍.txt

$ git commit -m "《應龍》v0.0.1 提交遠端倉庫"
[master 6342daf] 《應龍》v0.0.1 提交遠端倉庫
 1 file changed, 3 insertions(+)
 create mode 100644 "\345\272\224\351\276\231.txt"

|--- 現在只是本地提交 ,遠端倉庫是沒有記錄的,需要下面:--------------
$ git push -u origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 475 bytes | 475.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:toly1994328/Poem-GitTest.git
   1cd6839..6342daf  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
複製程式碼

3.遠端協作

這時龍少看到了,然後fork一下,改了一個字,然後發起一個requst

雜篇:一首詩認識[- Git -]


4. 同意修改 : Merge requst

雜篇:一首詩認識[- Git -]


5. 現在本地和倉庫的檔案不一致了怎麼辦?
|--- 一句話搞定 ----------
$ git merge origin master # 融合origin遠端的master分支
或者:git pull origin master # 拉取遠端master分支的資源

|--- 當需要檢視一下資訊時: ----------
$ git remote -v # 檢視遠端的名稱
origin  git@github.com:toly1994328/Poem-GitTest.git (fetch)
origin  git@github.com:toly1994328/Poem-GitTest.git (push)

$ git diff origin master # 檢視本地檔案與遠端的差異
diff --git "a/\345\272\224\351\276\231.txt" "b/\345\272\224\351\276\231.txt"
index f5dd948..e85e740 100644
--- "a/\345\272\224\351\276\231.txt"
+++ "b/\345\272\224\351\276\231.txt"
@@ -1,3 +1,3 @@
 應龍  ---- 張風捷特烈
-一遊小池兩歲月,洗卻凡世幾閒塵。
-時逢雷霆風會雨,應乘扶搖化入雲。
+戲遊小池兩歲月,洗卻凡世幾閒塵。
+時逢雷霆風會雨,應乘扶搖化入雲。
複製程式碼

OK,這樣就完成了一次簡單的多人協作


6.衝突與解決

捷特此時改了一下本地檔案,新增了創作日期,暫時沒有提交

雜篇:一首詩認識[- Git -]

龍少又改了一下:捷特也merge了,說明伺服器倉庫的檔案已改變

雜篇:一首詩認識[- Git -]

捷特將本地拉倉庫的檔案時和本地檔案發生衝突,然後本地檔案就成這樣了:

雜篇:一首詩認識[- Git -]

$ git add 應龍.txt

$ git commit -m "《應龍》v0.0.2 新增日期"
[master 308dc12] 《應龍》v0.0.2 新增日期
 1 file changed, 1 insertion(+)

$ git pull origin master # 先將伺服器上的拉下來
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From github.com:toly1994328/Poem-GitTest
 * branch            master     -> FETCH_HEAD   # 本地
   55f6a69..0185ee5  master     -> origin/master # 遠端的倉庫中
Auto-merging 應龍.txt
CONFLICT (content): Merge conflict in 應龍.txt # 發生衝突了
Automatic merge failed; fix conflicts and then commit the result.

---->[提交解決衝突之後的檔案]-------------------------------
$ git add 應龍.txt

$ git commit -m "《應龍》--解決衝突"
[master f508868] 《應龍》--解決衝突

$ git push -u origin master #推到服務端倉庫
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 638 bytes | 638.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), completed with 2 local objects.
To github.com:toly1994328/Poem-GitTest.git
   0185ee5..f508868  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

複製程式碼

四、分支

1.主分支

每一次的提交相當於建立了一個節點,它有一個唯一的SHA1值來確定它的唯一
在一個git專案初始時,會預設建立分支master,如果你一直修改/提交,就會成為一條長線

雜篇:一首詩認識[- Git -]


2.建立分支:git branch XXX

當v.0.0.3已經符合預期了,現在我有個想法,把這首詩寫成8句話
現在新建一個分支dev來開發這個版本

$ git branch # 檢視當前分支
* master

$ git branch dev #建立名為dev的分支

$ git branch # 檢視當前分支,當前還在master上
  dev
* master

$ git checkout dev #切換到dev分支
Switched to branch 'dev'
複製程式碼

注:建立並切換到dev分支git checkout -b dev


3. 在 dev 分支提交

雜篇:一首詩認識[- Git -]

$ git add 應龍.txt
$ git commit -m "dev 分支第一次提交"
複製程式碼

雜篇:一首詩認識[- Git -]

雜篇:一首詩認識[- Git -]

經過三次提交之後,覺得還行了,於是:


4.將dev分支merge到主分支

雜篇:一首詩認識[- Git -]

$ git checkout master #回到主分支

$ git merge dev # merge到主分支
Updating f508868..78f60b0
Fast-forward
 "\345\272\224\351\276\231.txt" | 2 ++
 1 file changed, 2 insertions(+)
 
$ git push -u origin master #推到服務端倉庫
複製程式碼

可以檢視記錄和Merge的情況

$  git log --graph --pretty=oneline --abbrev-commit
* 78f60b0 (HEAD -> master, origin/master, origin/HEAD, dev) dev 分支第三次提交
* e34cd69 dev 分支第二次提交
* 37097fc dev 分支第一次提交
*   f508868 《應龍》--解決衝突
|\
| *   0185ee5 Merge pull request #2 from zfjtl/patch-1
| |\
| | * 38300ed Update 應龍.txt
| |/
* | 308dc12 《應龍》v0.0.2 新增日期
|/
*   55f6a69 Merge pull request #1 from zfjtl/master
|\
| * fe2d3bf Update 應龍.txt
|/
* 6342daf 《應龍》v0.0.1 提交遠端倉庫
* 1cd6839 Initial commit
複製程式碼

注:回溯某分支的某版本,和上面一樣,只要用SHA1就行了


5.將本地分支同步到github

雜篇:一首詩認識[- Git -]

$ git push origin dev
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'dev' on GitHub by visiting:
remote:      https://github.com/toly1994328/Poem-GitTest/pull/new/dev
remote:
To github.com:toly1994328/Poem-GitTest.git
 * [new branch]      dev -> dev
複製程式碼

6.打標籤和同步到github

雜篇:一首詩認識[- Git -]

git tag v0.0.4 # 打標籤

$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To github.com:toly1994328/Poem-GitTest.git
 * [new tag]         v0.0.4 -> v0.0.4


$ git show v0.0.4 #檢視標籤
commit 78f60b055efb8b7daf59951f3f1558d623b11b1a (HEAD -> master, tag: v0.0.4, origin/master, origin/HEAD)
Author: Administrator <1981462002@qq.com>
Date:   Sun Apr 28 09:56:05 2019 +0800

    dev 分支第三次提交

diff --git "a/\345\272\224\351\276\231.txt" "b/\345\272\224\351\276\231.txt"
index 4fe0222..42858c1 100644
--- "a/\345\272\224\351\276\231.txt"
+++ "b/\345\272\224\351\276\231.txt"
@@ -2,5 +2,6 @@
 一遊小池兩歲月,洗卻凡世幾閒塵。
 時逢雷霆風會雨,應乘扶搖化入雲。
 蛇蟲何力卷波濤,雀鳥焉能平九霄。
+龍鵬所至非巨集志,莫以已見比擬之。
                        2018.2.2  捷特作
             2019.4.27 龍少批閱
複製程式碼

7. 遇到bug時

可見確實有點小問題

雜篇:一首詩認識[- Git -]

git checkout -b featrue

$ git add 應龍.txt
$ git commit -m "featrue 分支修復bug"

|--- 合併featrue到dev分支
git checkout dev
git merge featrue

git checkout master
git merge dev

git push -u origin master #推到服務端倉庫
git push origin featrue

git tag v0.0.5 # 打標籤
git push origin --tags # 標籤推到服務端倉庫
複製程式碼

雜篇:一首詩認識[- Git -]

雜篇:一首詩認識[- Git -]


8.現在想加新功能

用markdown的格式來寫,就在featrue分支來改吧,將檔名改為應龍.md

git checkout featrue

$ git add 應龍.md
$ git commit -m "featrue markdown的格式"

git push -u origin featrue # 將修改同步到feature分支
複製程式碼

雜篇:一首詩認識[- Git -]

感覺還不錯,然後merge到dev上,可以暫時不merge到master,繼續開發,就像這樣:

雜篇:一首詩認識[- Git -]

git checkout dev
git merge featrue

dev繼續開發...

git checkout master
git merge dev
git push -u origin master # 將修改同步到feature分支

git tag v0.0.6 # 打標籤
git push origin --tags # 標籤推到服務端倉庫
複製程式碼

五、視覺化介面

1.TortoiseGit

命令列寫起來不舒服的人可以選擇一些視覺化的工具

雜篇:一首詩認識[- Git -]

可以很方便的檢視某次提交的修改內容

雜篇:一首詩認識[- Git -]

可以很清晰的看到提交的流程

雜篇:一首詩認識[- Git -]


2.Idea家族的軟體,比如AndroidStudio

首先在Settings裡配置

雜篇:一首詩認識[- Git -]


然後將專案匯入AndroidStudio(雖然不是Android專案,但是也沒關係)

雜篇:一首詩認識[- Git -]


修改和push到遠端倉庫

雜篇:一首詩認識[- Git -]


切換分支

雜篇:一首詩認識[- Git -]


六、小結

Git 就是安心丸 + 後悔藥,git一下,何樂不為?

1.配置相關
檢視版本號:    git --version
檢視配置:       git config --list
                    |--- git config --list --global
                    |--- git config --list --system
                    |--- git config --list --local
檢視單一資訊:   git config user.email
複製程式碼

2.操作相關
初始化:     git init
新增檔案:  git add <file>
提交記錄:  git commit -m <備註>
記錄溯回:  git reset --hard HEAD~<step>
記錄溯回:  git reset --hard <SHA1>
刪除檔案:  git rm <file>
檢視狀態:  git status
打標籤:    git tag v0.0.6
複製程式碼

3.檢視相關
git log
git reflog
git reflog --all
git log --graph
git log --graph --pretty=oneline --abbrev-commit
複製程式碼

4.遠端相關
克隆專案:      git clone git@github.com:toly1994328/Poem-GitTest.git
推送到遠端:    git push -u origin <branch>
拉取遠端資源:  git pull origin <branch>
與遠端同步:    git merge origin <branch>
檢視遠端資訊:  git remote -v
檢視遠端差異:  git diff origin <branch>
推送標籤:      git push origin --tags
複製程式碼

5.分支相關
檢視分支:              git branch
建立分支:              git branch <name>
切換分支:              git checkout <name>
建立+切換分支:         git checkout -b <name>
合併目標分支到當前分支:  git merge <目標分支>  
刪除分支:              git branch -d <name>
複製程式碼

相關文章