2012-01-03 30 views
4

如果我使用:比較有關使用結賬或復位難以撤消git的承諾

$ git reset --hard HEAD~N 

$ git checkout HEAD~N 

兩個兩將使用HEAD~N版本,以改變工作目錄和舞臺區。

如果這兩個命令有什麼不同?
謝謝。

+1

閱讀更多復位信息:http://progit.org/2011/07/11/reset.html – johnny 2012-01-03 12:01:57

+0

謝謝!這篇文章很有幫助。我已經閱讀並理解了一些概念。我的帖子是錯誤的,不是'重置硬盤'和'結帳'都清洗工作目錄,'重置'覆蓋它和'結帳'合併它。 – 2012-01-04 12:50:12

回答

4

git checkout HEAD~N是爲了檢查提交而不在工作,因爲它會創建一個分離的頭部狀態。如果要將(當前分支頭)重置爲特定提交,請使用git reset [--hard]

+0

當我貼我的時候沒有馬上看到你的答案。 +1 – VonC 2012-01-03 20:34:08

2
  • git reset --hard將當前分支HEAD恢復到指定的Refspec
  • git checkout將切換分支,讓你在detached head mode

因此,第一個,你可以立即開始提交,在你當前的分支。
第二,你需要先定義一個分支,你(之前)當前分支HEAD沒有移動。只有工作目錄已被更改。你不再在任何分支(因此「分離模式」)。

2

第一個會將分支更改爲指向您指定的提交。提交之前的提交將會丟失,除非另有引用(分支或標記)。有reflog(git reflog),它保留了檢出的內容的歷史記錄(默認情況下,這保留了最後90天的值)

第二個會將分支切換到您指定的分支。由於您指定了提交而不是本地分支,因此您不會跟蹤您在此處提交的任何更改。除了reflog之外,當您執行除當前提交或HEAD以外的其他結賬時,您將失去在第一次結賬後進行的這些提交。

您可以「撤銷」工作的第三種方法是放置「 - 」。在你的第二個命令後。這會將工作樹更改爲文件在您指定的提交中所處的狀態。您仍然會檢出相同的分支,並且它仍然會指向相同的提交。當你運行「git status」時,你會看到你工作目錄中的所有變化看起來像你編輯你的文件,看起來像你在指定的提交中。如果進行這些更改,將會產生新的提交,如果指定的提交有效「解除」後續提交的任務。您當前的分支現在將指向此提交。如果其他人可能依賴於實際需要擦除的提交,這是一個很好的做法。

+1

尼斯詳細的答案。 +1 – VonC 2012-01-03 20:38:07