问题
说我在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