gpt4 book ai didi

git - 如何删除主题 Git 分支的所有提交?

转载 作者:太空狗 更新时间:2023-10-29 14:38:20 24 4
gpt4 key购买 nike

假设我有以下历史:

   A---B---C----------D------------E master
\ /\ /
W1--X1--Y1 W2--X2--Y2
topic1 topic2

是否可以删除所有主题分支及其提交,如下所示

A-B-C-D-E 大师

最佳答案

您有几个选择可以做到这一点。

解决方案 1: Squash merge

一个解决方案是简单地使用硬重置和一些挤压 merge :

git checkout master
git reset --hard C

git merge --squash topic1
git commit -m "Rewrite D"

git merge --squash topic2
git commit -m "Rewrite E"

# Verify that the new branch is no different from the old one
git diff sha_of_old_E

这里的想法是,压缩 merge 会将主题分支(即最后一次提交)的最终状态复制到您当前的工作副本中,然后您可以在其中提交它。它有效地将一个分支压缩为一个提交。

文档

解决方案 2:交互式 Rebase

另一种方法是使用交互式 rebase 将主题分支压缩为单个提交。首先,调用 rebase

git rebase -i C

这将在您的终端中调出交互式 rebase TODO 列表编辑器。您将看到显示以下提交:

pick sha W1
pick sha X1
pick sha Y1
pick sha W2
pick sha X2
pick sha Y2

你想要做的是类似于上面的 squash merge 。您可以将主题分支压缩为单个提交,因此对于主题分支的每次提交,将后代提交压缩(或“修复”)到其父项中:

pick sha W1
squash sha X1
squash sha Y1
pick sha W2
squash sha X2
squash sha Y2

然后在 Vim 编辑器中点击 :wq 开始交互式 rebase 。我不会详细介绍接下来的步骤,因为它们已经在互联网上的其他众多资源中得到了充分的详细说明,例如 Pro Git § 6.4 Git Tools - Rewriting History - Squashing Commits。 .

您可能需要通过使用简单的差异来验证新重写的分支与之前的分支没有区别,从而再次检查您是否正确地进行了 rebase :

git diff sha_of_old_E

请注意,如果您不想为每个 squash 编辑提交消息,您可以改用“fixup”,它只会重用上一次提交的提交消息:

pick sha W1
fixup sha X1
fixup sha Y1
pick sha W2
fixup sha X2
fixup sha Y2

请注意,您还可以分别使用 sf 进行压缩和修复。

文档

关于强制推送的警告

请注意,上述两种解决方案当然都会重写您的提交历史,因此您的新提交将具有不同的 sha ID。如果您已经将旧版本的分支推送到远程,那么您需要强制推送以覆盖旧副本。如果你与其他人共享你的分支,这可能不是你想要做的事情,原因我不会在这里详细说明,因为强制推送的可能危险在许多其他在线资源中都有详细记录,例如:

关于git - 如何删除主题 Git 分支的所有提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25156653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com