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

标签 git git-reset git-revert

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

我现在想撤消所有内容:

  1. commit 完全颠倒(好像 从来没有做过,也许 也将其从历史记录中删除)
  2. 恢复当前工作目录 (其中 .git 是)到某个 分支(现在最后一个会做)。

我找到了对 git reset --soft 的引用和 git reset --hard但我已经向自己证明,在没有完全理解命令的情况下过早地使用命令会造成真正的伤害。 :)

我找到了 git reset man page但我仍然对以下问题感到困惑:

  1. 什么是HEAD
  2. 有什么区别 HEAD* master?
  3. 在我的情况下(见上文)我 需要使用--soft, --hard 或者 其他(另外 3 个选项)?
  4. 我需要运行另一个命令吗 (在执行 git reset 之后)到 “完成”逆转?

更新:阅读以下答案后:

  1. 我是否正确理解我所做的一切 在我的情况下需要做的是问题 一个命令 git reset --hard 头^?
  2. 我如何验证逆转是 正确执行?

最佳答案

  1. HEAD 是 checkout 分支的最新提交。
  2. master 是一个分支(按照惯例是主分支),而 HEAD 是已 checkout 分支在历史记录中的位置。 HEAD 与您所在的分支相关。
  3. git reset --soft 会将您的更改保留在工作树中,您可以随心所欲地执行任何操作。 git reset --hard 会将工作树恢复到您重置到的提交时的状态。
  4. 不需要其他命令。

首先,要保留提交以备日后检查,创建一个分支:

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 社区书籍章节

关于Git:如何撤消提交*和*恢复到最后一个分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624738/

相关文章:

git - Gitkraken 究竟使用什么命令来推送?

具有多个项目的服务器的 GIT 存储库布局

git - 撤消推送到文件的更改

Git:使用还原或 checkout 来撤消推送的更改?

git - 使用预提交搜索文件

eclipse - 我可以有一个既是 git 工作区又是 svn 工作区的工作区吗?

git - git reset 后,未删除无法访问的提交

git reset --soft - 它返回到 git checkout 点还是最后一个 git merge 点?

git: 你的分支和 'origin/somebranch' 有分歧 - 如何丢弃本地提交

git - 如何恢复提交的特定文件?