繁体   English   中英

GIT将现有文件合并为“新”

[英]GIT Merging Existing File as “New”

我有两个分支, masterDevMaster

假设我们在master中有一个文件,其引用为: src/AppFiles/Submissions/CompleteSubmission.java

该文件在DevMaster存在。

从master到DevMaster的合并时,它将上面的文件检测为新文件,即使它与master中的文件相同。 这对我或我的团队根本没有意义。

编辑:另外,我在该分支上进行合并,并且即使我刚刚合并它,也仍然将所有内容检测为新的。

所有合并均基于合并基础 合并基础是被合并的两个1提交中的“最佳”公共祖先提交。 我认为,最简单的了解方法是在视觉上。 绘制两个提示提交,以及标识它们的分支名称(或使用git log --decorate --oneline --graph branch1 branch2使Git垂直执行此操作):

     J  <-- branch1



     L  <-- branch2

跟随J (代表较大的丑陋提交哈希)返回其父I ,并对L对其父K

  I--J  <-- branch1



  K--L  <-- branch2

重复直到找到两个分支上的提交:

  I--J  <-- branch1
 /
H
 \
  K--L  <-- branch2

您找到的提交是合并基础。 (并非所有合并基准都像这样整齐而简单地显示!大多数图形都令人费解。)

您可以让Git为您标识合并基础:

git merge-base --all branch1 branch2

只要您运行git merge 之前运行它,它将告诉您合并基础是什么。 (此后,两个分支名称之一指向新的合并提交 ,而合并基础只是另一个分支/提交。)如果要查看合并基础什么,请在合并后使用原始提交哈希。

一旦有了合并基础本身,合并过程就可以理解了。 Git运行两个 git diff命令:一个将合并基础提交与branch1的尖端进行branch1 ,另一个将(相同)合并基础提交与branch2的尖端进行比较。 这些差异指导Git将每个文件的每组更改组合在一起。

如果合并基础犯不具有存在于两个分支提示一些文件,那么该文件有一个add/add冲突:它在两个分支全新和Git不知道如何将两个文件合并,除非他们完全匹配。

默认自动合并的结果(一个没有选项并且不停止编辑结果的操作)完全由三个输入提交确定。 您不能仅将两个分支提示的提交相互比较! 您必须将每个分支提示提交与(公共)合并基础进行比较。


1对于章鱼合并(两个以上提交的合并),合并基础的计算方式有所不同。

@marcel首先检查文件是否被推送到远程。 在bitbucket浏览器客户端上进行验证。

因此,分支的远程版本中发生了一些有趣的事情。 我通过@Angelo Mendes和@Marek R的建议在本地进行了合并(为什么标记在此页面上不起作用?),而在本地进行的合并仅检测到单个文件更改,这正是我们所期望的。 为了解决这个问题,我将所有文件从远程分支拉到本地,删除了远程,然后将本地推到了远程。 现在,新的PR不会读取所有已经存在的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM