git撤销merge,彻底学会gitrevert的⽤法
Git 之 revert
revert 可以取消指定的某次提交内容。
当讨论 revert 时,需要分两种情况,因为 commit 分为两种:⼀种是常规的 commit,也就是使⽤git commit提交的 commit;另⼀种是 merge commit,在使⽤git merge合并两个分⽀之后,你将会得到⼀个新的 merge commit。
merge commit 和普通 commit 的不同之处在于 merge commit 包含两个 parent commit,代表该 merge commit 是从哪两个 commit 合并过来的。
在上图所⽰的红框中有⼀个 merge commit,使⽤git show命令可以查看 commit 的详细信息
➜ git show bd86846
commit bd868465569400a6b9408050643e5949e8f2b8f5
Merge: ba25a9d 1c7036f
这代表该 merge commit 是从 ba25a9d 和 1c7036f 两个 commit 合并过来的。
日语 我爱你⽽常规的 commit 则没有 Merge ⾏
➜ git show 3e853bd
commit 3e853bdcb2d8ce45be87d4f902c0ff6ad00f240a月份 英语
revert 常规 commit
使⽤git revert <commit id>即可,git 会⽣成⼀个新的 commit,将指定的 commit 内容从当前分⽀上撤除。
revert merge commit
revert merge commit 有⼀些不同,这时需要添加-m选项以代表这次 revert 的是⼀个 merge commit
但如果直接使⽤ git revert ,git 也不知道到底要撤除哪⼀条分⽀上的内容,这时需要指定⼀个 parent number 标识出"主线",主线的内容将会保留,⽽另⼀条分⽀的内容将被 revert。
如上⾯的例⼦中,从git show命令的结果中可以看到,merge commit 的 parent 分别为 ba25a9d 和 1c
7036f,其中 ba25a9d 代表 master 分⽀(从图中可以看出),1c7036f 代表 will-be-revert 分⽀。需要注意的是 -m 选项接收的参数是⼀个数字,数字取值为 1 和 2,也就是Merge ⾏⾥⾯列出来的第⼀个还是第⼆个。
韩国大学排名
我们要 revert will-be-revert 分⽀上的内容,即保留主分⽀,应该设置主分⽀为主线,操作如下:
gbx➜ git revert -m 1 bd86846
revert 之后重新上线
假设狗蛋在⾃⼰分⽀ goudan/a-cool-feature 上开发了⼀个功能,并合并到了 master 上,之后 master 上⼜提交了⼀个修改 h,这时提交历史如下:
a ->
b ->
高清晰电视c -> f -- g -> h (master)
\ /
我的歌声里歌词 曲婉婷
d ->
e (goudan/a-cool-feature)
突然,⼤家发现狗蛋的分⽀存在严重的 bug,需要 revert 掉,于是⼤家把 g 这个 merge commit revert 掉了,记为 G,如下:
a ->
b ->
c -> f -- g -> h -> G (master)
\ /
d ->
e (goudan/a-cool-feature)
然后狗蛋回到⾃⼰的分⽀进⾏ bugfix,修好之后想重新合并到 master,直觉上只需要再 merge 到 master 即可(或者使⽤ cherry-pick),像这样:
a ->
b ->
c -> f -- g -> h -> G -> i (master)
mother\ / /illustrated
d ->
高二英语练习册
e -> j -> k ---- (goudan/a-cool-feature)
i 是新的 merge commit。但需要注意的是,这不能得到我们期望的结果。因为 d 和 e 两个提交曾经被丢弃过,如此合并到 master 的代码,并不会重新包含 d 和 e 两个提交的内容,相当于只有 goudan/a-cool-feature 上的新 commit 被合并了进来,⽽ goudan/a-cool-feature 分⽀之前的内容,依然是被 revert 掉了。
所以,如果想恢复整个 goudan/a-cool-feature 所做的修改,应该先把 G revert 掉:
a ->
爱你在心口难开英文b ->
c -> f -- g -> h -> G -> G' -> i (master)
\ / /
d ->
e -> j -> k ---------- (goudan/a-cool-feature)
其中 G' 是对 G 的 revert 操作⽣成的 commit,把之前撤销合并时丢弃的代码恢复了回来,然后再 merge 狗蛋的分⽀,把解决 bug 写的新代码合并到 master 分⽀。
参考: