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

Win*_*Win 7 git git-revert git-reset

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

我现在想要撤消所有这样的事情:

  1. 提交完全颠倒过来(好像它从未完成过,也许从历史中删除它)
  2. 将当前工作目录(在哪里.git)恢复到某个分支(最后一个将立即执行).

我找到了对git reset --softgit reset --hard的引用,但我已经向自己证明了我可以通过过早地使用命令而不完全理解它来做真正的损害.:)

我找到了git reset手册页,但我仍然感到困惑:

  1. 什么是HEAD
  2. HEAD和之间有什么区别 * master
  3. 在我的情况(见上文),我需要使用--soft,--hard或其它(3个选项)?
  4. 我是否需要运行另一个命令(完成后git reset)来"完成"逆转?

更新:阅读以下答案后:

  1. 我是否正确理解在我的情况下我需要做的就是发出一个命令git reset --hard HEAD^
  2. 如何验证反转是否正确执行?

she*_*mer 7

  1. HEAD 是签出分支的最新提交.
  2. master是一个分支(按照惯例,主分支),而是HEAD签出分支的历史记录中的位置.HEAD是相对于你所在的分支.
  3. git reset --soft将您的更改留在工作树中,不承诺为您做任何您喜欢的事情.git reset --hard将工作树恢复到重置为提交时的状态.
  4. 不需要其他命令.

首先,要保留提交以防以后要检查它,请创建一个分支:

git checkout -b my_bad_commit
Run Code Online (Sandbox Code Playgroud)

(或者git branch my_bad_commit像莱斯曼的评论中提到的那样做.)

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

git checkout branch_with_bad_commit
git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)

HEAD ^转换为"HEAD的父级",您甚至可以将其堆叠为HEAD ^^ = 2提交回来.有关此主题的更多信息,请查看关于git中的undo的git社区书籍章节