繁体   English   中英

Git:如何编辑具有多个后代分支的旧提交?

[英]Git: How to edit old commit with multiple descendant branches?

我的git repo的历史记录如下:

* (topic2) commit_11
* (topic1) commit_10
* commit_9
* commit_8
* (HEAD, master) commit_7
* commit_6
* commit_5
* commit_4 <- I wanted to edit this commit.
* commit_3

所以我做了

git rebase -i commit_3

并更换pick通过edit在编辑commit_4。 我更正了变量名中的一些错字,然后

git add .
git commit --amend
(rename commit)
git rebase --continue

现在历史看起来像:

* (HEAD, master) commit_7.1
* commit_6.1
* commit_5.1
* commit_4.1 <- Edited commit.
| * (topic2) commit_11
| * (topic1) commit_10
| * commit_9
| * commit_8
| * commit_7
| * commit_6
| * commit_5
| * commit_4 <- Original commit.
|/
* commit_3

我想使我的历史像以前一样整洁。 我尝试过多次成功使用的方式

git checkout topic1
git rebase master

但是,在应用第一个补丁时,最终会导致冲突。 我手动解决了它们。 但是当我尝试git rebase --continue ,它告诉我“没什么可提交的”。

如何处理该问题以及其产生的原因?

(我可以自由地修改图表以指示在重新设置基准时,即使内容没有更改, 所有提交也会更改。新的提交集将具有与原始不同的阴影。)

这里最简单的解决方案是使用--onto 看一下此链接,从文本“这里是移植主题分支的方式”开始: git rebase

因此,在您的情况下,它将是:

git rebase --onto commit_7.1 commit_7 topic1

换句话说,从commit_7 之后直到(包括)topic1,获取提交,然后将它们移植到commit_7.1。

但是,您仍然可能会遇到必须手动修复的合并失败。

我建议您在执行此操作时,在topic1提交上创建一个额外的分支。 将其称为topic1old或其他名称。 这样可以更轻松地返回,以防重新定位不正确。 您只需将topic1硬重置为该提交即可。

编辑 :为什么简单的git rebase master工作不?

如果您没有其他说明,则git rebase假设您正在根据上游分支进行基础调整。

但是,从我修改图表的方式中可以看到,topic1和master不再有太多共同之处。 如果您对master进行简单的基础迁移,则topic1将尝试将所有提交都基于master上的所有提交。 这意味着您将获得类似:

  • (topic1)commit_10
  • commit_9
  • commit_8
  • commit_7
  • commit_6
  • commit_5
  • commit_4
  • (HEAD,主)commit_7.1
  • commit_6.1
  • commit_5.1
  • commit_4.1 <-已编辑的提交。
  • commit_3

现在,Git很聪明地不复制已经存在的提交。 显然,如果您更改了X,Y和Z,然后又进行了一次提交,则Git只忽略了以后的提交,因为这些更改已经存在。

但是,麻烦的是您对提交4的更改。结果是,此后的所有提交都提交给不同的代码集。 这就留下了进行大量合并的潜在必要性。

使用--on可以解决此问题,因为它允许您使用其他基础。 您说的是:“我不在乎commit_4(因为我更改了它),也不在乎commit_5,_6和_7(因为我已经合并了它们,并且它们基本上与主题分支中的相同)。因此,从commit_8开始,在我已经处理过的内容的基础上,仅基于这些更改。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM