鍍金池/ 教程/ Java/ 從分支移除提交
創(chuàng)建沖突
暫存更改
創(chuàng)建項目
Git 內(nèi)幕:.git 目錄
撤銷本地更改
移動文件
移除 oops 標(biāo)簽
何為 Origin
再談結(jié)構(gòu)
撤銷暫存的更改
修正提交
別名
檢查狀態(tài)
給版本打標(biāo)簽
撤銷提交的更改
拉下共享的更改
變基
暫存與提交
合并
合并拉下的更改
更改而非文件
更改原始倉庫
重置 master 分支
回顧克隆的倉庫
變基 VS 合并
共享倉庫
導(dǎo)航分支
重置 greet 分支
添加跟蹤的分支
獲得舊版本
克隆倉庫
Git 內(nèi)幕:直接處理 Git 對象
再談設(shè)置
遠(yuǎn)程分支
從分支移除提交
合并回 master
查看分叉的分支
添加遠(yuǎn)程倉庫
拉下更改
歷史
在 master 中更改
裸倉庫
做更改
高級/將來的主題
推送更改
多個倉庫
設(shè)置
提交更改
取得更改
托管你的 Git 倉庫
創(chuàng)建分支
解決沖突

從分支移除提交

目的

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

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

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

重置命令

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

當(dāng)給定提交引用(如哈希、分支或標(biāo)簽名)時,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]

我們看到在該分支中的最后兩個提交為“Oops”和“Revert Oops”。讓我們使用 reset 來移除它們。

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

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

$ git tag oops

重置到 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ù)。

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