1. 程式人生 > >圖解Git 命令列(一)

圖解Git 命令列(一)

0. Git 的相關原理

Git 倉庫中的提交記錄儲存的是你的目錄下所有檔案的快照,就像是把整個目錄複製,然後再貼上一樣,但比複製貼上優雅許多!

Git 希望提交記錄儘可能地輕量,因此在你每次進行提交時,它並不會盲目地複製整個目錄。條件允許的情況下,它會將當前版本與倉庫中的上一個版本進行對比,並把所有的差異打包到一起作為一個提交記錄。

Git 還儲存了提交的歷史記錄。這也是為什麼大多數提交記錄的上面都有父節點的原因,我們會在圖示中用箭頭來表示這種關係。(注意被箭頭指向的是父節點)

1. git commit (提交程式碼到本地)

如圖所示,目前有 2 次提交記錄(這裡用C0,C1 表示,實際中應該是一串雜湊值),我們在「master」分支下使用命令列。

git commit -m "First log"

C2 出現了,也就是說,版本更新到 C2了。
當然我們可以繼續在 C2 提交程式碼。


這樣 C3 就出現了,這就是「commit」
我們的每一次提交都會生成一個提交記錄。

2. git branch (建立本地分支)

那麼我們如何再新建一條分支用來修復 bug 呢? 這裡我建立了名為 「fixbug」 的分支

首先,我們可以通過下面命令來建立分支

git branch fixbug

然後再通過下面命令來切換到剛剛新建的分支

git checkout fixbug

最後我們在「fixbug」分支上提交一次程式碼,當前的狀態如下圖所示

當然建立分支和切換分支可以用一條命令來達到,如下

git checkout -b fixbug

有小夥伴注意到 「fixbug 」分支上的「 * 」星號了嗎?這表示當前所在的分支是 「fixbug 」

3. git merge (合併分支)

當有兩條分支各自開發的內容需要合併的時候就需要合併分支了。

如下圖,我在 C1 新建了分支「fixbug」並提交了一次,主分支「master」也提交了一次。
這時候他們兩者的內容是不同的,如果業務需要合併程式碼。

我們首先切換到主分支上,如圖,「master」旁邊有星號,然後通過下邊的命令列。

git merge
fixbug

關於誰合併誰的問題,我們只要知道,發起合併所在的分支是強勢方,另一方是被合併方。
這樣我們就簡單的合併了,當然這裡還沒講到關於衝突的問題。

4. git rebase (合併分支)

第二種合併分支的方法就是 rebase。
rebase 實際上就是取出一系列的提交記錄,“複製”它們,然後在另外一個地方逐個的放下去。
他的優點是如果專案一直使用 rebase 那麼提交歷史就會很清晰,只有一條主線,而不像 merge 一樣合併來合併去。
下圖命令是在 「bugFix」 所在的分支下使用,將他複製一份到「master」分支後。
這樣「bugFix」就有了「master」 裡面的所有內容了。
這裡我們也沒有考慮衝突問題。

git rebase master

5. HEAD

什麼是 「HEAD」?
我們在版本控制的日誌中,經常會看到一個「HEAD」標識,其實這個「HEAD」的意思類似於遊標,你當前在哪個分支,他就會出現在對應的分支上。
即:「HEAD 」指向的就是當前所在的分支。

「HEAD」一般指向分支,而分支指向提交記錄,所以正常情況下「HEAD」跟隨著分支一起動,但我們也可以使「HEAD」指向具體的提交記錄。
在這裡我們使用

git checkout C6

如圖切換到了 C6 的提交記錄上去了,這時候「HEAD」就指向了 C6

6. 相對引用

正常情況下我們要切換到某個提交記錄都是要通過雜湊值來確定。

git checkout C0

當然我們還有另一種方式,使用相對引用

1.使用 ^ 向上移動 1 個提交記錄,如下圖,我們在 C1 使用瞭如下程式碼,「HEAD 」指向了 C0,如果重複使用會一層層往上。

git checkout HEAD^

2.使用 ~<num> 向上移動多個提交記錄,如 ~3

git checkout HEAD~3

7. 強制修改分支位置

可以直接使用 -f 選項讓分支指向另一個提交。例如:
當「master」 分支指向 C6 時。
下面的命令會將 「master 」分支強制指向「HEAD 」的第 3 級父提交。

git branch -f master HEAD~3

當然這種形式也是支援的。

git branch -f master HEAD^

如果什麼都不填,「master 」就會和 「HEAD」指向同一個提交。

git branch -f master

8.程式碼撤銷

主要通過下面兩種方式來進行撤銷 git reset,git revert。

git reset 是通過回退到某個提交記錄來實現撤銷的,但是這種方式對於遠端分支來說是無效的。
如圖我們的本地分支在 C3 的提交記錄上,這時候我們想撤銷回到 C1 就可以使用

git reset HEAD~1

而 git revert 是在我們要撤銷的提交記錄後多一個新的提交,新提交記錄 C2’ 引入了更改 ,這些更改剛好是用來撤銷 C2 這個提交的。也就是說 C2’ 的狀態與 C1 是相同的,這樣也相當於對程式碼進行了撤銷。

git revert HEAD

9. 整理提交記錄

如果你想將其他分支的一些提交複製到當前所在的位置也就是「HEAD」下面的話, cherry-pick 是最直接的方式。如下圖我們把 C2 和 C3 的提交記錄複製到 C5 下

git cherry-pick C2 C3

10. 互動式的 rebase

當你知道你所需要的提交記錄(並且還知道這些提交記錄的雜湊值)時, 用 cherry-pick 再好不過了。
但是如果你不清楚你想要的提交記錄的雜湊值呢? 我們可以利用互動式的 rebase

interactive 的 rebase 命令, 簡寫為 -i

使用該條命令,可以使當前分支下,任意條數的提交記錄被直接複製下來,然後再另外的地方貼上。當然期間還可以修改順序,通過更改 pick 的狀態刪除不想要的提交,還能把多個提交記錄合併。

我們在「master」上使用下面命令。

git rebase -i HEAD~4

喜歡的可以關注一下咯

掃描二維碼更多精彩哦~星球圈子是免費的。