如何线性化Git提交历史且保留所有分支的单个提交?
如何将包含合并提交的Git历史转换为保留分支单个提交的线性历史?
我明白你的需求——你想要把带有合并提交的Git历史改成完全线性的,同时还得保留功能分支上的每一个独立提交,不能把它们压缩成一个。这种情况在协作开发时很常见,尤其是当队友习惯用git pull(默认会生成合并提交)而不是变基的时候。
结合你的初始历史结构,你可以按照以下步骤操作:
步骤1:备份当前分支(可选但推荐)
在改写历史之前,先备份你的master分支,防止操作出错后无法恢复:
git branch master-backup
步骤2:将功能分支变基到master的分叉点之后
首先切换到你的功能分支:
git checkout featurebranch
然后把功能分支的提交重新应用到master分支在合并之前的最后一个提交上(也就是初始历史里的5e0c25f Modify file yet again):
git rebase 5e0c25f
执行完这一步后,featurebranch的历史就会变成线性的,紧跟在master的那几个提交之后,没有合并节点。
步骤3:将master的后续提交变基到更新后的功能分支上
切换回master分支:
git checkout master
现在你需要把master上在合并提交之后的那个修改(d667df5 Modify merged file)重新应用到更新后的featurebranch上。这里用git rebase --onto命令,指定要移动的提交范围:
git rebase --onto featurebranch 233e181
解释一下这个命令:
featurebranch:目标基点,也就是我们要把提交移动到这个分支的最新位置233e181:起始提交的前一个节点,也就是合并提交的哈希值,这个命令会把该节点之后的所有提交(这里就是d667df5)重新应用到目标基点上
步骤4:验证结果并清理(可选)
现在你可以用git log --oneline查看历史,应该就和你期望的线性结构一致了。如果不需要保留featurebranch,可以删除它:
git branch -d featurebranch
重要注意事项
- 因为你改写了Git历史,如果这个分支已经推送到远程仓库,你需要用
git push --force来覆盖远程历史。一定要提前和所有协作开发者沟通这件事,避免他们的本地历史和远程冲突。 - 执行rebase过程中可能会遇到冲突,按照Git的提示解决冲突后,用
git rebase --continue继续执行即可。
内容的提问来源于stack exchange,提问作者Neil Bartlett
相关产品推荐
相关产品推荐

