Git如何创建提交内容相同但哈希独立的分支完整副本?
快速创建独立提交副本分支的实现方法
你需要的分叉提交结构不需要手动逐笔重提,Git自带的原生命令就能直接实现,全程不会改动原有main分支的任何提交内容。
实现原理
你担心的共有提交被修改影响备份分支的问题,本质是因为Git默认会复用哈希一致的提交对象,只要让Git把B到E的所有提交重新生成独立的提交对象(哪怕内容、提交信息完全一致),两个分支除了根提交A之外就不会有其他关联,修改任意分支的历史提交都不会互相影响。
操作步骤
- 先获取提交A的哈希值,可在main分支下执行
git log --oneline查看历史提交列表,复制A对应的哈希串。 - 基于提交A创建并切换到新分支
main-copy:
git switch -c main-copy <提交A的哈希值>
- 执行带
--no-ff参数的rebase命令,强制重放main分支上A之后的所有提交,生成全新的独立提交副本:
git rebase --no-ff main
执行完成后,用git log --oneline --graph --all查看提交结构,就能得到你预期的效果:
* E (HEAD -> main) 提交E说明 * D 提交D说明 * C 提交C说明 * B 提交B说明 | * E' (main-copy) 提交E说明 | * D' 提交D说明 | * C' 提交C说明 | * B' 提交B说明 |/ * A 提交A说明
其他可选方案
如果你更习惯用cherry-pick,也可以在切到A点的main-copy分支后,执行区间拣选命令实现相同效果:
git cherry-pick <提交B的哈希值>^..<提交E的哈希值>
这个命令会把B到E区间的所有提交逐笔应用到当前分支,生成全新的B'到E'提交,效果和rebase方案一致,只是需要手动确认B和E的哈希值,操作稍繁琐。
注意:不要直接在E点执行
git branch main-copy创建分支,这种方式创建的分支和main完全共用所有提交对象,一旦修改A-B区间的历史提交,两个分支都会被改动,达不到独立备份的目的。
内容的提问来源于stack exchange,提问作者Mohamad Bakhtiari
相关产品推荐
相关产品推荐

