有两种处理方法。哪个更简单取决于您的情况
重启
如果要删除的提交是最后一次提交,并且您还没有做任何其他工作,则可以简单地使用 git-reset
git reset HEAD^
将您的分支带回到当前HEAD之前的提交。但是,它实际上并不会更改工作树中的文件。结果,该提交中的更改将显示为已修改-就像“取消提交”命令一样。实际上,我有一个别名可以做到这一点。
git config --global alias.uncommit 'reset HEAD^'
然后,您git uncommit
将来就可以使用它来备份一次提交。
压扁
压缩提交意味着将两个或多个提交合并为一个。我经常这样做。在您的情况下,您已提交了一半完成的功能,然后您将其完成,并使用适当的永久提交消息再次提交。
git rebase -i <ref>
我在上面说是因为我想说清楚,这可以是任意数量的提交。运行git log
并找到要删除的提交,复制它的SHA1并用它代替<ref>
。Git将带您进入交互式变基模式。它将显示您当前状态与您放置的所有内容之间的所有提交<ref>
。因此,如果<ref>
10次提交之前,它将显示所有10次提交。
在每次提交之前,都将带有单词pick
。找到您要删除的提交,并将其从更改pick
为fixup
或squash
。使用fixup
只是简单地丢弃提交消息,并将更改合并到列表中其前身。该squash
关键字做同样的事情,但是,您可以编辑提交的新合并的提交信息。
请注意,退出编辑器时,提交将按照它们在列表中显示的顺序重新提交。因此,如果您进行了一次临时提交,然后在同一分支上进行了其他工作,并在以后的提交中完成了该功能,则使用rebase可以使您对提交进行重新排序并将其压缩。
警告:
变基修改历史记录-不要对您已与其他开发人员共享的任何提交执行此操作。
藏匿
将来,为避免此问题,请考虑使用git stash
临时存储未提交的工作。
git stash save 'some message'
这会将您当前的更改存储在存储列表的侧面。上面是stash命令的最明确的版本,允许使用注释来描述要存储的内容。您也可以简单地运行git stash
,什么也没有,但是不会存储任何消息。
您可以使用...浏览藏匿清单
git stash list
这将向您显示所有存储区,它们完成了哪些分支,消息以及每一行的开头,以及该存储区的标识符,如下所示stash@{#}
,其中#是其在存储区数组中的位置。
要恢复存储(可以在任何分支上完成,而不管存储是在哪里创建的),只需运行...
git stash apply stash@{#}
同样,#是隐藏数组中的位置。如果要还原的存储区在该0
位置-也就是说,如果它是最新存储区。然后,您可以运行命令而无需指定存储位置,git会假设您的意思是最后一个:git stash apply
。
因此,例如,如果我发现自己在错误的分支上工作,则可以运行以下命令序列。
git stash
git checkout <correct_branch>
git stash apply
在您的情况下,您在分支机构周围移动了一些,但是同样的想法仍然适用。
希望这可以帮助。
git stash