Skip to content

Git 回退与远端同步,一次搞懂

提示本文发布于 4 个月前,其中信息可能已经时过境迁...

Git 回退是我见过最容易被搞混的操作之一。特别是涉及到远端同步的时候,一不小心就把事情弄得更复杂了。

本地回退

bash
# 软回退——保留修改,只移动 HEAD
git reset --soft HEAD~1

# 硬回退——丢弃修改,回到指定 commit
git reset --hard <commit-hash>

--soft 回退后,你的修改还在工作区,可以重新提交。--hard 是把工作区和暂存区都恢复到指定 commit 的状态,未提交的修改会丢失。

远端同步

如果已经 push 了,回退后需要强制推送:

bash
git push --force-with-lease

注意:--force-with-lease--force 安全,它会检查远端是否有其他人推送了新内容,防止覆盖别人的提交。

更安全的做法:revert

如果是在合作分支上,用 reset + force push 可能会影响其他人。更安全的做法是用 revert

bash
git revert <commit-hash>

revert 不会删除历史,而是创建一个"反向提交"来抵消之前的改动。这样不会改变提交历史,其他人 pull 的时候也不会冲突。

什么时候用什么

  • 自己一个人开发的分支reset --hard + --force-with-lease 没问题
  • 多人协作的分支:优先用 revert,避免强制推送
  • 只是想把暂存区的文件撤回来git restore --staged <file>
  • 想放弃工作区的修改git restore <file>

Git 回退这件事,本质就是一句话:你能确定只有你自己在改这个分支,就尽管 reset;不确定的话,用 revert 更安全。