HEAD
HEAD是一個對當前檢出記錄的符號引用,也就是指向你正在其基礎上進行工作的提交記錄。
HEAD總是指向當前分支上最近一次提交記錄。大多數修改提交樹的Git命令都是從改變HEAD的指向開始的。
我們可以通過下面這張圖來理解:
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圖所示:
使用相對引用的話,你就可以從一個易於記憶的地方(比如 bugFix 分支或 HEAD)開始計算。
相對引用
相對引用非常給力,這裡我介紹兩個簡單的用法:
- 使用
^
向上移動1個提交記錄 - 使用
~<num>
向上移動多個提交記錄,如~3
相對引用(^)
把操作符(^)加在引用名稱的後面,表示讓Git尋找指定提交記錄的父提交。
所以,master^
相當於“master的父節點”,master^^
是master的第二個父節點。
執行git checkout master^
,具體效果如下gif所示:
相對引用(~)
如果你想在提交樹中向上移動很多步的話,敲那麼多^
貌似也挺煩人的,Git當然也考慮到了這一點,於是又引入了操作符~
。
該操作符後面可以跟一個數字(可選,不跟數字時與^ 相同
,向上移動一次),指定向上移動多少次。
執行git checkout master~2
,具體效果如下gif所示:
撤銷變更
在Git裡撤銷變更的方法很多。和提交一樣,撤銷變更由底層部分(暫存區的獨立檔案或者片段)和上層部分(變更到底是通過哪種方式被撤銷的)組成。我們這個應用主要關注的是後者。
主要有兩種方法用來撤銷變更:
- git reset
- git revert。
接下來我們們逐個進行講解:
git reset
git reset通過把分支記錄回退幾個提交記錄來實現撤銷改動。你可以將這想象成“改寫歷史”。git reset向上移動分支,原來指向的提交記錄就跟從來沒有提交過一樣。
雖然在你的本地分支中使用git reset很方便,但是這種“改寫歷史”的方法對大家一起使用的遠端分支是無效的哦!
執行git reset master^
,具體效果如下gif所示:
git revert
為了撤銷更改並分享給別人,我們需要使用git revert。
執行git revert master^
,具體效果如下gif所示:
奇怪!在我們要撤銷的提交記錄後面居然多了一個新提交!這是因為新提交記錄C2'引入了更改,這些更改剛好是用來撤銷C2這個提交的。也就是說C2'的狀態與C1是相同的。
revert之後就可以把你的更改推送到遠端倉庫與別人分享啦。
相信大家對git的高階篇已經基本掌握,不妨在自己的git環境中動手試一試吧~