如何在执行git pull --rebase时忽略上游新提交并保留本地修改?
如何在执行git pull --rebase时忽略上游新提交并保留本地修改?
兄弟,我完全懂你要的效果——不管上游那边新提交了什么,你就想死死保住自己本地的修改,相当于用你的代码直接覆盖上游的那些更新,而不是让Git费劲去做什么合并冲突处理。你之前手动备份再覆盖的方法虽然能用,但确实有点折腾,给你几个更简洁的Git命令方案,分两种常见情况说:
情况1:本地修改还没提交
如果你的改动还在工作区/暂存区,没做commit,试试这一套流程:
- 第一步,先把所有本地修改(包括你新增的未跟踪文件)暂存到Git的“临时仓库”里,确保啥都不会丢:
git stash push -u
(-u是关键参数,能把你新创建的文件也一起存进去,不会漏掉) - 第二步,拉取上游最新的提交到本地,但不做合并,先同步上游的状态:
git fetch origin
然后把本地分支硬重置到上游的最新状态:git reset --hard origin/main
(这里把main换成你的实际分支名,比如dev) - 第三步,把你刚才暂存的本地修改恢复,并且直接覆盖当前工作区的所有文件:
git checkout stash@{0} -- .
这一步就等价于你之前手动把备份文件挪回来的操作,但Git帮你自动化完成了 - 最后,要是想把这些修改正式提交到本地分支:
git add . && git commit -m "保留本地修改,覆盖上游新提交"
之后如果需要把这个状态推送到远程仓库,得用强制推送(因为你要覆盖上游的新提交),记得用更安全的--force-with-lease,别直接用--force:git push --force-with-lease origin main
情况2:本地修改已经提交到分支了
如果你已经把本地改动commit了,上游又冒出来新提交,想让你的commit直接覆盖上游的更新:
- 先拉取上游最新内容:
git fetch origin - 把本地分支软重置到上游的最新状态,这步会保留你本地的commit内容,只是把修改放回暂存区:
git reset --soft origin/main - 这时候你可以直接重新提交,相当于把你的修改“盖”在上游新提交的上面:
git commit -m "覆盖上游新提交的本地修改" - 同样,推送时用安全的强制推送:
git push --force-with-lease origin main
一步到位的粗暴方式(适合完全确定要覆盖的场景)
如果你不想搞暂存、重置这些步骤,就想直接让本地文件覆盖上游的所有新变化,也可以这么干:git fetch origin && git checkout HEAD -- . && git add . && git commit -m "本地修改覆盖上游"
之后再执行上面的强制推送命令就行。不过这个方法要谨慎,确保你真的要完全忽略上游的所有新改动。
最后提个醒:强制推送的时候一定要确认团队里没人在这个分支上干活,不然容易把别人的提交搞丢,--force-with-lease会帮你检查远程分支有没有别人的新提交,比直接--force安全太多。




