如何克服解決Git衝突的恐懼症?(Git高階篇)

史培培發表於2018-03-14

如何克服解決Git衝突的恐懼症?(Git高階篇)

HEAD

HEAD是一個對當前檢出記錄的符號引用,也就是指向你正在其基礎上進行工作的提交記錄。

HEAD總是指向當前分支上最近一次提交記錄。大多數修改提交樹的Git命令都是從改變HEAD的指向開始的。

我們可以通過下面這張圖來理解:

如何克服解決Git衝突的恐懼症?(Git高階篇)

HEAD->master->C1,HEAD指向master, master指向C1

HEAD通常情況下是指向分支名的(如bugFix)。在你提交時,改變了 bugFix的狀態,這一變化通過HEAD變得可見。

如果想看HEAD指向,可以通過cat .git/HEAD檢視,如果HEAD指向的是一個引用,還可以用git symbolic-ref HEAD檢視它的指向。

分離HEAD

分離的HEAD就是讓其指向了某個具體的提交記錄而不是分支名。

當我們執行git checkout C4命令時,效果如下gif圖所示:

如何克服解決Git衝突的恐懼症?(Git高階篇)

使用相對引用的話,你就可以從一個易於記憶的地方(比如 bugFix 分支或 HEAD)開始計算。

相對引用

相對引用非常給力,這裡我介紹兩個簡單的用法:

  • 使用^向上移動1個提交記錄
  • 使用~<num>向上移動多個提交記錄,如~3

相對引用(^)

把操作符(^)加在引用名稱的後面,表示讓Git尋找指定提交記錄的父提交。

所以,master^相當於“master的父節點”,master^^是master的第二個父節點。

執行git checkout master^,具體效果如下gif所示:

如何克服解決Git衝突的恐懼症?(Git高階篇)

相對引用(~)

如果你想在提交樹中向上移動很多步的話,敲那麼多^貌似也挺煩人的,Git當然也考慮到了這一點,於是又引入了操作符~

該操作符後面可以跟一個數字(可選,不跟數字時與^ 相同,向上移動一次),指定向上移動多少次。

執行git checkout master~2,具體效果如下gif所示:

如何克服解決Git衝突的恐懼症?(Git高階篇)

撤銷變更

在Git裡撤銷變更的方法很多。和提交一樣,撤銷變更由底層部分(暫存區的獨立檔案或者片段)和上層部分(變更到底是通過哪種方式被撤銷的)組成。我們這個應用主要關注的是後者。

主要有兩種方法用來撤銷變更:

  • git reset
  • git revert。

接下來我們們逐個進行講解:

git reset

git reset通過把分支記錄回退幾個提交記錄來實現撤銷改動。你可以將這想象成“改寫歷史”。git reset向上移動分支,原來指向的提交記錄就跟從來沒有提交過一樣。

雖然在你的本地分支中使用git reset很方便,但是這種“改寫歷史”的方法對大家一起使用的遠端分支是無效的哦!

執行git reset master^,具體效果如下gif所示:

如何克服解決Git衝突的恐懼症?(Git高階篇)

git revert

為了撤銷更改並分享給別人,我們需要使用git revert。

執行git revert master^,具體效果如下gif所示:

如何克服解決Git衝突的恐懼症?(Git高階篇)

奇怪!在我們要撤銷的提交記錄後面居然多了一個新提交!這是因為新提交記錄C2'引入了更改,這些更改剛好是用來撤銷C2這個提交的。也就是說C2'的狀態與C1是相同的。

revert之後就可以把你的更改推送到遠端倉庫與別人分享啦。

相信大家對git的高階篇已經基本掌握,不妨在自己的git環境中動手試一試吧~

如何克服解決Git衝突的恐懼症?(Git高階篇)

微信公眾號:碼上論劍
請關注我的個人技術微信公眾號,訂閱更多內容

相關文章