我有一个开发分支,在准备好之前我不小心将其合并到了Master分支中。
由于我这样做有误,所以我决定还原Master中的更改,以使我的所有更改均不存在。此过程创建了一个“还原提交”,从我的母版中删除了我的更改。
我认为一切都很好...
一个星期过去了,我几乎准备好将分支合并回Master。由于其他分支机构也有其他开发人员在工作,因此我决定通过将Master的所有新变更合并回我的矿山来更新自己的Development分支。
此过程似乎删除了我所有的工作。
回顾一下Master刚刚发生的事情的历史,它包含意外的提交和还原的提交。这意味着每当我从Master更新分支时,还原提交都会删除我的大部分工作。
如何将master中的更改合并回我的分支中,但不包括还原提交?
我能想到的仅有的两种可能性是:
我希望有一种更好的自动化方法来完成此操作(我希望进行某种合并,但忽略某些提交过程)。
答案 0 :(得分:3)
所以,您的情况是这样(时间从左到右):
--o--o--o---M--R--o <- master
\ /
A--B--C--D--E <- devel
您已将提交A,B和C合并到master中,然后还原了R中的更改,R是A + B + C的反函数。
合并两个分支时(合并到哪个分支都没有关系),自最后一个共同祖先起,您将从双方获得一切。
在这种情况下,公共祖先是C,因此得到R,D和E。从devel的角度来看,这看起来像是A,B和C已还原,但从master的角度来看,是好像只有D和E发生了。
您可以还原主节点或从主节点派生的辅助分支上的R。然后合并它们:
--o--o--o---M--R--o <- master
\ / \
A--B--C R' <- aux (git revert R)
\ \
D--E---M' <- devel
现在您可以将devel合并为master。
您可以使用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。
您暂时建立此历史记录:
--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
代替不推荐使用的嫁接文件。]
答案 1 :(得分:0)
您可以尝试git reset --soft
保留所有本地更改,然后将其推送到主版本吗?