在 Git 入门系列(二)- 修改管理 / 撤销操作 / 命令及区间关系 里面介绍了如何撤销,当时用到了 checkout 和 reset 命令。总结如下
- 撤销工作区修改,使用git checkout --<file>或 git checkout .
- 撤销暂存区提交,使用
git reset HEAD^
或git reset .
- 撤销 commit,使用
git reset [<mode>] [<commit>]
,
其中 mode 默认为
--mixed
,类型有
--soft
保留修改内容到暂存区(index)--mixed
保留修改内容到工作区(working dir)--hard
直接丢弃修改,回退到指定的 commit,也可以理解成,强制回退到某一版本
在
fetch
的学习中,之前的区间命令表又丰富了一些, 但是不免有些疑问,如果我提交了三次 C1-C2-C3,C2 不想要了,但是 C3 还想保留,怎么办呢,使用 reset,可以直接回到 C1,但是 C3 就没了。或者如果我已经 push 到远程仓库了,该怎么办呢?
可以看到,reset 通过把分支记录退回几个提交记录来实现撤销,但是这种“改写历史”的方法对多人协作的远程分支是没有作用,而且也无法“抽出”我们后悔的那次提交。
此时可以使用 revert
命令,revert 后会产生一次新的提交
git revert <commit>
比如在历史结构为 C1- C2 - C3 的前提下, git revert C2
,在我们要撤销的提交记录后面会多了一个新提交,这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。再应用到 C3 上。revert 结构会为 C1 - C2 - C3 - C2'
在使用 revert 命令的时候,可以看到是把 C2' 应用到 C3 上,所以这里也可能产生冲突,所以也支持 --abort
和 --continue
选项来放弃或继续操作
由于使用比较简单,就不做过多的说明了
可视化的工具对这个功能也友好,在某个 commit 上右键,就能看到“revert thjs commit”(GitHub) 或者 reverse commit(SourceTree)都表示反转的意思
revert 之后就可以把你的更改推送到远程仓库与别人分享啦
网友评论