## 目的
> 學習如何從分支移除最近的提交。
上一小節的?`revert`?是一個讓我們撤銷倉庫中的任意提交的強 大命令。然而,原始提交和“撤銷”提交在分支歷史中都可見(使 用?`git log`?命令)。
我們經常做提交,并很快意識到犯了錯誤。如果有一個“收回”命 令能允許我們假裝不正確的提交從未發生過該多好啊。“收回”命 令甚至還會阻止錯誤的提交在?`git log`?歷史中的顯示。這就 像錯誤的提交從未發生過一樣。
### 重置命令
我們已經介紹過?`reset`?命令,并用它來設置暫存區以便與特 定的提交保持一致(我們在之前的實驗中使用?`HEAD`?提交)。
當給定提交引用(如哈希、分支或標簽名)時,`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`來移除它們。
### 首先,標記分支
但在我們移除提交前,讓我們使用一個標簽來標記最新的提 交以便能夠再次找到它。
~~~
$ git tag oops
~~~
### 重置到 Oops 前
看看上面的日志歷史,我們將知道標記為“v1”的提交是錯誤 提交之前的正確提交。讓我們重置分支到該位置。因為分支 已經標記,所以我們可以在?`reset`?命令中使用標簽名( 如果它沒有被標記,那么我們只能使用哈希值)。
~~~
$ 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 分支現在指到 v1 提交,并且 Oops 和 Revert Oops 提 交已經不在分支中。`--hard`?參數表示應當更新工作目錄以便與新的分 支頭保持一致。
### 什么也沒丟
但錯誤的提交發生了什么?結果是提交仍然在倉庫中。事實上,我們仍然 能夠引用它們。記得在本實驗開始我們使用標簽“oops”標記了還原的提交。 讓我們看看所有的提交。
~~~
$ 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]
~~~
在這兒我們看到錯誤的提交并沒有消失。它們仍然在倉庫中。它們只是不再 列到 master 分支中。如果我們沒有標記它們,它們依然在倉庫中,但除了 使用哈希值外沒有別的方法引用它們。未引用的提交保留在倉庫中,一直到 系統運行垃圾回收軟件時。
### 重置的危險性
在本地分支上重置一般是安全的。任何“事故”通常都能通過重置到想要的提 交來恢復。
然而,如果分支在共享的遠程倉庫上,那么重置可能使其他用戶共享的分支 混亂。
- 關于
- 1. 設置
- 2. 再談設置
- 3. 創建項目
- 4. 檢查狀態
- 5. 做更改
- 6. 暫存更改
- 7. 暫存與提交
- 8. 提交更改
- 9. 更改而非文件
- 10. 歷史
- 11. 別名
- 12. 獲得舊版本
- 13. 給版本打標簽
- 14. 撤銷本地更改
- 15. 撤銷暫存的更改
- 16. 撤銷提交的更改
- 17. 從分支移除提交
- 18. 移除 oops 標簽
- 19. 修正提交
- 20. 移動文件
- 21. 再談結構
- 22. Git 內幕:.git 目錄
- 23. Git 內幕:直接處理 Git 對象
- 24. 創建分支
- 25. 導航分支
- 26. 在 master 中更改
- 27. 查看分叉的分支
- 28. 合并
- 29. 創建沖突
- 30. 解決沖突
- 31. 變基 VS 合并
- 32. 重置 greet 分支
- 33. 重置 master 分支
- 34. 變基
- 35. 合并回 master
- 36. 多個倉庫
- 37. 克隆倉庫
- 38. 回顧克隆的倉庫
- 39. 何為 Origin?
- 40. 遠程分支
- 41. 更改原始倉庫
- 42. 取得更改
- 43. 合并拉下的更改
- 44. 拉下更改
- 45. 添加跟蹤的分支
- 46. 裸倉庫
- 47. 添加遠程倉庫
- 48. 推送更改
- 49. 拉下共享的更改
- 50. 托管你的 Git 倉庫
- 51. 共享倉庫
- 52. 高級/將來的主題