如何用本地文件完全覆盖Git远端版本且不丢失上游提交历史?
Git 完全用本地提交覆盖上游改动且保留历史的解决方案
针对你的需求,无需手动复制文件或撤销提交,以下两种标准Git操作都可以实现「保留上游所有提交历史、最终文件完全使用本地版本、不合并上游改动」的要求:
方案1:生成线性提交历史(匹配你给出的示意图效果)
最终提交链为一条直线,你的本地提交直接接在上游最新提交之后,无合并节点:
- 先同步远端最新提交到本地(不触发合并):
git fetch origin
- 执行带策略的变基操作,强制所有变更都采用本地提交的内容,完全忽略上游文件改动:
git rebase -X theirs origin/master
说明:常规
rebase会尝试合并上下游改动,加上-X theirs参数后,变基过程中会直接采用你本地分支的文件内容覆盖上游改动,不会产生合并冲突,也不会混入上游的变更。
方案2:保留分叉合并历史
最终提交历史会明确记录上游提交、本地提交以及一次合并节点,适合需要明确标记本次覆盖操作的场景:
- 先同步远端最新提交到本地(不触发合并):
git fetch origin
- 执行带策略的合并操作,合并结果完全使用本地分支的内容,同时完整保留上游所有提交记录:
git merge -s ours origin/master
说明:
-s ours是合并专属策略,会直接忽略被合并分支(也就是远端origin/master)的所有文件改动,合并后的文件100%匹配当前本地分支的内容,同时上游的所有提交都会被计入历史,不会丢失。
两种方案操作完成后,直接执行git push origin master即可推送到远端,完全符合你的使用需求,适合高频次出现该场景的情况。
注意:操作前请确认覆盖上游改动是团队允许的操作,避免误冲其他人的有效提交。
内容的提问来源于stack exchange,提问作者dCSeven
相关产品推荐
相关产品推荐

