如何删除未经删除的git提交?

时间:2010-07-07 17:47:24

标签: git

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

7 个答案:

答案 0 :(得分:1402)

删除最近的提交,保留您已完成的工作:

git reset --soft HEAD~1

删除您已完成的最新提交销毁作品

git reset --hard HEAD~1

答案 1 :(得分:51)

不要删除它:只需一次提交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

答案 2 :(得分:23)

我想知道为什么我找到的最佳答案只是在评论中! by Daenyth with 86 up votes

git reset --hard origin

此命令将使本地存储库与远程存储库同步,从而消除您对本地存储库所做的所有更改。

答案 3 :(得分:11)

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

答案 4 :(得分:6)

如果要将该提交移动到另一个分支,请获取有问题的提交的SHA

git rev-parse HEAD

然后切换当前分支

git checkout other-branch

cherry-pick提交other-branch

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

答案 5 :(得分:2)

供您参考,我相信您可以&#34;硬切&#34;不仅使用git reset --hard,而且还使用以下命令提交当前分支:

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

事实上,如果您不关心结账,您可以将分支设置为您想要的任何内容:

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

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

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

您现在有一个分支,您已在其中应用了更改,我们将其称为&#34;主题&#34;。

现在,您将创建主题分支的副本,然后将其重新绑定到位于分支中的源代码转储&#34; dump&#34;:

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

现在,根据&#34;转储&#34;的起点,在分支topic_duplicate中重新应用您的更改。但只有自#&master;&#34; master&#34;以来发生过的提交。因此,自主人以来你的更改现在重新应用于&#34; dump&#34;但结果最终出现在&#34; topic_duplicate&#34;。

然后你可以替换&#34; dump&#34;用&#34; topic_duplicate&#34;通过做:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

或者

git branch -M topic_duplicate dump

或者只是放弃转储

git branch -D dump

也许你也可以在清除当前&#34; topic_duplicate&#34;之后进行挑选。

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

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

Cherrypicking更容易:

git cherry-pick master..topic

所以整个序列将归结为:

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

检出主题复制分支时。这将从当前副本中删除先前选择的提交,并重新应用&#34; topic&#34;中发生的所有更改。在你当前&#34; dump&#34;之上(不同的祖先)。这似乎是一个相当方便的方式,使您的开发基于&#34;真实&#34;上游主人,同时使用不同的&#34;下游&#34;掌握以检查您的本地更改是否仍然适用于此。或者,你可以生成一个diff,然后将它应用到任何Git源代码树之外。但是通过这种方式,您可以保留最新的修改(修补)版本,该版本基于您的发行版本,而您的实际开发是针对真正的上游主版本。

所以只是为了证明:

  • reset会使你的分支指向另一个提交( - hard也会检查以前的提交, - 软件会在索引中保留添加的文件(如果再次提交则会提交)和默认值(--mixed )不会检查先前的提交(擦除您的本地更改)但它将清除索引(尚未添加任何提交)
  • 您可以强制分支指向不同的提交
  • 您可以在立即检查该提交的同时
  • rebasing适用于当前分支中的提交
  • cherry-picking意味着从不同的分支复制

希望这有助于某人。我的意思是改写这个,但我现在无法管理。问候。

答案 6 :(得分:2)

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

git reset --hard origin