Git如何复制目录并保留各文件的提交历史?
保留Git文件修订历史创建新版本目录的方法
要基于已有的version2创建version3,同时保留所有文件的完整修订历史,直接复制目录再add/commit的方式行不通——Git会把version3的文件识别成全新文件,丢失和version2的历史关联。可以用下面两种方法实现:
方法一:直接复制并关联历史(适合简单目录)
- 先创建version3目录:
mkdir -p widget/version3
- 逐个复制version2的文件到version3,让Git自动关联历史:
for file in widget/version2/*; do git checkout HEAD -- "$file" -- "${file/version2/version3}" done
这个命令通过Git的检出机制复制文件,能让Git识别出version3的文件是从version2衍生而来,不会丢失历史。
- 提交变更:
git add widget/version3/ git commit -m "基于version2创建version3,保留文件修订历史"
方法二:分支过渡法(适合复杂目录结构)
如果version2下有多层子目录,用分支过渡更稳妥:
- 创建并切换到临时分支:
git checkout -b temp-version3
- 把version2的所有内容移动到version3:
git mv widget/version2/* widget/version3/
Git的移动操作会完整保留文件历史。
- 提交移动操作:
git commit -m "临时分支:迁移version2内容到version3"
- 切回你的主分支(比如main或master):
git checkout main
- 合并临时分支的变更:
git merge temp-version3 --no-ff
- (可选)删除临时分支:
git branch -d temp-version3
验证操作是否成功
提交完成后,执行git log --follow widget/version3/[具体文件名],如果能看到该文件在version2中的所有历史提交记录,就说明历史保留成功了。
内容的提问来源于stack exchange,提问作者oceanclub
相关产品推荐
相关产品推荐

