如何从Git另一分支检出带有对应历史记录的指定文件夹?
解决方案
方案一:基于分支A构建,替换content为分支B(保留A的历史)
适合需要保留分支A中除content外所有历史记录的场景:
- 克隆分支A到本地
git clone -b branch-A <你的仓库地址> my-site cd my-site
- 拉取分支B的代码到本地仓库
如果分支B在同一个远程仓库:
git fetch origin branch-B
如果分支B在其他远程仓库:
git remote add branch-b-repo <分支B所在仓库地址> git fetch branch-b-repo branch-B
- 删除当前分支A中的content目录并提交
git rm -r content git commit -m "移除原有content目录,准备替换为分支B版本"
- 通过git subtree将分支B的content目录引入(保留B的历史)
如果分支B在origin远程:
git subtree add --prefix=content origin branch-B --squash=false
如果在其他远程(比如branch-b-repo):
git subtree add --prefix=content branch-b-repo branch-B --squash=false
执行完成后,git log content/blog/post-1.md 只会显示分支B中该文件的提交历史,仓库其他目录(根文件、src、README)的历史仍属于分支A。
方案二:反向操作(基于分支B构建,替换其他内容为分支A,不保留A的历史)
如果不需要分支A的历史记录,这个方法更简洁:
- 克隆分支B到本地
git clone -b branch-B <你的仓库地址> my-site cd my-site
- 从分支A中检出除content外的所有文件
git checkout origin/branch-A -- . ':!content'
这条命令会把分支A中除content目录外的所有文件覆盖到当前分支B的工作区。
- 提交变更
git commit -m "替换根目录、src、README为分支A版本"
此时content目录完全保留分支B的历史,其他文件是分支A的内容,且历史从本次提交开始,完全符合你不需要A历史的需求。
你之前的方法失败原因
git checkout origin/branch-b -- content:只是把分支B的content文件内容复制到分支A的工作区,本质是在分支A上做了一次修改提交,文件历史仍属于分支A。- Git worktree加软链接:Git不会追踪软链接指向的外部目录内容,执行
git log时只会读取当前分支下的软链接本身,而非链接指向的分支B内容。 - 错误的subtree命令:你之前的
git subtree add --prefix=content content content参数格式错误,正确的subtree命令需要指定远程仓库和分支,而非重复的content路径。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

