目的
學(xué)習(xí)如何從分支移除最近的提交。
上一小節(jié)的 revert
是一個讓我們撤銷倉庫中的任意提交的強大命令。然而,原始提交和“撤銷”提交在分支歷史中都可見(使用 git log
命令)。
我們經(jīng)常做提交,并很快意識到犯了錯誤。如果有一個“收回”命令能允許我們假裝不正確的提交從未發(fā)生過該多好啊?!笆栈亍泵钌踔吝€會阻止錯誤的提交在 git log
歷史中的顯示。這就像錯誤的提交從未發(fā)生過一樣。
我們已經(jīng)介紹過 reset
命令,并用它來設(shè)置暫存區(qū)以便與特定的提交保持一致(我們在之前的實驗中使用 HEAD
提交)。
當(dāng)給定提交引用(如哈希、分支或標(biāo)簽名)時,reset
命令將:
讓我們快速的檢查我們的提交歷史。
$ git hist
$ git hist
* a10293f 2013-04-13 | Revert "Oops, we didn't want this commit" (HEAD, master) [Jim Weirich]
* 838742c 2013-04-13 | Oops, we didn't want this commit [Jim Weirich]
* 1f7ec5e 2013-04-13 | Added a comment (v1) [Jim Weirich]
* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]
* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]
* 9416416 2013-04-13 | First Commit [Jim Weirich]
我們看到在該分支中的最后兩個提交為“Oops”和“Revert Oops”。讓我們使用 reset
來移除它們。
但在我們移除提交前,讓我們使用一個標(biāo)簽來標(biāo)記最新的提交以便能夠再次找到它。
$ git tag oops
看看上面的日志歷史,我們將知道標(biāo)記為“v1”的提交是錯誤提交之前的正確提交。讓我們重置分支到該位置。因為分支已經(jīng)標(biāo)記,所以我們可以在 reset
命令中使用標(biāo)簽名(如果它沒有被標(biāo)記,那么我們只能使用哈希值)。
$ git reset --hard v1
$ git hist
$ git reset --hard v1
HEAD is now at 1f7ec5e Added a comment
$ git hist
* 1f7ec5e 2013-04-13 | Added a comment (HEAD, v1, master) [Jim Weirich]
* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]
* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]
* 9416416 2013-04-13 | First Commit [Jim Weirich]
我們的 master 分支現(xiàn)在指到 v1 提交,并且 Oops 和 Revert Oops 提交已經(jīng)不在分支中。--hard
參數(shù)表示應(yīng)當(dāng)更新工作目錄以便與新的分支頭保持一致。
但錯誤的提交發(fā)生了什么?結(jié)果是提交仍然在倉庫中。事實上,我們?nèi)匀荒軌蛞盟鼈?。記得在本實驗開始我們使用標(biāo)簽“oops”標(biāo)記了還原的提交。讓我們看看所有的提交。
$ git hist --all
$ git hist --all
* a10293f 2013-04-13 | Revert "Oops, we didn't want this commit" (oops) [Jim Weirich]
* 838742c 2013-04-13 | Oops, we didn't want this commit [Jim Weirich]
* 1f7ec5e 2013-04-13 | Added a comment (HEAD, v1, master) [Jim Weirich]
* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]
* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]
* 9416416 2013-04-13 | First Commit [Jim Weirich]
在這兒我們看到錯誤的提交并沒有消失。它們?nèi)匀辉趥}庫中。它們只是不再列到 master 分支中。如果我們沒有標(biāo)記它們,它們依然在倉庫中,但除了使用哈希值外沒有別的方法引用它們。未引用的提交保留在倉庫中,一直到系統(tǒng)運行垃圾回收軟件時。
在本地分支上重置一般是安全的。任何“事故”通常都能通過重置到想要的提交來恢復(fù)。
然而,如果分支在共享的遠程倉庫上,那么重置可能使其他用戶共享的分支混亂。