git:移除未命名分支的提交

jdg4fx2g  于 2023-09-29  发布在  Git
关注(0)|答案(3)|浏览(156)

在分支和合并之后,我删除了分支,但是git图仍然显示了旧分支中的所有提交,现在是未命名的。

  1. A - B - I - J - - - - - K - L - M (master)
  2. \ /
  3. \ E - F - G - H /

我想删除提交E、F、G和H,因为旧的分支已经不存在了。
编辑
只是澄清一下,我的目标是改变师父的历史。最后的树应该是:

  1. A - B - I - J - K - L - M (master)

所以K不应该是一个3向合并提交,而是一个标准提交,J是它的父提交。
如果这是不可能的,也许我可以有以下内容:

  1. A - B - I - J - K' - L' - M' (master)
czfnxgou

czfnxgou1#

你需要重新创建合并提交作为一个压缩合并(即不是真实的的合并)。确保你没有任何未提交的更改,或者先把它们藏起来。

  1. git checkout master
  2. git reset --hard J

给你

  1. A - B - I - J (master)
  2. \ \
  3. \ - - - - - K - L - M
  4. \ E - F - G - H /

挤压合并旧分支的最后一次提交:

  1. git merge --squash H
  1. A - B - I - J - K' (master)
  2. \ \
  3. \ - - - - - K - L - M
  4. \ E - F - G - H /

然后复制真实的合并后发生的提交:

  1. git cherry-pick K..M

给你留下一个最后的历史记录:

  1. A - B - I - J - K' - L' - M' (master)
  2. \ \
  3. \ - - - - - K - L - M
  4. \ E - F - G - H /

只有来自master的提交是可访问的,所以我们可以忽略其余的:

  1. A - B - I - J - K' - L' - M' (master)
展开查看全部
disho6za

disho6za2#

您可以使用--first-parent来不查看来自未命名分支的合并。git log --oneline --graph --all --first-parent。如果你更喜欢这个序列,也许可以添加--date-order

bejyjqdl

bejyjqdl3#

您需要撤消合并,然后再次添加L和M,但您可以根据需要使用挤压合并。
这将压缩从分支到K '的所有改变。
而且,正如你正确地理解的那样,这将改变主文件的历史,这样你就需要在之后创建L'和M',然后强制推送。
历史将看起来像这样:

  1. A - B - I - J - - - - - K' - L' - M' (master)
  2. \ /
  3. \ - - - - - - - /

如果你出于任何原因根本不需要合并,你需要在J之上重定分支更改的基,这样它们就可以直接添加到主分支。使用rebase-merging,你基本上是在B和你在分支上的第一次提交之间应用I和J。之后,您可以将分支合并到main(快进),历史将如下所示:

  1. A - B - I - J - E' - F' - G' - H' - K' - L' - M' (master)

使用rebase合并master到你的分支,然后将你的分支压缩合并(快进)到master的组合,你会得到你想要的:

  1. A - B - I - J - K' - L' - M' (master)

相关问题