我可以删除一个git提交,但保留更改

在我的一个开发分支中,我对代码库做了一些修改。 在我能够完成正在工作的function之前,我必须将当前的分支切换到主要的function。 但只是使用“git checkout master”保存了我在开发分支中所做的更改,从而破坏了master中的一些function。 所以我所做的是在提交消息“临时提交”的情况下在我的开发分支上提交更改,然后签出演示的主数据。

现在,我已经完成了演示,回到了我的开发分支,我想删除我做的“临时提交”,同时仍然保留我所做的更改。 那可能吗?

这很简单:

 git reset HEAD^ 

没有 – --soft--soft git reset会将HEAD指向指定的提交,而不会更改任何文件。 HEAD^引用你当前提交的(第一个)父提交,在你的情况下是临时提交之前的提交。

请注意,另一个选项是继续进行,然后在下一个提交点运行:

 git commit --amend [-m … etc] 

这将代替编辑最近的提交,具有与上述相同的效果。

请注意,如果您已将错误提交推送到其他人可能已将其拉下的地方,则此问题(与几乎每个git答案一样)都可能导致问题。 尽量避免这种情况

有两种处理方法。 哪个更容易取决于你的情况

重启

如果你想摆脱的提交是最后一个提交,并且你还没有做任何额外的工作,你可以简单地使用git-reset

 git reset HEAD^ 

在您当前的HEAD之前将您的分支恢复到提交。 但是,它实际上并没有改变工作树中的文件。 因此,该提交中的更改显示为已修改 – 就像是“uncommit”命令一样。 事实上,我有一个别名来做到这一点。

 git config --global alias.uncommit 'reset HEAD^' 

然后你可以在将来使用git uncommit来备份一个提交。

挤压

压缩提交意味着将两个或更多提交合并为一个提交。 我经常这样做。 在你的情况下,你已经完成了一半的function,然后你将完成它,并再次提交适当的,永久的提交信息。

 git rebase -i <ref> 

我在上面说过,因为我想说清楚这可能是任何数量的提交。 运行git log并find你想摆脱的提交,复制它的SHA1并用它来代替。 Git会带你进入交互式的rebase模式。 它会显示您当前状态和您replace的所有提交。 所以如果是10提交前,它会显示你所有10提交。

在每个提交前面,都会有pick 。 find你想摆脱的提交,并从pick修改或squash 。 使用fixup只需放弃提交消息并将更改合并到列表中的其前一个紧前面。 squash关键字执行相同的操作,但允许您编辑新组合提交的提交消息。

请注意,当您退出编辑器时,提交将按照它们在列表中显示的顺序重新提交。 所以如果你做了一个临时提交,然后在同一个分支上做了其他的工作,并在稍后的提交中完成了这个function,那么使用rebase就可以重新sorting提交并压缩它们。

警告:

重新编辑修改历史logging – 不要这样做任何提交你已经与其他开发者分享。

积攒

在将来,为了避免这个问题,可以考虑使用git stash临时存储未提交的工作。

 git stash save 'some message' 

这将把你当前的变化存储在隐藏列表中。 上面是隐藏命令最明确的版本,允许评论来描述你正在存储的东西。 你也可以简单地运行git stash而不是别的,但是不会存储消息。

你可以浏览你的藏匿名单…

 git stash list 

这将显示你所有的藏品,他们做了什么分支,消息和每行的开始,这个stash@{#}标识符看起来像这个stash@{#} ,其中#是它在stash@{#}中的位置。

要恢复一个存储(可以在任何分支上完成,而不pipe最初创build存储的位置),只需运行…

 git stash apply stash@{#} 

再次,#是在窗口数组中的位置。 如果你想恢复的藏匿处在0位置 – 也就是说,如果它是最近的藏匿处。 然后你可以运行命令而不指定隐藏位置,git会假设你是最后一个: git stash apply

所以,例如,如果我发现自己在错误的分支上工作 – 我可能会运行以下命令序列。

 git stash git checkout <correct_branch> git stash apply 

在你的情况下,你多了一些分支,但同样的想法仍然适用。

希望这可以帮助。

是的,你可以删除你的提交而不删除更改:git reset @〜

还有一种方法可以做到这一点。

在临时提交的顶部添加提交,然后执行:

 git rebase -i 

要合并两个提交到一个(命令将打开具有明确指示的文本文件,编辑它)。

就我而言,我已经推到回购。 哎哟!

您可以通过执行以下操作来恢复特定的提交,同时保留您的本地文件中的更改:

 git revert -n <sha> 

这样我就能够保留我所需要的更改,并且解除了已经被推送的提交。