GIT-优雅地回滚错误提交
背景:
- 日常开发中,偶尔会因为粗心而将代码提交到错误的分支上且推送到了远程。虽说这种情况可以通过写清单的方式来避免,但是如果真的遇到了,那该怎么办呢?下面写好了两种应对方式
必备知识:
GIT
有两种回退方式,分别是 git resert
与 gitrevert
git resert
方式,该方式会导致分支数据丢失,所以称它为向后回退。该方式有三种回退模式,分别是强制模式git reset --hard
、混合模式git reset --mixed
、软合并模式git reset --soft
git revert
方式,它会创建新的分支,所以称它为向前回退
解决原理:
- 将错误的提交回退到工作区,接着将修改的数据贮藏起来,最后切换分支并弹出来
情况分析:
情况一:本地的提交没有推送到远程,采用 reset 回滚
- 采用
reset
的’混合模式’进行回退,修改会退回工作区 - 我们将其存到贮藏中,切换到功能分支并弹出贮藏的内容
情况二:本地的提交已经推送到远程,采用 revert 回滚
- 采用
revert
回滚错误的提交并推送到远程。此步骤就已经完成了代码回退,但是为了拿回我们修改过的代码,就还需要进行下面的步骤(此时分支向前走了) - 采用
reset
的 强制模式 向后回退到错误那次提交 - 再采用
reset
的混合模式回退到错误提交的上一次。此时工作区保存着错误提交的所有修改代码 - 将错误提交的代码保存到贮藏中,切换到功能分支并弹出即可。
实战例子:
例子一:(未推送远程的情况)
echo '111' > '1.txt'
git add .
git commit -m'第一次提交'
echo '222' > '2.txt'
git add .
echo '333' > '3.txt'
- 强制模式下(git reset --hard): 相当于节点过后,什么都没做。
1.txt
、2.txt
、 3.txt
都没有了 - 混合模式下(git reset --mixed): 把回退点以后的修改都退回了工作区。
1.txt
、2.txt
、 3.txt
的修改都保留到了工作区 - 软合并模式下(git reset --soft): 把回退点以后操作回退到工作区(未进行任何操作)或者缓存区(add)
1.txt
与2.txt
去缓存区,3.txt
在工作区
例子二:(推送远程的情况)
echo '111' > '1.txt'
git add .
git commit -m'提交 1.txt 文件'
echo '222' > '2.txt'
git add .
git commit -m'提交 2.txt 文件'
git push
- 回滚第一次提交,那么
1.txt
文件就会被删除, 2.txt
文件保留 - 如果第一次提交的文件在后续的提交中有操作,此时就会产生冲突,解决冲突即可。
温馨提示:
revert
是回滚某一次提交,而reset
是回滚到某次提交,及从当前分支一直回滚到选定的分支- 推送到远程后采用
revert
,目的在于:①我们可能没有采用 reset
强行回退远程分支的权利;②即使我们有权利,但这期间可能存在其他同事的提交,那我们就可能重置到其他同事的提交;③采用 revert
可以看到历史的每一个版本 - 必须学习搞懂
reset
的三种模式