git - 在 master 之前恢复与旧分支的 merge

标签 git merge git-revert

这就是我的情况。 在最初从 master (M) 创建的分支 X 上,我做了一些提交。然后我打开了一个 pull 请求,一位同事 merge 到了 master。

然后,这位同事注意到了一些问题,并创建了一个分支 RB,并在该分支上将 merge 恢复到了 master。

与此同时,我在分支 X 中进行了另一次提交,该提交已被推送到原点。现在,如果我打开从 X 到 master 的 pull 请求,我会看到与我的新提交相关的 merge 冲突,但在第一次 merge 之前所做的所有更改都将被 merge 恢复完全覆盖。

X--X--X--X
       \
M-------M-----M
         \    /
         RB--RB

我该如何解决这个问题?

最佳答案

您可以使用交互式 rebase 来有选择地删除 master 中的 merge 提交,这会恢复您的所有更改。

git checkout master
git rebase -i HEAD~4

这将提示您提供如下所示的提交列表:

pick jd832ng some commit
pick bd381nv merge commit branch RB into master
pick al83mld an earlier commit here
pick f2ui2nd another earlier commit

删除包含 merge 提交的行,留下以下内容:

pick jd832ng some commit
pick al83mld an earlier commit here
pick f2ui2nd another earlier commit

现在保存此文件,并完成 rebase 。您已从 master 分支中删除了 merge 提交。

注意:

如果来自分支 RB 的 merge 提交是 master 中的最新提交,那么您可以使用以下命令删除它:

git checkout master
git reset --hard HEAD~1

这将删除 master 分支的头部。如果这恰好是 merge 提交,那么您很幸运,可以避免交互式 rebase 。另一方面,如果其他人在 merge 之上进行了提交,那么您几乎可以选择交互式 rebase 。

关于git - 在 master 之前恢复与旧分支的 merge ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32047122/

相关文章:

git - 用于使用 Homebrew 软件升级到不易受攻击的 git 版本 (CVE-2014-9390)

java - 在具有已知主键的情况下将对象持久保存在 Hibernate 中。

合并两个最大堆的算法?

git - 撤消 git 自动 merge

git - Hg 是否有相当于 git Revert/cherry-pick 的功能?

git - 如何在windows .bat目录中启动bash?

ios - 迦太基访问 token

git - 如何在一个命令中创建多个 git 分支?

python - 根据来自其他两个 DataFrame 的索引合并两个 DataFrame

git:如何还原唯一更改是修改时间戳的所有文件?