git merge --abort
使用场景:如果两个分支 merge 时出现了冲突,临时打算取消 merge
git reset --hard head^
使用场景:如果仅仅是在本地完成了 merge 后想要撤回,可以直接将分支挪回 merge 之前的 commit
推送到远程仓库之后想要撤回
比如说,release 分支进行 QA 测试,测试通过之后会合并到 master 分支,准备进行预发布测试和上线
虽然此时你的仓库的代码都合并到了 master,但是由于服务 A 依赖于其他团队开发的服务 B,而且往往是在不同的仓库里的两个项目。负责服务 B 的小组突然发现在 QA 环境临时测试出来了一个大 bug,此时 pm 沟通了一下,评估了一下风险,决定今天取消上线,下周再上。
你的代码都合并到 master 分支了但是说不上线了,此时你是不能将不准备上线的代码留在 master 分支里的。因为如果你有其他需求在最近一两天也要上线,那也是要合并到 master 分支,如果那个需求要上线的话,master 分支会把你的那个不准备上线的功能的代码给带上线。这种情况是不能接受的!必须将本次 merge 的代码给撤回,无论是本地的还是远程的。
如果 push 到了远程仓库以后是不能在本地 reset 一下后再 push 的,因为那样会搞乱提交历史
比如此时的工作区代码如下:

master 的 log 如下:

李四将本地特性分支的代码推送到远程,merge 到 develop/001 分支,测试基于该分支拉取 release/001 分支进行测试,测试通过后 merge 到远程 master。

此时 master 的 log:

此时要求远程 master 从 767 回退到 928
#在本地
git revert -m 1 head
输入该命令后会进入编辑页面,直接保存退出即可。此时的 git tree:

此时再将本地的 master 退到远程的 master 即可将本地和远程的 master 都回退一次 commit。

从而可知,git revert 实现的效果,不是将指针往回挪动而是创建一个新的 commit。对应的代码版本跟合并之前的那个 commit 是一模一样的
衍生的问题
如果再次执行 git merge feature/001,会发现 git 不允许 merge 了。
过了一段时间后 feature/001 分支的功能已经准备好可以上线了,此时需要重新将 release 分支的代码合并到 master 分支上来,但是如果将 release 分支申请合并到 master 分支,也会发现代码并没有什么改变,不允许 merge 到 master。
这是因为 afcd281 之前的 commit,即 76714e7 是通过 merge 了 ·92809fe和 b682787 得到的,git 默认 afcd281 此时是一定含有 b682787 分支的代码的。所以 git 是不会允许你合并的。虽然由于做了 git revert -m 1 HEAD 操作,导致 afcd281 的代码此时和 b682787 的代码一样。
如果 release 分支上又和并了新开发的 commit,在将此时的代码 merge 到 master 分支时,尽管可以将此时做了修改的代码合并到 master 分支,但是仍然不会将在 b682787 commit 时修改的代码合并到 master 上。因为 git 同样认为此时的 master 分支已经包含了 b682787 commit 的代码。

而实际上,是想将 afcd281、b682787、a3bddcf 的代码都合进来。
此时需要对本地的代码再次执行
git reverst head
a90 的 commit 是对 afc 的还原,它的代码是和 767 一样的,也就是说此时 a90 的代码是包含了 f928 和 b68 的,此时再次将 release 的代码合并到远程的 master,即 a90 时,新得到的 commit 就会包含了 b68 的代码。

而且此时一般还要在 feature 分支上继续修改代码,比如又加入了一些代码。但是如果这个时候胡乱再次合并,会发现 master 分支仅仅 merge 进去了 feature 分支后来修改的那一点代码而已。 此时,要做的事情是继续对feature 分支进行修改,完成最终版本的代码。然后再次执行 git revert HEAD,将 master 分支再次进行revert,回退到之前 merge 过后的那个状态,这个状态是包含了 feature 分支 merge 进来的部分代码的,然后再次执行 git merge feature/001 ,将 feature 分支最新的修改也 merge 进来
总结
如果在本地做了 commit,同时还推送到了远程仓库,此时要撤回
直接
git revert HEAD回到上一个commit的状态,然后再次git push origin master,即可同步撤回远程仓库的commit 操作
如果是要撤回已经 push 到远程仓库的 merge 操作
在本地执行
git revert -m 1 HEAD和git push origin master,此时本地和远程的提交历史都会多一个 commit 出来,该 commi t的内容和合并之前的 master 指向的那个 commit 是一样的,同时 master 此时指向最新的那个 commit
如果后续要再次将 release 分支和 master 分支进行合并
再次在本地执行
git revert HEAD和git push origin master。即再次将 master 还原到指向一个新的 commit,该 commit 的内容与上一次 merge 后的那个 commit 一样,包含 merge 的内容。然后再次将 release 分支与 master 分支进行合并,此时可以保证 release 分支所有的内容都合并到了 master 分支
233



被折叠的 条评论
为什么被折叠?



