17. Git 從分支移除提交

2018-08-04 14:19 更新

目的

學(xué)習(xí)如何從分支移除最近的提交。

上一小節(jié)的 revert 是一個(gè)讓我們撤銷倉庫中的任意提交的強(qiáng) 大命令。然而,原始提交和“撤銷”提交在分支歷史中都可見(使 用 git log 命令)。

我們經(jīng)常做提交,并很快意識(shí)到犯了錯(cuò)誤。如果有一個(gè)“收回”命 令能允許我們假裝不正確的提交從未發(fā)生過該多好啊?!笆栈亍泵?令甚至還會(huì)阻止錯(cuò)誤的提交在 git log 歷史中的顯示。這就 像錯(cuò)誤的提交從未發(fā)生過一樣。

重置命令

我們已經(jīng)介紹過 reset 命令,并用它來設(shè)置暫存區(qū)以便與特 定的提交保持一致(我們在之前的實(shí)驗(yàn)中使用 HEAD 提交)。

當(dāng)給定提交引用(如哈希、分支或標(biāo)簽名)時(shí),reset 命令 將:

  • 重寫當(dāng)前分支到指向的特定提交
  • 重置暫存區(qū)到匹配特定的提交(可選)
  • 重置工作目錄到匹配特定的提交(可選)

檢查歷史

讓我們快速的檢查我們的提交歷史。

$ 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來移除它們。

首先,標(biāo)記分支

但在我們移除提交前,讓我們使用一個(gè)標(biāo)簽來標(biāo)記最新的提 交以便能夠再次找到它。

$ git tag oops

重置到 Oops 前

看看上面的日志歷史,我們將知道標(biāo)記為“v1”的提交是錯(cuò)誤 提交之前的正確提交。讓我們重置分支到該位置。因?yàn)榉种?已經(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)更新工作目錄以便與新的分 支頭保持一致。

什么也沒丟

但錯(cuò)誤的提交發(fā)生了什么?結(jié)果是提交仍然在倉庫中。事實(shí)上,我們?nèi)匀?能夠引用它們。記得在本實(shí)驗(yàn)開始我們使用標(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ò)誤的提交并沒有消失。它們?nèi)匀辉趥}庫中。它們只是不再 列到 master 分支中。如果我們沒有標(biāo)記它們,它們依然在倉庫中,但除了 使用哈希值外沒有別的方法引用它們。未引用的提交保留在倉庫中,一直到 系統(tǒng)運(yùn)行垃圾回收軟件時(shí)。

重置的危險(xiǎn)性

在本地分支上重置一般是安全的。任何“事故”通常都能通過重置到想要的提 交來恢復(fù)。

然而,如果分支在共享的遠(yuǎn)程倉庫上,那么重置可能使其他用戶共享的分支 混亂。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)