问题
假设我在 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]
是一个合并提交)
我删除了 test
分支,认为我已经完成了它。 然而,最终发现我在 test
上的工作有问题。 我需要修改 c3
,但不想破坏分支历史记录。
我尝试过的方法
我的尝试
我用 git checkout c3
命令切换到该提交;然后更改需要修改的内容,接着使用 git commit --amend
命令提交。然后我将 checkout
到 master
分支上,再用命令 git branch temp c3
创建一个临时分支。随后,我使用命令 git rebase --preserve-merges temp
进行变基操作:这会引起合并冲突,我需要修复它,并使用命令 git add <file>
以及 git rebase --continue
来继续操作。
然而,当我使用 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
。(如果我误解了您的答案,请纠正我,Tim。)使用git log --oneline --graph
命令得到的分支历史如下:
* [c5]
|\
| * c3'
|/
* c2
* c1
[c5']
是一个新的合并提交。(顺便说一下,我不介意它是新的。)
git checkout c3
会进入“分离头指针”状态,不建议在此状态下进行修改。如果您想修改提交历史记录,应使用git rebase -i
。 - gzh