[英]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上的所有提交。 这意味着您将获得类似:
现在,Git很聪明地不复制已经存在的提交。 显然,如果您更改了X,Y和Z,然后又进行了一次提交,则Git只忽略了以后的提交,因为这些更改已经存在。
但是,麻烦的是您对提交4的更改。结果是,此后的所有提交都提交给不同的代码集。 这就留下了进行大量合并的潜在必要性。
使用--on可以解决此问题,因为它允许您使用其他基础。 您说的是:“我不在乎commit_4(因为我更改了它),也不在乎commit_5,_6和_7(因为我已经合并了它们,并且它们基本上与主题分支中的相同)。因此,从commit_8开始,在我已经处理过的内容的基础上,仅基于这些更改。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.