一篇文章搞定使用git回退提交代码
以下介绍三种回退代码的方法,和不会将提交的代码保留在工作区
方法 1:使用 git revert
(推荐,安全,会保留提交记录)
- 这个命令会创建一个新的提交来撤销之前的合并提交。因为revert不会改变现有的提交历史,所以适合公共分支,尤其是在多人协作的情况下,避免破坏他人的工作。关键点在于保留历史,安全回退,但需要处理可能的冲突。
# 切换到 sit 分支
git checkout fix
# 找到合并到 sit 的合并提交的哈希值(可通过 git log 查看)
git log --oneline --graph
# 要撤销合并提交使用 git revert -m 1 1234567
# 撤销普通提交(假设合并提交的哈希是 1234567)
git revert 1234567 # -m 1 表示保留合并前的第一条分支(fix 分支)的代码
# 推送撤销的更改到远程
git push origin sit
方法 2:使用 git reset
--
hard( 需强制推送,会覆盖提交记录)
- 这个命令会将分支指针直接回退到指定提交,丢弃之后的所有更改。由于会重写历史,强制推送会影响其他协作者,适合个人分支或尚未被他人拉取的情况。优点是彻底回退,但风险较高,可能导致代码丢失。
# 切换到 fix 分支
git checkout fix
# 找到合并前的最后一个提交哈希(假设是 1234567)
git log --oneline --graph
# 强制回退到合并前的提交(普通提交和合并提交指令一致)
git reset --hard 1234567
# 强制推送到远程(注意:会覆盖远程分支)
git push origin fix --force
方法 3:使用 git reset --mixed
(需撤销提交但保留本地修改)
- 这里使用混合模式的reset,回退提交但保留工作区的修改。适合需要撤销提交但保留本地更改的情况,比如想重新修改代码再提交。同样需要强制推送,但保留代码,适用于个人开发中的临时调整。
# 切换到 fix 分支
git checkout fix
# 找到合并前的最后一个提交哈希(假设是 1234567)
git log --oneline --graph
# 回退到上一次提交(HEAD~1),但保留工作目录的代码修改
# 该指令等同于( git reset --mixed HEAD~1)和(git reset 1234567上一次提交的hash)
# 如果你希望代码修改也保留在暂存区(即 git add 后的状态),可以用 git reset --soft HEAD~1
git reset HEAD~1
# 强制覆盖远程的 fix 分支
git push origin fix --force
三个方法对比:
方法 | 是否修改历史 | 是否保留代码修改 | 适用场景 | 风险等级 |
---|---|---|---|---|
git revert | 否 | 不保留(代码状态回退) | 公共分支(多人协作) | 低 |
git reset --hard + --force | 是 | 不保留(彻底丢弃代码) | 私有分支(需彻底回退) | 高 |
git reset HEAD~1 + --force (默认 --mixed ) | 是 | 保留(代码留在工作目录) | 私有分支(需重新修改后提交) | 中 |