2011-07-08 55 views
7

呃哦......我錯誤地提交了一個非常複雜的更改(包括子目錄和文件重命名),但沒有真正知道我在做什麼(或Git會做什麼) 。Git:如何撤消提交*和*恢復到最後一個分支

我現在要撤消一切使得:

  1. 提交時完全相反(好像 它從來沒有做過,也許 從歷史記錄中刪除它)
  2. 恢復當前的工作目錄 (其中.git是)到某個 分支(最後一個會做)。

我發現引用git reset --softgit reset --hard,但我已經證明了自己,我可以提前使用命令沒有完全理解它做實的傷害。 :)

我發現git reset man page但我仍然困惑,:

  1. 什麼是HEAD
  2. HEAD* master有什麼區別?
  3. 在我的情況(見上)我 需要使用--soft,--hard或 其他(3更多的選擇)?
  4. 我是否需要運行另一個命令 (在做完git reset之後)至 「最終確定」逆轉?

UPDATE:閱讀下面的答案後:

  1. 我是否理解正確的話,所有我 需要我的情況做的是問題 一個命令git reset --hard HEAD^
  2. 如何確認逆轉是否正確執行 ?
+2

既然你在學習git,那麼讓我給你推薦兩本書:[git community book](http://book.git-scm.com/index .html)和[pro git](http://progit.org/book/),它們都完全在線。 – shelhamer

+0

@Shelhamer謝謝! – WinWin

回答

7
  1. HEAD是最新提交的簽出的分支。
  2. master是一個分支(主分支,按慣例),而HEAD是檢出分支的歷史位置。 HEAD是相對於你所在的分支。
  3. git reset --soft將在工作樹中留下您的更改,未提交給您做任何您喜歡的事情。 git reset --hard會將工作樹恢復到您重置爲的提交時的狀態。
  4. 不需要其他命令。

首先,保持萬一以後要檢查它,做一個分支提交:(或可選擇地做git branch my_bad_commit在larsman的評論中提及)

git checkout -b my_bad_commit 

然後返回到master或任何分支你和復位:

git checkout branch_with_bad_commit 
git reset --hard HEAD^ 

HEAD ^轉化爲「與p沒有HEAD「,你甚至可以堆棧HEAD ^^ = 2提交回來。有關此主題的更多信息,請查看undo in git的git社區書籍一章

+1

'checkout -b;結賬「序列可以使用單個」分支「命令完成。 –

+0

好的一點就是提到這一點。我有很多別名,我只是'git cob new_branch_name',有時我會忘記真正的。 – shelhamer

+0

@Shelhamer同時執行'git checkout master' **和''git reset --hard HEAD ^'帶我**兩個**提交。這不是我想要的。我只需要向後退一步。我的問題中一定不清楚。 – WinWin

1
  1. HEADtip of the current branch
  2. HEADmaster之間的差異是HEAD在簽出分支(或提交)時發生了變化。
  3. --soft將保留所做的更改,因此您可以通過在更改的文件上執行git checkout來重新添加/提交或撤消它們。 --hard會將工作區域重置爲您要重置的提交狀態。
  4. 如果你reset --hard不是。您可能需要git push --force才能進行遠程回購(儘管如果您所做的更改已在遠程,則強烈建議不要重寫歷史記錄)。
+0

感謝+1。幸運的是,我還沒有推動任何事情。所以,'git reset --hard HEAD ^'一個人能爲我做詭計嗎? – WinWin

+2

如果你只想撤消最後一次提交,是的。爲了安全起見,你也可以在'git reset --hard'之前執行'git branch wrong';如果出現任何問題,你可以'git合併錯誤'來得到錯誤的提交。 –

+0

使用CVS這麼多年後的OMG,我覺得自己就像這個git世界的總菜鳥。 :) – WinWin