通常我git rebase -i master
在将分支合并到master之前压缩或修复一些提交(例如提交消息只是" refactor"),但是我可以用更大,更复杂的分支做什么那些主人和孩子在不同阶段合并了?我相信rebase适用于这个简单的场景(基于谷歌搜索):
* (newest commit)
|\
* |
| * grandchild
* |
|/
* child
|
/
|
* master (oldest commit)
但是这个呢?
* (newest commits)
|\
* |
/| * grandchild
* * |
| |/
| * child
* |
|/
|
* master (oldest commit)
有没有办法在没有大量工作的情况下简化这段历史?我只试过git rebase -i master
并且存在很多冲突(其中一些是空白的,这要归功于rerere
我认为,但有些冲突难以解决)。要清楚,这是我想要的结果(显然我们可以在master中运行追赶合并,我们将有一个线性历史记录;子分支中的最终提交数是任意的):
* (newest commit)
|
* child
|
/
|
* master (oldest commit, though newest in master)
如果这是一个重复的问题我很道歉,因为它可能是(但我找不到具体解决我的问题的问题)。
答案 0 :(得分:1)
有几个选择。
首先,rebase -i
可能工作。值得一试 - 这是git,所以如果需要你可以回到以前的状态。 (如果您在启动rebase时遇到branch-X
,并且一切都出错了,您知道(a)rebase仅更改branch-X
ref,并且(b)reflog可以是曾经把它搬回来,所以
git reset --hard branch-X@{1}
并且没有造成任何伤害。)
现在,如果以某种特定的方式失败,或者似乎难以做到正确,那么这就是一个更明智的(和IMO更好)问题的起点。
那就是说,我认为对于这个特殊情况,它可能更容易做到
git checkout child
git merge --squash branch-X
git commit
git branch -f branch-X
作为"壁球合并"就是用一次提交来替换合并中涉及的任何拓扑结构。
请注意,无论采用哪种方式 - 实际上任何方式,这样做 - 如果您要更换的提交已被推送到远程,那么最佳做法就是不要这样做。这通常被称为关于变基的警告,但它适用于任何修改历史的操作。