如何使用Git进行回滚

回滚是 Git 的杀手锏,是程序员的后悔药。那如何进行回滚呢?答案是 git revert。接下来进行一步步演示:git

  1. 经过 git init 建立仓库
  2. 而后 vi a.txt 建立一个文件,第一行写上 a,提交 gc -am 'feat: first commit'
  3. 继续 vi a.txt 建立一个文件,第二行写上 b,提交 gc -am 'fix: add b'
  4. 继续 vi a.txt 建立一个文件,第二行写上 c,提交 gc -am 'fix: add c'
  5. 继续 vi a.txt 建立一个文件,第二行写上 d,提交 gc -am 'fix: add d'

好了,此时 a.txt 的内容以下:程序员

a
b
c
d
复制代码

git log 查看历史提交记录:shell

commit 3ced7b954ec5023b827ba685a96f836bf1acefde (HEAD -> two, one)

    fix: add d

commit 873c8bdb57149fabbd533caa7c4b6ec9ac3adb6a

    fix: add c

commit 93ea0f972d591d54b07edba40a51b28486bbf9fd

    fix: add b

commit c58aa1bbb6d22f6ba19b89252a352abfea8d92c4

    feat: first commit
复制代码

到目前为止,你的提交长这样:markdown

是否是还挺好看的呢!咱们把 commit 链描述以下:spa

A -> B -> C -> D
复制代码

假如如今你想把最后一次提交 D 给回滚掉,应该如何操做呢?很简单:3d

$ git revert HEAD
复制代码

这个时候,会自动生成一次提交,默认内容为:code

Revert "fix: add d"

This reverts commit 3ced7b954ec5023b827ba685a96f836bf1acefde.
复制代码

固然,这个是能够改的,咱们先保持不动,用 :wq 保存并退出。会发现多了一次新的提交,该提交的做用就是把最后一次的提交给撤销了。orm

那若是不是撤销最后一次提交呢,中间任何一次均可以的,假如咱们要回滚 add b 那次提交,能够用:string

git revert 93ea0f972d591d54b07edba40a51b28486bbf9fd
复制代码

这个时候,你指望发生什么呢?是否是 a.txt 的内容变成了:it

a
c
d
复制代码

然而并不是如此,而是出现了冲突:

$ git revert 93ea0f972d591d54b07edba40a51b28486bbf9fd
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
error: could not revert 93ea0f9... fix: add b
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'
复制代码

会变成了这样:

revert B 那一次操做会以 A 的状态为参考基准,即比较当前的状态和 A 状态的区别,发现冲突就会提示让用户本身去解决。

若是要撤销连续的提交,能够用一个范围来表示:

git revert 93ea0f972d591d54b07edba40a51b28486bbf9fd^..HEAD
复制代码

这个时候你会发现记录变成下面这个样子了:

也就是说把 93ea0f972 和 HEAD 之间的全部提交都给按照顺序撤回了,这就是所谓的 range revert 语法:

git revert B^..D
复制代码

这样就把 B,C,D 都给revert了,变成:

A-> B ->C -> D -> D'-> C' -> B'
复制代码

这种方式,每次回滚都会生成一次新的提交。其实咱们能够加个 -n 参数把屡次合并成一次:

git revert -n 93ea0f972d591d54b07edba40a51b28486bbf9fd^..HEAD
复制代码

再看提交记录:

是否是看起来就清爽多了,再复习一下语法:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
复制代码
相关文章
相关标签/搜索