我有一个带有源分支的项目-Branch1和两个从Branch1派生的分支,例如Branch2和Branch3。
我删除了Branch2中的一个文件,并要求将其合并到Branch1中。它已成功合并。
我对Branch3中的文件进行了更新,但是在Branch3中仍然可以看到在Branch2中删除的文件。
然后我将其成功合并到Branch1。
但是我认为Git将合并Branch3的快照,该快照仍将文件保存到Branch1。 但可惜,在第一个合并请求中删除的文件消失了。 实际上,在将Branch3合并到Branch1的过程中,git甚至没有告诉我该文件在GitLab中为diff。
我的问题是,我认为Git将始终复制Branch3的整个快照并将其合并到Branch1。
为什么没有发生?
答案 0 :(得分:2)
为了更具体一点,让我们调用在分支2 foo.txt
上删除的文件。当您将分支2合并到分支1中时,此文件现在也将在分支1上删除。由于分支机构3不会修改此文件,因此即使您合并了分支机构3,该文件仍在分支机构1上被删除。
最好的考虑方法是合并将更改从一个分支复制到另一个分支。合并时,它不会复制整个快照。但是,这仍然有点手工波动。为了获得关于git如何工作的更准确的心理模型,了解什么是提交很重要。基本上,提交是一组更改以及一些其他元数据,例如时间戳,作者的姓名等。This article提供了非常有用的深入描述。
那么一个分支就是一系列提交。当您签出分支时,git通过应用该分支上提交中的所有更改来创建其跟踪的所有文件的本地副本。合并也是如此:git merge branch1
将把branch1而不是当前分支中的所有更改应用于本地文件。
现在,更容易理解以下命令中发生的情况:
git checkout branch1
git merge branch3
由于Branch 3不会更改在Branch 1上删除的文件,因此git保持原样。 Git将仅应用分支3中尚未包含在分支1中的更改。