Git:如何撤消提交*和*恢复到最后一个分支

时间:2011-07-08 12:57:08

标签: git git-reset git-revert

哦哦......我错误地提交了一个非常复杂的更改(包括子目录和文件重命名),却不知道我在做什么(或者Git会做什么)。

我现在要撤消所有内容:

  1. 提交完全颠倒了(好像是 也许从来没有这样做过 从历史中删除它)
  2. 恢复当前工作目录 (.git所在的地方) 分支(最后一个将立即执行)。
  3. 我找到了对git reset --softgit reset --hard的引用,但我已经向自己证明过,如果没有完全理解它,过早地使用命令会造成真正的伤害。 :)

    我找到git reset man page,但我仍然感到困惑:

    1. 什么是HEAD
    2. 有什么区别 HEAD* master
    3. 在我的情况下(见上文)我 需要使用--soft--hard或 其他(另外3个选项)?
    4. 我是否需要运行另一个命令 (在做git reset之后) “敲定”逆转?
    5. 更新:阅读以下答案后:

      1. 我是否理解正确的一切 在我的情况下需要做的是问题 单个命令git reset --hard HEAD^
      2. 如何验证撤消是否正确 表现正确吗?

2 个答案:

答案 0 :(得分:7)

  1. HEAD是签出分支的最新提交。
  2. master是一个分支(按照惯例是主分支),而HEAD是签出分支的历史记录中的位置。 HEAD与您所在的分支相关。
  3. git reset --soft会将您的更改留在工作树中,不承诺为您做任何您喜欢的事情。 git reset --hard会将工作树恢复到您重置为的提交状态。
  4. 不需要其他命令。
  5. 首先,要保留提交以防以后要进行检查,请创建一个分支:

    git checkout -b my_bad_commit
    

    (或者在larsman的评论中提到git branch my_bad_commit。)

    然后返回master或您所在的任何分支并重置:

    git checkout branch_with_bad_commit
    git reset --hard HEAD^
    

    HEAD ^转换为“HEAD的父级”,您甚至可以将其堆叠为HEAD ^^ = 2提交回来。有关此主题的更多信息,请查看undo in git

    上的git社区书籍章节

答案 1 :(得分:1)

  1. HEADtip of the current branch
  2. HEADmaster之间的区别在于,当您签出分支(或提交)时,HEAD会发生变化。
  3. --soft将保留更改,因此您可以通过对更改的文件执行git checkout来重新添加/提交或撤消它们。 --hard会将工作区重置为您要重置的提交状态。
  4. 如果您reset --hard,则不是。您可能必须git push --force进行远程回购(但是,如果您所做的更改已经在远程,则强烈建议不要重写历史记录。)