目的
學(xué)習(xí)如何從分支移除最近的提交。
上一小節(jié)的 revert 是一個(gè)讓我們撤銷(xiāo)倉(cāng)庫(kù)中的任意提交的強(qiáng)大命令。然而,原始提交和“撤銷(xiāo)”提交在分支歷史中都可見(jiàn)(使用 git log 命令)。
我們經(jīng)常做提交,并很快意識(shí)到犯了錯(cuò)誤。如果有一個(gè)“收回”命令能允許我們假裝不正確的提交從未發(fā)生過(guò)該多好啊?!笆栈亍泵钌踔吝€會(huì)阻止錯(cuò)誤的提交在 git log 歷史中的顯示。這就像錯(cuò)誤的提交從未發(fā)生過(guò)一樣。
我們已經(jīng)介紹過(guò) reset 命令,并用它來(lái)設(shè)置暫存區(qū)以便與特定的提交保持一致(我們?cè)谥暗膶?shí)驗(yàn)中使用 HEAD 提交)。
當(dāng)給定提交引用(如哈希、分支或標(biāo)簽名)時(shí),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]
我們看到在該分支中的最后兩個(gè)提交為“Oops”和“Revert Oops”。讓我們使用 reset 來(lái)移除它們。
但在我們移除提交前,讓我們使用一個(gè)標(biāo)簽來(lái)標(biāo)記最新的提交以便能夠再次找到它。
$ git tag oops
看看上面的日志歷史,我們將知道標(biāo)記為“v1”的提交是錯(cuò)誤提交之前的正確提交。讓我們重置分支到該位置。因?yàn)榉种б呀?jīng)標(biāo)記,所以我們可以在 reset 命令中使用標(biāo)簽名(如果它沒(méi)有被標(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)更新工作目錄以便與新的分支頭保持一致。
但錯(cuò)誤的提交發(fā)生了什么?結(jié)果是提交仍然在倉(cāng)庫(kù)中。事實(shí)上,我們?nèi)匀荒軌蛞盟鼈?。記得在本?shí)驗(yàn)開(kā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]
在這兒我們看到錯(cuò)誤的提交并沒(méi)有消失。它們?nèi)匀辉趥}(cāng)庫(kù)中。它們只是不再列到 master 分支中。如果我們沒(méi)有標(biāo)記它們,它們依然在倉(cāng)庫(kù)中,但除了使用哈希值外沒(méi)有別的方法引用它們。未引用的提交保留在倉(cāng)庫(kù)中,一直到系統(tǒng)運(yùn)行垃圾回收軟件時(shí)。
在本地分支上重置一般是安全的。任何“事故”通常都能通過(guò)重置到想要的提交來(lái)恢復(fù)。
然而,如果分支在共享的遠(yuǎn)程倉(cāng)庫(kù)上,那么重置可能使其他用戶(hù)共享的分支混亂。