【问题标题】:Git: How to Undo commit *and* revert to last branchGit:如何撤消提交*和*恢复到最后一个分支
【发布时间】:2011-10-01 06:29:32
【问题描述】:

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

我现在想撤消以下所有操作:

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

我发现了对git reset --softgit reset --hard 的引用,但我已经向自己证明,在不完全理解命令的情况下过早使用命令会造成真正的损害。 :)

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

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

更新:阅读以下答案后:

  1. 我是否正确理解所有我 在我的情况下需要做的是问题 单个命令git reset --hard HEAD^?
  2. 如何验证是否已撤销 执行正确吗?

【问题讨论】:

标签: git git-reset git-revert


【解决方案1】:
  1. HEAD 是签出分支的最新提交。
  2. master 是一个分支(按照惯例,主分支),而 HEAD 是签出分支的历史位置。 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 社区书籍章节

【讨论】:

  • checkout -b; checkout 序列可以使用单个 branch 命令完成。
  • 好点提一下。我有这么多别名,我只使用git cob new_branch_name,以至于我有时会忘记真实的别名。
  • @Shelhamer 同时执行git checkout master git reset --hard HEAD^ 让我返回两个 提交。这不是我想要的。我只需要倒退一个。我的问题一定有什么不清楚的地方。
  • @WinWin,如果您的主分支不包含错误提交,则可能存在一些沟通不畅(这就是为什么我说“...或您所在的任何分支”,意思是检查该分支. 如果您丢失了一些需要找回的历史记录,请使用git reflog 恢复它。它将列出以前的HEADs,您可以签出或重置。
  • @Shelhamer 感谢git reflog 提示。书籍的链接非常宝贵。不过,我需要时间来吞噬它们。我仍然不确定为什么单独使用 git reset --hard HEAD^ 是不够的(因为我真的不想保留提交。这就是重点)。
【解决方案2】:
  1. HEADtip of the current branch
  2. HEADmaster 之间的区别在于,HEAD 在您签出分支(或提交)时会发生变化。
  3. --soft 将保留更改,因此您可以通过对更改的文件执行git checkout 重新添加/提交它们或撤消它们。 --hard 会将工作区重置为您要重置的提交状态。
  4. 如果您reset --hard 则不会。您可能必须 git push --force 远程存储库(尽管,如果您所做的更改已经在远程,则强烈建议不要重写历史记录)。

【讨论】:

  • 谢谢+1。幸运的是,我还没有推送任何东西。那么,git reset --hard HEAD^ 一个人就能帮我解决问题吗?
  • 如果您只想撤消最后一次提交,可以。为了安全起见,您也可以在git reset --hard 之前执行git branch mistake;如果出现任何问题,您可以 git merge mistake 找回错误的提交。
  • OMG 用了这么多年的CVS,感觉自己就是这个git世界的菜鸟。 :)
  • 奇怪的是,我永远无法围绕 CVS 或 SVN,但切换到 Git 感觉就像回到家 ;)
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 2016-09-22
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2012-08-21
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多