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 更安全。
