git命令詳解( 八)


此為記錄git的第八篇,前七篇為遠程篇,工作中最常用的都在前七篇,因為要在遠程分支上合作開發

         在提交樹上移動

      撤銷變更

在提交樹上移動

在接觸 Git 更高級功能之前,我們有必要先學習在你項目的提交樹上前后移動的幾種方法。

一旦熟悉了如何在 Git 提交樹上移動,你駕馭其它命令的能力也將水漲船高!

HEAD

我們首先看一下 “HEAD”。 HEAD 是一個對當前檢出記錄的符號引用 —— 也就是指向你正在其基礎上進行工作的提交記錄。

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

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

下面咱們通過實際操作看一下。我們將會觀察提交前后 HEAD 的位置。

執行命令: git checkout C1

      git checkout master

      git commit 

      git checkout C2

看到了嗎? HEAD 指向了 master,隨着提交向前移動。

分離的 HEAD

分離的 HEAD 就是讓其指向了某個具體的提交記錄而不是分支名。在命令執行之前的狀態如下所示:

HEAD -> master -> C1

HEAD 指向 master, master 指向 C1

執行命令:git checkout C1

現在變成了

HEAD -> C1

 

相對引用

通過指定提交記錄哈希值的方式在 Git 中移動不太方便。在實際應用時,並沒有像本程序中這么漂亮的可視化提交樹供你參考,所以你就不得不用 git log 來查查看提交記錄的哈希值。

並且哈希值在真實的 Git 世界中也會更長(譯者注:基於 SHA-1,共 40 位)。例如前一關的介紹中的提交記錄的哈希值可能是 fed2da64c0efc5293610bdd892f82a58e8cbc5d8。舌頭都快打結了吧...

比較令人欣慰的是,Git 對哈希的處理很智能。你只需要提供能夠唯一標識提交記錄的前幾個字符即可。因此我可以僅輸入fed2 而不是上面的一長串字符。

正如我前面所說,通過哈希值指定提交記錄很不方便,所以 Git 引入了相對引用。這個就很厲害了!

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

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

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

首先看看操作符 (^)。把這個符號加在引用名稱的后面,表示讓 Git 尋找指定提交記錄的父提交。

所以 master^ 相當於“master 的父節點”。

master^^ 是 master 的第二個父節點

現在咱們切換到 master 的父節點

執行命令:git checkout master^

搞定。這種方式是不是比輸入哈希值方便多了?!

 

你也可以將 HEAD 作為相對引用的參照。下面咱們就用 HEAD在提交樹中向上移動幾次。

執行命令: git checkout C3

      git checkout HEAD^

      git checkout HEAD^

        git checkout HEAD^

很簡單吧?!我們可以一直使用 HEAD^ 向上移動。

 

“~”操作符

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

該操作符后面可以跟一個數字(可選,不跟數字時與 ^ 相同,向上移動一次),指定向上移動多少次。咱們還是通過實際操作看一下吧

咱們用 ~<num> 一次后退四步。

執行命令:git checkout HEAD~4

多么的簡潔 —— 相對引用就是方便啊!

 

強制修改分支位置

你現在是相對引用的專家了,現在用它來做點實際事情。

我使用相對引用最多的就是移動分支。可以直接使用 -f 選項讓分支指向另一個提交。例如:

git branch -f master HEAD~3

上面的命令會將 master 分支強制指向 HEAD 的第 3 級父提交。

執行命令:git branch -f master HEAD~3

這就對了! 相對引用為我們提供了一種簡潔的引用提交記錄 C1 的方式, 而 -f 則容許我們將分支強制移動到那個位置。

 

撤銷變更

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

主要有兩種方法用來撤銷變更 —— 一是 git reset,還有就是 git revert。接下來咱們逐個進行講解

git Reset

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

讓我們來看看演示:

執行命令:git reset HEAD~1

漂亮! Git 把 master 分支移回到 C1;現在我們的本地代碼庫根本就不知道有 C2 這個提交了。

 

git revert

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

執行命令:git revert HEAD

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM