我有两个git分支。一个是"大师";他有很多材料。另一种叫做"简单"。当我最初克隆"simple"的时候从"master"中,我从"Simple"中删除了很多文件,所以"Simple"是"master"的简化版。几周后,在"simple"上完成了一些工作。当我切换到master时;分支和尝试
git merge simple
我注意到我的一些代码,但不是全部(不在"simple"分支)目前丢失。我必须重置到一个预合并的承诺来找到所有的文件
让我知道该怎么做
当Git执行合并时,它会考虑三个点:合并的两个头(在本例中是simple
和master
)和第三个点,称为合并基,它通常是这些提交的共同祖先。
如果您在合并基和头之间的一个分支上做了更改,而您没有在另一边做更改,那么该更改将包含在最终的合并中。在您的示例中,更改是删除一个文件,结果是该文件被删除。
如果你想应用从simple
到master
的更改而不包括删除的文件,那么你需要将simple
检出到另一个分支(git checkout -b temp simple
)并进行交互式重基(git rebase -i master
),排除删除文件的提交。然后,temp
将是master
的扩展,并在上面应用simple
的相关提交。然后你可以签出master
并运行git merge temp
(与--ff-only
或--no-ff
一起运行,取决于你是否想要合并提交),然后你的更改将被合并到' master '中。
如果您希望合并到master
的simple
上的所有提交都发生在删除分支simple
上的文件的提交之后,(从您的描述中听起来好像是真的),那么有一个简单的解决方案:
使用git log simple
来确定包含不希望发生在分支master
上的删除的最后一个提交ID。我们把它命名为abcd1234
。
现在,签出master
并按此顺序执行以下两次合并:
git switch master
git merge --strategy=ours abcd1234 -m "Merge branch simple without deleting files"
git merge simple
第一个merge命令告诉Git引入simple
到X
上的所有提交id,但不进行任何更改。第二次合并将合并simple
上的其他提交,这些提交具有您希望带入master
的实际更改。