2011-07-08 82 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