我不小心犯了错误的分支。 如何删除该提交?
答案 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源代码树之外。但是通过这种方式,您可以保留最新的修改(修补)版本,该版本基于您的发行版本,而您的实际开发是针对真正的上游主版本。
所以只是为了证明:
希望这有助于某人。我的意思是改写这个,但我现在无法管理。问候。
答案 6 :(得分:2)
以下命令对我有用,所有本地提交的更改都将被删除,本地重置为与远程源/主分支相同。
git reset --hard origin