如何“重新打开”上一次的 Git 提交记录?

26

我在一个分支上工作,需要快速修复主干,所以我提交了我的工作进展。

现在我回到我的分支,我想回到我还没有提交过但是所有的更改已经应用并准备提交的状态(即撤销之前的提交,但我的更改不会丢失,并且在git status中显示)。

对我来说,修改以前的提交不够好,因为我想看到更改的文件和行数(这样更容易处理我的更改)。

我知道 git stash 是更好的解决方案,但现在为时已晚。 我也往往混淆(或丢失)已存储的提交,因为它们没有与分支链接。


2
执行分支的软重置:检出后,运行 git reset --soft HEAD^。这将使您的分支指向困扰您的提交之前的提交,而不会更改索引或工作树。 - jub0bs
3个回答

38

基本上有两种方法可以解决这个问题:

  1. 进行重置(在主分支 master 或者包含错误提交的任何分支上):

    git reset --soft HEAD~1
    

    HEAD~1是一个相对地址,如此处所述

  2. 继续工作并进行修改:

  3. git commit --amend
    

    在这种情况下,你假装什么都没发生,继续在你的分支上工作,并在计划进行真正提交时调用命令。你可以通过一种方式覆盖上一个提交,包括所有更改和(可选的)新消息。

    而且,仅仅是形式上的:正如你自己提到的那样,最好执行 git stash,只是为了让那些无意中看到这个答案并认为上述方法是常见实践的人知道(它不是)。


10

据我理解,您希望撤销您分支上的最新提交,同时保留提交中的所有更改并将其保持为暂存状态。

您可以尝试使用下面列出的git reset命令:

git reset --soft HEAD^

这应该会撤销你最新的提交,同时保留所有已暂存的更改。


4

你应该使用git reset HEAD~1(不使用--hard选项)。

它将完全按照你的意愿进行操作,HEAD~1在这里表示你想要从历史记录的头(顶部)开始重置一个提交。

这不会触及文件系统上的任何文件,所以Git现在将视你编辑的文件为已更改但尚未提交。


也许更好的做法是明确指定 --soft。我知道默认行为很可能不会改变,但如果真的改变了,一些答案可能就过时了。 - Willem Van Onsem
同意。但无论如何,它已经有一段时间没有更改了,因此很可能继续安全使用而不需要--soft :) - Maxim Leonovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接