意外合并错误分支后如何修复 Git master 分支?
How to fix a Git master branch after accidently merging the wrong branch?
我有一个开发分支,在准备好之前不小心合并到了主分支。
因为我做错了,所以我决定恢复 Master 中的更改,以便 none 我的更改在那里。这个过程创建了一个 Revert Commit,它从 Master 中删除了我的更改。
我认为一切都很好...
一周过去了,我几乎准备好将我的分支合并回 Master。由于还有其他开发人员在其他分支上工作,我决定通过将 Master 的任何新更改合并回我的分支来更新我的 Development 分支。
这个过程似乎删除了我所有的工作。
回顾Master刚刚过来的历史,包含意外提交和恢复提交。这意味着每当我从 Master 更新我的分支时,还原提交都会删除我的大部分工作。
如何在不包括还原提交的情况下将 master 中的更改合并回我的分支?
我能想到的唯一两种可能性是:
- 遍历合并中的每个项目并尝试手动删除还原项目(我认为这是不可能正确完成的,并且完全是一场噩梦)。
- 复制我在本地所做更改的所有文件,从 Master 合并,然后尝试 copy/paste 将所有更改返回到我的分支(这可能也是一场噩梦)。
我希望有更好的自动化方法来执行此操作(我希望进行某种合并但忽略某些提交过程)。
您可以尝试 git reset --soft
保留所有本地更改,然后将其推送到 master 吗?
所以,你的情况是这样的(时间从左到右流动):
--o--o--o---M--R--o <- master
\ /
A--B--C--D--E <- devel
您已将提交 A、B 和 C 合并到 master 中,然后还原 R 中的更改,这是 A+B+C 的倒数。
当你合并两个分支时(无论你合并到哪个分支),你将得到双方的一切自上一个共同祖先.
在这种情况下,共同的祖先是 C,所以你得到 R、D 和 E。从开发人员的角度来看,这看起来 A、B 和 C 已被还原,但从 master 的角度来看就好像只有D和E发生过一样。
解决方案 1:还原还原
您可以在 master 或从 master 派生的辅助分支上还原 R。然后合并它们:
--o--o--o---M--R--o <- master
\ / \
A--B--C R' <- aux (git revert R)
\ \
D--E---M' <- devel
现在您可以将 devel 合并到 master 中了。
解决方案 2:重新设置分支的基线
您使用 git rebase --force-rebase
:
使用新提交重建 devel 分支
--o--o--o---M--R--o <- master
|\ /
| A--B--C--D--E <- (abandoned)
\
A'-B'-C'-D'-E' <- devel
现在您可以将 devel 合并到 master 中了。
解决方案 3:隐藏不需要的共同祖先(仅限专家)
你暂时建立这个历史:
--o--o--o---M--R--o <- master
\
A--B--C--D--E <- devel
通过安装嫁接来做到这一点:
git replace --graft M M^
这告诉 Git 提交 M
只有一个父项 M^
。现在您可以将 devel 合并到 master 中了。
最后,你恢复真实的历史:
git replace --delete M
[编辑:使用 git replace
而不是已弃用的移植文件。]
我有一个开发分支,在准备好之前不小心合并到了主分支。
因为我做错了,所以我决定恢复 Master 中的更改,以便 none 我的更改在那里。这个过程创建了一个 Revert Commit,它从 Master 中删除了我的更改。
我认为一切都很好...
一周过去了,我几乎准备好将我的分支合并回 Master。由于还有其他开发人员在其他分支上工作,我决定通过将 Master 的任何新更改合并回我的分支来更新我的 Development 分支。
这个过程似乎删除了我所有的工作。
回顾Master刚刚过来的历史,包含意外提交和恢复提交。这意味着每当我从 Master 更新我的分支时,还原提交都会删除我的大部分工作。
如何在不包括还原提交的情况下将 master 中的更改合并回我的分支?
我能想到的唯一两种可能性是:
- 遍历合并中的每个项目并尝试手动删除还原项目(我认为这是不可能正确完成的,并且完全是一场噩梦)。
- 复制我在本地所做更改的所有文件,从 Master 合并,然后尝试 copy/paste 将所有更改返回到我的分支(这可能也是一场噩梦)。
我希望有更好的自动化方法来执行此操作(我希望进行某种合并但忽略某些提交过程)。
您可以尝试 git reset --soft
保留所有本地更改,然后将其推送到 master 吗?
所以,你的情况是这样的(时间从左到右流动):
--o--o--o---M--R--o <- master
\ /
A--B--C--D--E <- devel
您已将提交 A、B 和 C 合并到 master 中,然后还原 R 中的更改,这是 A+B+C 的倒数。
当你合并两个分支时(无论你合并到哪个分支),你将得到双方的一切自上一个共同祖先.
在这种情况下,共同的祖先是 C,所以你得到 R、D 和 E。从开发人员的角度来看,这看起来 A、B 和 C 已被还原,但从 master 的角度来看就好像只有D和E发生过一样。
解决方案 1:还原还原
您可以在 master 或从 master 派生的辅助分支上还原 R。然后合并它们:
--o--o--o---M--R--o <- master
\ / \
A--B--C R' <- aux (git revert R)
\ \
D--E---M' <- devel
现在您可以将 devel 合并到 master 中了。
解决方案 2:重新设置分支的基线
您使用 git rebase --force-rebase
:
--o--o--o---M--R--o <- master
|\ /
| A--B--C--D--E <- (abandoned)
\
A'-B'-C'-D'-E' <- devel
现在您可以将 devel 合并到 master 中了。
解决方案 3:隐藏不需要的共同祖先(仅限专家)
你暂时建立这个历史:
--o--o--o---M--R--o <- master
\
A--B--C--D--E <- devel
通过安装嫁接来做到这一点:
git replace --graft M M^
这告诉 Git 提交 M
只有一个父项 M^
。现在您可以将 devel 合并到 master 中了。
最后,你恢复真实的历史:
git replace --delete M
[编辑:使用 git replace
而不是已弃用的移植文件。]