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


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

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

然后选择提交到其他分支

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

不要删除它:因为只有一个提交git就足够了。

但是如果你在错误的分支上提交了几次,这就是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重置——硬切,还可以用下面的命令:

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

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

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

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

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

现在您有了一个应用更改的分支,让我们称其为“topic”。

现在你将创建一个主题分支的副本,然后将其重新基于位于分支"dump"中的源代码转储:

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

现在,您的更改将基于“dump”的起点重新应用到分支topic_duplicate中,但只应用自“master”以来发生的提交。所以你的改变,因为master现在重新应用在“dump”的顶部,但结果在“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”后进行选择。

我想说的是,如果你想要基于不同的祖先更新当前的“副本”分支,你必须首先通过git重置删除之前的“cherrypicsed”提交——hard <last-commit-to-retain>或git branch -f topic_duplicate <last-commit- retain>,然后通过重基或樱桃选择复制其他提交(从主主题分支)。

重基只适用于已经有提交的分支,所以每次需要重复主题分支时都需要重复主题分支。

采摘要容易得多:

git cherry-pick master..topic

所以整个序列将归结为:

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

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

为了证明:

Reset会让你的分支指向一个不同的提交(——hard也会检查出之前的提交,——soft会在索引中保留添加的文件(如果你再次提交,它会被提交),默认的(——mixed)不会检查出之前的提交(抹去你的本地更改),但它会清除索引(还没有为提交添加任何东西) 您可以强制一个分支指向不同的提交 你也可以在立即签出提交的同时这样做 重基工作在当前分支中的提交上 樱桃采摘意味着从不同的分支复制

希望这能帮助到一些人。我本来想重写一遍的,但是现在写不出来了。的问候。


我想知道为什么我找到的最好的答案只在评论里!(作者:丹妮丝,领先86票)

git reset --hard origin

此命令将同步本地存储库与远程存储库,从而消除您在本地所做的所有更改。 您还可以按照Cleary在评论中建议的那样,执行以下操作来获取您在原点中拥有的确切分支。

git reset --hard origin/<branch>

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

Git重置——硬源