Git 201 - Rolling Back

因为前一夜赶着写 Git 的 Blog,在 Check in 代码时,不小心把本地测试的修改也提交到了版本库。怎么办?这之后又做了一系列的提交,一个个文件手工改回去,看看时钟,欲哭无泪。忽然想到 Git Manual 里好像提到过一条命令。Revert,于是欢快的夜曲响起。

Revert

Revert 命令可以将某次提交的修改全部删除,然后将这些删除的改动作为一个新的变更集进行另一次 commit。

现有版本库如下,其中那条 add 2nd file 正是我不小心误作的 commit,commit 中新加入了一个名为 2nd.md 的文件。

通过 git log 命令可以看到那次修发的 SHAb762f3fc54411ee07fc31adbc03903f5c815ac9c,运行:

1
2
3
4
5
$ git revert b762f3fc54411ee07fc31adbc03903f5c815ac9c
[master bd78912] Revert "add 2nd file"
1 files changed, 0 insertions(+), 1 deletions(-)
delete mode 100644 2nd.md

可以看到,在那次的修改中所加入的 2nd.md 已经被移除掉了。再看这时的 commits:

会发现多了一条 commit,Revert "add 2nd file"。commit 的内容正是将 add 2nd file 那次添加的文件移除掉。

冲突解决

如果要被 Revert 的 commit 中包含的文件,又在后继的 commit 中被修改,这时就会产生冲突,git 会尝试自动解决,但若无法 merge 便会给出提示,让用户手工处理。

1
2
3
4
5
6
$ git revert b762f3fc54411ee07fc31adbc03903f5c815ac9c
error: could not revert b762f3f... add 2nd file
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

提交前检测或修改

若是想在恢复修改后做一些检测,甚至是修改后再进行提交。

这时可以通过 commit --amend,或直接使用 revert 的 -n or --no-commit 参数。

Git 在做完 revert 后将操作保存在本地,此时和正常的修改流程一样,通过 add, commit 命令进行提交。