背景
git 是一个庞大的工具,我们要开始扫盲一些常用的命令。回滚代码在项目中必然会遇到,下面我们介绍在 git 中如何回滚代码。
revert
假设有如下 commit 记录
A <- B <- C <- D
说明:尖头方向表示 parent 节点,及
A <- B
表示先提交了 A,再提交了 B
情况一:现在不想要 D 了
git revert hash(D)
执行命令后会让填写 message, 相当于一次 commit, 此时多了一次提交 E,如下
A <- B <- C <- D <- E(revert)
D 这次的提交不会包含在 E 里面,于是回滚成功。
回到之前,
A <- B <- C <- D
情况二:然后这次想回滚到 C(注意是回滚到 C,及 C、D 都不要了)
git revert hash(B)..HEAD
注意这个 hash 的取值,是 B, 不是 C 的 commit hash
执行命令后会让你填写 2 次 message, 最后提交记录也有两次
A <- B <- C <- D <- E(revert) <- F(revert)
回到之前
A <- B <- C <- D
情况三:然后这次想回滚 C(注意是回滚 C,及 C 不要了,但是 D 还需要),其实跟情况一是同样的
git revert hash(C)
执行命令后填写 1 次 message
A <- B <- C <- D <- E(revert)
小结:
revert hash
这个 hash 为对应想删除的 commit
revert hash..HEAD
这个 hash 对应的 commit 不会被删除,会删除到它的后一次 commit
revert
会产生新的提交,并不会真正删除 history。
reset
同样,假设有如下 commit 记录
A <- B <- C <- D
想删除到 C(及 C、D 都不要了)
git reset hash(B) --hard
注意,这里 B 的 hash,而非 C 的。
执行命令后本地的 commit history 就被干掉了
A <- B
当执行
git push
的时候,会被提示不能提交。但凡修改历史跟 origin 有冲突的,都必须强项覆盖提交,这时大胆执行
git push -f
同步到 origin.
这里 reset –hard 表示暂存区,工作区都不需要保留回滚回来的代码。如果不加,会出现这种情况,比如
git reset hash(B) --hard
, 那么删除掉的 C, D 的文件会进入工作区。
小节: