在Git合并冲突中,生成的BACKUP、BASE、LOCAL和REMOTE文件是什么?

178
我假设LOCAL和REMOTE文件的名称已经说明了它们各自的含义,但是BASE和BACKUP指什么呢?

4个回答

207

Git执行三向合并,找到你正在合并的两个分支的共同祖先(也称为“合并基础”)。当您在冲突上调用git mergetool时,它会产生这些文件,适合传入典型的3向合并工具。因此:

  • foo.LOCAL: 冲突“ours”的一方 - 即您的分支(HEAD),将包含合并结果
  • foo.REMOTE: 冲突“theirs”的一方 - 您正在合并到HEAD的分支
  • foo.BASE: 共同的祖先。适用于传入三向合并工具
  • foo.BACKUP: 在调用合并工具之前的文件内容,如果mergetool.keepBackup = true,将保留在文件系统中。

12
LOCAL”是“HEAD”版本中的版本。在调用“mergetool”之前,“BACKUP”是磁盘上的版本。它可能包含diff3冲突标记,并且您可能在调用“mergetool”之前对其进行了编辑。 - Edward Thomson
2
请参见此处:https://dev59.com/O2gu5IYBdhLWcg3wt5Lt - crafter
1
这是一篇很好的文章,解释了合并案例,包括三方合并:https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging - qatz
26
“LOCAL/REMOTE”这些词有点误导性,让我想到它们指的是“我的更改”/“远程更改”,但实际上在“合并到主分支”的环境中,LOCAL是目标分支,即别人的修改,REMOTE是源分支,即我的修改。 :) - TingQian LI
13
他们是...你在进行变基吗?因为在变基中,两侧会被颠倒。 - Edward Thomson
显示剩余3条评论

36

如果从在线代码库中拉取(合并)更改到本地拷贝中,你可以理解 REMOTE、LOCAL 和 BASE 分别表示:

  • REMOTE = 包含自己修改的本地文件(“在文件系统上”)
  • LOCAL = 在线代码库中的远程文件(“其他用户所做的更改”)
  • BASE = 两个文件的起点(“没有任何修改”)

enter image description here

这些术语是从在线代码库的角度来看的,'local'指的就是它。另请参阅维基百科关于三方合并的文章。

3
点赞使用图形。这些东西难以理解的原因是大多数合并工具仅使用文本。而且,CLI不能替代图表来使GIT变得更加清晰明了。我希望我能多次点赞。(有些人需要接受CLI只是众多工具之一,而不是唯一的工具,有时候它也是错误的工具。) - Russell Trahan
3
这张图使我更好地理解了如何在自己的本地版本库中进行合并。如果“远程”提交实际上是本地版本库中的提交,那么“本地”和“远程”这两个名称就很容易混淆。在Git中,有太多的名称具有多重含义。 - Russell Trahan
4
有什么变化吗?我已经测试过,本地文件包含“由我完成”的内容,远程文件包含“由他人完成”的内容。这在TortoiseGit和git mergetool中都是如此。 - bart
1
在被接受的答案中,“local” 被认为是“我们”的一方吗?有人能解释一下被接受的答案中的区别吗? - PowerPlay
1
这不是真的。本地始终是您的Git-HEAD当前指向的分支。=> 合并:
  • 基础:两个文件的起点('没有任何修改`)
  • 本地:您正在拉取的分支
  • 远程:您正在拉取的分支
- Shanakor
显示剩余2条评论

9
根据https://git-scm.com/docs/git-mergetool,当使用git mergetool调用此工具时(通过-t或--tool选项或merge.tool配置变量),配置的命令行将被调用,其中$ BASE设置为包含合并公共基础的临时文件的名称(如果可用);$ LOCAL设置为包含当前分支上文件内容的临时文件的名称;$ REMOTE设置为包含要合并的文件内容的临时文件的名称;$ MERGED设置为合并工具应将合并分辨率结果写入的文件名称。
然而,似乎重置命令和合并命令之间存在差异。
合并使用您的本地分支作为LOCAL,将要合并的分支作为REMOTE
重置使用您的本地分支作为REMOTE,并将要重置到其上的分支作为LOCAL

0

我同意@Shanakor的观点,其中一个答案是错误的。 所谓的本地或远程基本上指的是git在“检出/切换分支”方面的操作。 如果您当前在A分支,并且运行git merge B,则git在merge命令中保留在您的A分支,因此本地是A; 如果您当前在A分支,并且运行git rebase B(或rebase --onto B),则在内部,git会检出/切换到B,因此本地当然是B;

请参见:https://git-scm.com/docs/git-rebase

引用: 如果指定了<base>,则git rebase将在执行任何其他操作之前执行自动git switch。否则,它将保留在当前分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接