如何合并同一Git仓库中两个asm.py的提交历史并关联至dir/asm.py
实现方案
你可以根据仓库协作场景选择以下两种方案之一:
方案1:不修改现有提交历史(适合多人协作仓库)
该方案无需调整已有的提交记录,仅通过Git自带的复制/重命名检测能力即可追溯完整历史:
- 提交C中两个
asm.py的内容完全匹配,你可以先正常提交删除根目录./asm.py的变更,后续使用以下命令查看dir/asm.py的完整历史:
参数说明:git log --follow --find-copies=100% dir/asm.py--follow:开启文件重命名/复制历史跟踪--find-copies=100%:检测内容100%匹配的文件复制行为,刚好匹配提交C的场景
方案2:重写提交历史(适合单人开发/可同步强制更新的仓库)
该方案修改提交历史后,无需额外参数即可直接查看dir/asm.py的完整提交链路:
- 先切换到master分支并同步最新代码,确保本地工作区无未提交变更:
git checkout master git pull - 通过
git log --oneline找到提交C的父提交(即提交B)的哈希值,启动交互式rebase:git rebase -i <提交B的哈希值> - 在弹出的编辑界面中,将提交C对应的行开头的
pick修改为edit,保存退出,此时rebase会暂停在提交C的位置。 - 修改提交C的内容,将「新增
dir/asm.py」的行为改为「移动./asm.py到目标路径」,让Git识别为文件重命名:# 撤销提交C的原有变更 git reset HEAD^ # 执行文件移动操作 git mv asm.py dir/asm.py # 如果提交C包含其他变更,此时执行git add添加对应变更即可 # 复用原提交C的提交信息生成新提交 git commit -C HEAD@{1} # 继续完成剩余的rebase流程 git rebase --continue - 重写完成后验证历史,此时不需要加额外参数就能看到完整的提交链路:
git log dir/asm.py - 如需推送到远程仓库,使用强制推送命令:
注意:多人协作场景下需提前通知所有协作者将本地master分支rebase到远程新的master分支,避免历史冲突。git push --force origin master
两种方案操作完成后,根目录的./asm.py可直接删除提交,不会影响dir/asm.py的历史追溯能力。
内容的提问来源于stack exchange,提问作者Fedja
相关产品推荐
相关产品推荐

