如何删除未推送的git提交?

我不小心提交到错误的分支。如何删除该提交?

1055576 次浏览

删除最近的提交,保留你所做的工作:

git reset --soft HEAD~1

删除你最近的提交,破坏工作

git reset --hard HEAD~1

执行git rebase -i FAR_ENOUGH_BACK并删除您不想要的提交行。

如果您想将该提交移动到另一个分支,请获取有关提交的SHA

git rev-parse HEAD

然后切换当前分支

git checkout other-branch

cherry-pick提交到other-branch

git cherry-pick <sha-of-the-commit>

不要删除它:只有一个提交#0就足够了。

但是如果你在错误的分支上有几个提交,那就是#0闪耀的地方:

假设你有这个:

 x--x--x--x <-- master\-y--y--m--m <- y branch, with commits which should have been on master

,然后您可以标记master并将其移动到您想要的位置:

 git checkout mastergit branch tmpgit checkout ygit branch -f master
x--x--x--x <-- tmp\-y--y--m--m <- y branch, master branch

,重置y分支应该在的地方:

 git checkout ygit reset --hard HEAD~2 # ~1 in your case,# or ~n, n = number of commits to cancel
x--x--x--x <-- tmp\-y--y--m--m <- master branch^|-- y branch

,最后移动您的提交(重新应用它们,实际进行新的提交)

 git rebase --onto tmp y mastergit branch -D tmp

x--x--x--x--m'--m' <-- master\-y--y <- y branch

作为参考,我相信你可以“硬切”提交从你的当前分支不仅与git重置-hard,但也与以下命令:

git checkout -B <branch-name> <SHA>

事实上,如果你不关心签出,你可以将分支设置为任何你想要的:

git branch -f <branch-name> <SHA>

例如,这将是一种从分支中删除提交的编程方法,以便将新提交复制到它(使用rebase)。

假设您有一个与master断开连接的分支,因为您从其他位置获取了源并将其转储到分支中。

您现在有一个应用了更改的分支,我们称之为“主题”。

您现在将创建主题分支的副本,然后将其重新定位到位于分支“转储”中的源代码转储:

git branch topic_duplicate topicgit rebase --onto dump master topic_duplicate

现在,您的更改将根据“转储”的起点在分支topic_duplicate中重新应用,但仅限于自“master”以来发生的提交。因此,自master以来的更改现在重新应用于“转储”之上,但结果最终在“topic_duplicate”中结束。

然后,您可以通过执行以下操作将“转储”替换为“topic_duplicate”:

git branch -f dump topic_duplicategit branch -D topic_duplicate

或与

git branch -M topic_duplicate dump

或者只是丢弃垃圾

git branch -D dump

也许你也可以在清除当前的“topic_duplicate”后进行挑选。

我想说的是,如果你想更新基于不同祖先的当前“重复”分支,你必须首先通过执行git reset --hard <last-commit-to-retain>git branch -f topic_duplicate <last-commit-to-retain>来删除先前的“Cherry的”提交,然后通过rebasing或Cherry-的方式复制其他提交(从主主题分支)。

Rebase仅适用于已经有提交的分支,因此每次要执行此操作时都需要复制主题分支。

樱桃采摘更容易:

git cherry-pick master..topic

所以整个序列将归结为:

git reset --hard <latest-commit-to-keep>git cherry-pick master..topic

当您的主题重复分支已签出时。这将从当前副本中删除先前选择的提交,并仅将“主题”中发生的所有更改重新应用于当前“转储”(不同的祖先)之上。这似乎是一种相当方便的方法,将您的开发基于“真正的”上游主机,同时使用不同的“下游”主机来检查您的本地更改是否仍然适用于该主机。或者,您可以只是生成一个diff,然后将其应用于任何Git源树之外。但通过这种方式,您可以保持基于您的发行版版本的最新修改(修补)版本,而您的实际开发是针对真正的上游主机。

只是为了证明:

  • 重置将使您的分支指向不同的提交(--hard也会检查出之前的提交,--soft会在索引中保留添加的文件(如果您再次提交,则会提交),默认值(--混合)不会检查出之前的提交(擦除您的本地更改),但它会清除索引(尚未为提交添加任何内容)
  • 你可以强制一个分支指向一个不同的提交
  • 您可以这样做,同时立即检查出该提交以及
  • rebasing适用于当前分支中存在的提交
  • 樱桃采摘意味着从不同的分支复制

希望这对某人有所帮助。我打算重写这个,但我现在无法管理。问候。

我想知道为什么我找到的最好的答案只在评论中!(Daenyth的获得86票)

git reset --hard origin

此命令将使本地存储库与远程存储库同步,从而摆脱您在本地所做的所有更改。您还可以执行以下操作来获取您在源中拥有的确切分支,正如Cleary在注释中建议的那样。

git reset --hard origin/<branch>

以下命令为我工作,所有本地提交的更改都被删除,本地重置为与远程源/主分支相同。

git重置-硬原点