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

HEAD

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

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

咱們能夠經過下面這張圖來理解:3d

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

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

若是想看HEAD指向,能夠經過cat .git/HEAD查看,若是HEAD指向的是一個引用,還能夠用git symbolic-ref HEAD查看它的指向。blog

分離HEAD

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

當咱們執行git checkout C4命令時,效果以下gif圖所示:io

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

相對引用

相對引用很是給力,這裏我介紹兩個簡單的用法:class

  • 使用^向上移動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環境中動手試一試吧~

微信公衆號: 碼上論劍
請關注個人我的技術微信公衆號,訂閱更多內容
相關文章
相關標籤/搜索