git仓库中克隆文件同时保存line history / 行提交历史的方法介绍

问题介绍

在大型单体git仓库中,有时需要拷贝文件,并在原文件和新文件上继续迭代。一般情况下,简单的复制或git mv + git restore都只能保留两份文件的file history,而line history只能保留一份文件的。

这是因为git的file history关联是基于文件内容的相似度检测的,较为宽松。而line history的关联更加严格,需要检测到明确的继承关系。

如果想要都保留可参考下面的方法。

解决方法

假设在当前master分支我们想要克隆Foo文件夹。

  1. 移动原文件,建立新分支
shell 复制代码
git mv Foo Foo-clone
git checkout -b fake
git commit -m "clone Foo"

在这一步中,我们通过git mv命令让git在两次提交间确立Foo和Foo-clone的继承关系。

  1. 恢复原文件
shell 复制代码
git checkout HEAD^ -- Foo
git commit -m "restore Foo"

这一步的目的是让fake分支中Foo文件夹的内容与master分支保持完全一致,避免在第三步merge时git将Foo和Foo-clone合并。此时Foo在该分支没有上级继承。

  1. 切回master分支,合并fake分支
shell 复制代码
git switch master
git merge fake --no-ff	# 注意防止fast forward直接强推至fake

在master分支中,Foo有上级继承;在fake分支中,Foo-Clone有上级继承,因此这里通过合并分支,可以让合并后结果中两个文件夹都有上级继承,从而都保留了line history。

总结

核心原理就是根据git检测line history关联的逻辑,特意去制造两份文件的上级继承关系。

OK,要是在实操中遇到问题,欢迎留言或发邮件to fyli88@qq.com

相关推荐
楠枬1 小时前
Git 分支管理
git
奇怪的点3 小时前
git clone失败
git
WaiSaa4 小时前
Ubuntu配置Git免密操作
git·ubuntu·gitee
牛奶咖啡134 小时前
Git实践——分支管理与标签管理及git个性化配置
git·禁用 fast forward·bug分支的创建与操作·远程分支的查看与推送·拉取仓库·推送指定分支到远程仓库·标签的创建与操作
千寻girling7 小时前
五一劳动节快乐 [特殊字符][特殊字符][特殊字符]
java·c++·git·python·学习·github·php
波特率1152008 小时前
git指令学习
git·学习
Karry_6668 小时前
[特殊字符] Git 提交项目 全套命令(按顺序执行)
git
计算机安禾9 小时前
【Linux从入门到精通】第39篇:版本控制Git服务器搭建——Gitea/GitLab私有化部署
linux·服务器·git
lst04269 小时前
Git 巨大失误案例记录 (2026-05-01)
大数据·git·elasticsearch
donecoding10 小时前
Git Worktree:一个仓库同时在多个分支工作,告别 stash 地狱
git