Git拉取上游更新如何排除指定文件 是否需保留源提交历史
问题答复
1. 拉取源仓库上游更新不需要保留源项目完整提交历史
你执行rm -rf .git后重新初始化仓库的操作,直接抹除了本地仓库和上游源仓库的共同提交祖先,才会触发fatal: refusing to merge unrelated histories报错。同步上游更新完全不需要引入源仓库的全量提交历史,使用浅拉取+临时分支中转的方案,仅拉取上游最新版本的文件快照即可完成同步,本地仓库只会保留你自己的提交记录,不会有冗余的上游历史。
2. 拉取上游更新时保护自定义文件/目录的操作步骤
不要直接执行git pull upstream master将上游代码直接合并到你的工作主分支,按以下流程操作即可避免自定义内容被覆盖,同时不会引入冗余历史:
- 配置上游远程仓库的浅拉取规则
如果你已经添加了upstream远程源,执行拉取时加--depth=1参数,仅拉取上游最新一次提交的文件快照,不同步所有历史提交:git fetch upstream --depth=1 - 将拉取到的上游最新代码检出到独立临时分支,避免直接改动当前工作区:
git checkout -b upstream-temp FETCH_HEAD - 切回自己的工作主分支(默认分支名通常是master或main,按你实际的分支名替换即可),先同步上游全量文件,再恢复你需要保留的自定义内容:
上述命令中最后一行的路径可以按需替换,所有你不想被上游覆盖的文件、目录都可以加在后面,执行后这些路径下的内容会完全保留你本地的修改版本,不会被上游内容替换。git checkout master git checkout upstream-temp -- . git restore --staged --worktree README.md content/ - 确认其余从上游同步的文件无异常后,正常提交变更、清理临时分支即可:
git commit -m "sync upstream latest update" git branch -D upstream-temp
补充说明
如果你之前已经通过--allow-unrelated-histories参数把上游全量历史合并到了本地仓库,可以执行以下操作清理冗余历史,不会丢失你当前的代码修改:
git checkout --orphan clean-branch git commit -m "init with current working status" git branch -D master git branch -m master
之后按上述流程同步上游即可。
内容的提问来源于stack exchange,提问作者pensivedog
相关产品推荐
相关产品推荐

