我在一个分支上工作,需要快速修复主干,所以我提交了我的工作进展。
现在我回到我的分支,我想回到我还没有提交过但是所有的更改已经应用并准备提交的状态(即撤销之前的提交,但我的更改不会丢失,并且在git status
中显示)。
对我来说,修改以前的提交不够好,因为我想看到更改的文件和行数(这样更容易处理我的更改)。
我知道 git stash 是更好的解决方案,但现在为时已晚。 我也往往混淆(或丢失)已存储的提交,因为它们没有与分支链接。
我在一个分支上工作,需要快速修复主干,所以我提交了我的工作进展。
现在我回到我的分支,我想回到我还没有提交过但是所有的更改已经应用并准备提交的状态(即撤销之前的提交,但我的更改不会丢失,并且在git status
中显示)。
对我来说,修改以前的提交不够好,因为我想看到更改的文件和行数(这样更容易处理我的更改)。
我知道 git stash 是更好的解决方案,但现在为时已晚。 我也往往混淆(或丢失)已存储的提交,因为它们没有与分支链接。
基本上有两种方法可以解决这个问题:
进行重置(在主分支 master
或者包含错误提交的任何分支上):
git reset --soft HEAD~1
HEAD~1
是一个相对地址,如此处所述。
继续工作并进行修改:
git commit --amend
在这种情况下,你假装什么都没发生,继续在你的分支上工作,并在计划进行真正提交时调用命令。你可以通过一种方式覆盖上一个提交,包括所有更改和(可选的)新消息。
而且,仅仅是形式上的:正如你自己提到的那样,最好执行 git stash
,只是为了让那些无意中看到这个答案并认为上述方法是常见实践的人知道(它不是)。
据我理解,您希望撤销您分支上的最新提交,同时保留提交中的所有更改并将其保持为暂存状态。
您可以尝试使用下面列出的git reset命令:
git reset --soft HEAD^
这应该会撤销你最新的提交,同时保留所有已暂存的更改。
你应该使用git reset HEAD~1
(不使用--hard
选项)。
它将完全按照你的意愿进行操作,HEAD~1在这里表示你想要从历史记录的头(顶部)开始重置一个提交。
这不会触及文件系统上的任何文件,所以Git现在将视你编辑的文件为已更改但尚未提交。
--soft
。我知道默认行为很可能不会改变,但如果真的改变了,一些答案可能就过时了。 - Willem Van Onsem--soft
:) - Maxim Leonovich
git reset --soft HEAD^
。这将使您的分支指向困扰您的提交之前的提交,而不会更改索引或工作树。 - jub0bs