我如何删除unpushed git提交?

我无意中犯了错误的分支。 我如何删除该提交?

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

git reset --soft HEAD~1 

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

 git reset --hard HEAD~1 

不要删除它:只有一个提交git cherry-pick就足够了。

但是如果你在错误的分支上有几个提交,那就是git rebase --onto

假设你有这个:

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

,那么你可以标记master并将其移动到你想要的地方:

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

,重置y分支应该在哪里:

  git checkout y git 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 master git branch -D tmp x--x--x--x--m'--m' <-- master \ -y--y <- y branch 

做一个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> 

为了您的参考,我相信您可以“硬切”从您当前的分支中提交,不仅使用git reset –hard,还使用以下命令:

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

事实上,如果你不关心检查,你可以设置分支到任何你想要的:

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

这将是一个程序化的方式来移除分支提交,例如,为了复制新的提交(使用rebase)。

假设你有一个从主站断开的分支,因为你已经从其他位置获取源并将其转储到分支中。

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

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

 git branch topic_duplicate topic git rebase --onto dump master topic_duplicate 

现在,您的更改将基于“dump”的起点重新应用于分支topic_duplicate中,但仅限于自“master”以来发生的提交。 所以你的改变,现在主人现在重新应用“转储”,但结果最终在“topic_duplicate”。

然后你可以用“topic_duplicate”代替“dump”:

 git branch -f dump topic_duplicate git branch -D topic_duplicate 

或与

 git branch -M topic_duplicate dump 

或者只是丢弃转储

 git branch -D dump 

也许你也可以在清除当前的“topic_duplicate”之后进行樱桃select。

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

重新激活只适用于已经有提交的分支,所以你需要复制你的主题分支,每次你想这样做。

Cherrypicking更容易:

 git cherry-pick master..topic 

所以整个序列将归结为:

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

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

所以只是为了演示:

  • 重置将使你的分支指向一个不同的提交(–hard还检出了以前的提交, – 软件保持索引中添加文件(如果你再次提交,将提交),默认( – 混合)不会检查以前的提交(擦除本地更改),但会清除索引(尚未添加任何提交)
  • 你可以强制一个分支指向不同的提交
  • 您可以立即检查该提交
  • 重新分配工作在当前分支提交
  • 樱桃采摘意味着从不同的分支复制

希望这有助于某人。 我的意思是重写这个,但现在我不能pipe理。 问候。

如果您有代码的备份(包括.git文件夹),请从最新的代码库中删除.git文件夹。 将旧的.git文件夹复制到最新的代码库。 执行git pull

注意:只有当您的时间不够用,请使用这个解决scheme,并且困惑了很多。