【问题标题】:Undoing a git reset to uncommited state before reset?在重置之前撤消 git 重置为未提交状态?
【发布时间】:2015-12-25 04:45:25
【问题描述】:

所以我只是在我的 master 分支上测试了一些东西,但我知道我想在开始这些测试功能之前重置/恢复到 master 上的最后一次提交。所以我立即创建了一个新分支(我们称之为testfeatures),我认为在master 分支上使用git reset --hard 不会影响它。新的testfeatures 分支是在与 master 相同的状态下创建的(因此它仍然具有所有这些测试功能),然后我签回 master。在 master 上,我使用了git reset --hard <#lastcommitidhere>。现在,这将我的主分支重置为我想要的方式,但发现它也重置了之前创建的“testfeatures”分支(创建此分支后,我在切换回主分支并重置之前没有提交任何内容)。

所以我的问题是,我将如何撤消任何分支上的重置以恢复这些测试功能?是否可以?另外,为什么重置master对我的另一个分支有影响,因为我认为它们是孤立的?

此外,“测试功能”在重置之前也没有在主分支上提交。

【问题讨论】:

  • 它无法重置您的其他分支。它们完全不相关,除非您两次运行相同的命令(每个分支一次)。 git log --graph --oneline --decorate 告诉你什么?
  • 我在主分支上的终端中运行了一次命令,它肯定会重置我的另一个分支。 git log 显示:prntscr.com/9i9zyvf413cac 提交是我重置的目标。
  • 所以现在,master和designredo指向同一个位置。你是说,在此之前,他们指向不同的位置吗? git reflog 向您展示了什么?
  • git reflog: prntscr.com/9ia0po 。在重置之前,我拥有未提交的测试功能。我创建了一个新分支(所以它在那个时候与 master 相同,在这个新分支上再次没有提交)。然后我从新分支切换回 master,并重置为我找到的最后一个提交 id。
  • 您基本上将 master 重置回它开始的位置。 reflog 显示 master 的更改与 designredo 的更改相同。没有证据表明那里发生了提交。您绝对确定您的测试更改现在不在 master 中吗?这里的证据相当有力,表明它们要么存在,要么测试更改在任何地方都不存在。

标签: git git-reset


【解决方案1】:

git 中未提交的更改不在分支上,git 不会跟踪它们。所以你基本上有一些提交的更改,git 确实跟踪,并且你做了一些额外的更改。当您创建一个新分支时,未提交的更改不会重复(即在两个分支上),因为 git 不会跟踪它们。当您通过执行重置删除更改时,它们会丢失。

实现您想要的正确方法是使用 git stash 临时保存更改,然后执行您需要的检查并使用 git apply 来恢复更改。不幸的是,在你的情况下,没有什么可以做的。

作为未来的建议,尽量不要使用 git reset --hard。有更好的选择。另一种方法是提交更改,签出旧的 HEAD,做你的事情,如果需要,做一个还原。

【讨论】:

  • 那么你的意思是,当我创建新分支时,新分支是在master的最后一个提交点创建的?我使用的是 Android Studio,所以当你创建一个新分支时,它看起来就像完全复制了所有内容。您可以在 master 中编写评论并创建一个没有任何提交的新分支,如果您在分支之间切换仍然可以看到评论。
  • 是的。当您创建一个新分支时,会发生两件事:提交的代码在新分支上出现分歧(因此,如果您在此处添加提交,您将不会在另一个分支上看到它们)但未提交的事情是相同的(即 git 确实没有修改一个特定分支的概念;它们只是对代码的修改,在你对它们做一些事情之前一直存在)。
【解决方案2】:

实际上是可以从这种情况中恢复过来的。请参阅具有非常有趣答案的相关问题: Undo git reset --hard with uncommitted files in the staging area

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2016-12-24
    • 2020-06-30
    • 2010-09-25
    • 2021-11-03
    相关资源
    最近更新 更多