Git 回退
在平时使用 git 时,我们时常会遇到代码需要回退的情况,一般我们使用 git 作为代码管理的工具,我们有两种方法来回退代码:
git reset
git revert
两者的区别是,git revert 是提交一个新的版本来回退,将需要 revert 的版本内容再反向修改回去,会创建一个新的版本,不会影响之前提交的内容;而 git reset 是直接将 HEAD 向后移动了一下,直接回退到之前的版本,如果代码已经推到远端仓库,就无法再直接同步代码了。
我们时常需要 undo last commit,使用到的命令是:git reset --soft HEAD~
已推送到远端且 git reset 回退遇到的问题
举个例子,我们有 A - B - C
这样的 commit 记录,且代码已经 push 到远端。
此时需求发生变动,C 这个 commit 记录我们不需要了,需要分支回退到 B 这次 commit,我们会调用 git reset --hard B
去做,此刻 commit 记录就是 A - B
,接着我们会使用 git push --force
去将代码强推到远端,因为远端代码比本地代码新,因此要使用强推。
此时另一台机器的本地仓库是已经拉取到 C 的状态,此时 head 指向 C。执行 git pull
的时候,会将 head 指向 B,但代码并不会回到 B,仍是 C 的代码,并且会提示 Already up to date
,因为 git 看来目前的代码就是最新的。
我们这个时候需要手动执行 git reset --hard B
,将代码回滚到 B,这样就完成了一次完整的回滚。
上面这个情况是发生在单人开发的项目中。这种方法在多人协作的场景是不推荐的,多人协作的情况下要尽可能避免使用 reset
和 --force
这种行为,尽可能使用 revert
命令来执行回退,确保后续代码变更可溯源。