git – 修改先前合并的分支的过去提交,同时保留分支历史记录

问题

说我在master上做了一些工作:

c1 <- c2
       ^
     master

在这一点上,我分支,并做更多的工作:

                test                  
                 v
          c3 <- c4
c1 <- c2 /
       ^   
     master

然后做一个git merge –no-ff( – no-ff来保持分支历史记录):

                test                  
                 v
          c3 <- c4
c1 <- c2 /        \ [c5]
                      ^   
                    master

([c5]是合并提交)

然后我删除了测试分支,认为我已经完成了它.但是,我发现,毕竟我在测试中所做的工作存在问题.我需要修改c3,但不要伤害分支历史记录.

我试过的事情

我的尝试

我git checkout c3;然后改变我需要改变的东西,然后git commit –amend.然后我检查主分支,然后git branch temp c3.然后我git rebase –preserve-merges temp:这给了我一个合并冲突,我修复了,然后git add< file>和git rebase – 继续.

但是,当我用git log –oneline –graph查看分支历史时,我看到如下内容:

*  [c5]
|\
| * c4
|/
* c3'
* c2
* c1

它应该看起来更像这样:

*  [c5]
|\
| * c4
| * c3'
|/
* c2
* c1

其中c3’是修改后的提交.

我怎样才能从git中获得这种行为?

蒂姆的建议

git checkout c3
git checkout -b test
git commit --amend
git checkout master
git reset --hard c2
git merge --no-ff test

不幸的是,这似乎不起作用,因为我们失去了c4. (请纠正我,蒂姆,如果我误解了你的答案.)git log –oneline –graph产生的分支历史记录如下:

*  [c5]
|\  
| * c3'
|/  
* c2
* c1

其中[c5′]是新的合并提交. (顺便说一下,我不介意它是新的.)

最佳答案 您可以使用交互式rebase:

git checkout master
git rebase -i c2

这应该打开一个编辑器,每次提交一行.更改c3行中的选择以进行编辑.保存并关闭.现在git将你回到c3并停在那里让你进行编辑.更改您想要更改的内容并进行修改

git commit --amend
git rebase --continue
点赞