最终将使用哪个版本的git文件:LOCAL,BASE还是REMOTE?

tsu*_*nka 166 git meld git-merge

当有一个collison期间git merge,我打开一个名为Meld的合并工具.它打开三个文件LOCAL,BASE和REMOTE.正如我读过LOCAL是我的本地分支,BASE是共同的祖先,REMOTE是要合并的分支.

现在问我的问题:最终会使用哪个版本的文件?是REMOTE吗?如果是这样,我可以根据需要编辑它,不管BASE分支中的内容是什么?

Fab*_*aux 139

这是中间人:BASE.

事实上,BASE不是共同的祖先,而是冲突标记为>>>>和的半完成合并<<<<.

您可以在meld编辑窗口的顶部看到文件名.

请参见此处的屏幕截图

融合基地

您可以BASE根据需要使用或不使用meld命令编辑文件.
你也可以摆脱融合,只需用你喜欢的文本编辑器编辑文件.

  • <<<< HEAD=====标记之间的代码是合并之前的本地文件之一.
  • ====和之间的代码>>>> <branch name>是远程文件之一.

  • 当我与Meld合并时,我在中间窗格中看不到任何`<<<<<<<,`======`或者`>>>>>>`标记(即BASE)版本); 有时,中间窗格将是空的,就像aGr报道的那样.也许这种差异是由于不同的设置.当我启动Meld工具时,将存在以下文件,假设存储库中文件的名称是`X.java`:`X.java`,`X.java.orig`,`X.java.BACKUP .#`,``X.java.BASE.#`,`X.java.LOCAL.#`,`X.java.REMOTE.#`,其中`#`是一些数字.调用合并结果BASE版本令人困惑; 合并会更好. (10认同)
  • 如果将"merge.conflictstyle"配置选项设置为`diff3`而不是默认的`merge`,有些人会更好地理解自动合并失败的文件中的冲突块. (3认同)
  • 我实际上看不到HEAD,<<<和===唱歌.在您提供的情况下,中间窗口将为空.但这只是其他人的笔记,对你的答案来说. (3认同)
  • BASE实际上是共同的祖先,MERGED是具有部分合并信息的文件的名称.请参阅我的问题和答案[设置并使用Meld作为您的git difftool和mergetool](http://stackoverflow.com/questions/34119866/setting-up-and-using-meld-as-your-git-difftool-和 - mergetool),它解释了它是如何工作的.HTH. (3认同)

小智 106

Meld 通过传递第4个参数激活隐藏的3向合并功能:

meld $LOCAL $BASE $REMOTE $MERGED
Run Code Online (Sandbox Code Playgroud)

右窗格和左窗格以只读模式打开,因此您不会意外地合并错误的方式.中间窗格显示合并的结果.对于冲突,它显示基本版本,以便您可以看到所有重要位:中间的原始文本和两侧的冲突修改.最后,当您按下"保存"按钮时,会写入$ MERGED文件 - 与git完全一样.

我使用的〜/ .gitconfig文件包含以下设置:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED
Run Code Online (Sandbox Code Playgroud)

这打开了3个选项卡,包含我正在尝试合并的简单差异的第1和第2个选项卡,默认情况下打开的第3个选项卡显示3向合并视图.

现在,隐藏功能的原因是它还不够精致.它现在非常有用,但是合并作者Kai Willadsen指出几个需要熨烫的皱纹.例如,没有用于启动3向合并模式的GUI,命令行语法有点晦涩,等等.如果你说python并且有时间在手上 - 你知道该怎么做.

编辑:在较新版本的Meld中,synax略有改变.这是在评论中,但它属于答案.

meld命令现在使用--output选项,因此上面代码段的最后一行应该是:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
Run Code Online (Sandbox Code Playgroud)

  • 在最新的meld(版本> 1.8.4)中,我们必须使用--auto-merge选项.cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE --auto-merge $ LOCAL $ BASE $ REMOTE --output $ MERGED (12认同)
  • @Jesse,@ llbric,似乎较新版本的meld使用标志`--output`来获得$ MERGED结果.我在查看我的git版本附带的meld启动脚本时发现了这个:https://github.com/git/git/blob/master/mergetools/meld (7认同)
  • 我和使用Meld 1.8.4的@pingpongboss有同样的问题:Meld在一个单独的窗格中打开东西,而不是打开第三个选项卡.终于正常工作的命令是:`cmd = meld $ LOCAL $ BASE $ REMOTE --auto-merge --output $ MERGED`.因此,这将打开3个选项卡(旧的方式),自动将非冲突的合并合并到中间,其中中间是$ MERGED,并将用作冲突解决输出. (6认同)
  • 输出的语法可能是`--output = <file>`或`-o <file>`,参见`meld --help` (2认同)

use*_*631 54

涉及4个文件:

  1. $LOCAL您要合并的分支上的文件; 在向您显示合并过程时未触及

  2. $REMOTE您要合并的分支上的文件; 在向您显示合并过程时未触及

  3. $BASE$ LOCAL和$ REMOTE的共同祖先,即.两个分支开始转移所考虑的文件的点; 在向您显示合并过程时未触及

  4. $MERGED部分合并的文件,有冲突; 这是合并过程中唯一触及的文件,实际上,从未向您显示过meld


$MERGED文件是包含了一个<<<<<<,>>>>>>,=====(和,也许,||||||)标志(即划定冲突).是您手动编辑以更正冲突的文件.

手动冲突编辑和视觉冲突编辑在不同的文件上完成,并呈现不同的信息.

当使用合并工具(假设meld),即看到在其中的文件是:$LOCAL,$BASE,$REMOTE.请注意,您没有看到该$MERGED文件,尽管这是作为隐藏参数传递的,meld以便在那里写入编辑结果.

换句话说,在meld中间,您正在编辑文件,$BASE文件,并从左侧或右侧手动选择所有更改.这是一个干净的文件,合并过程没有触及.唯一的故障是,当你保存时,你不会保存到$BASE文件中,而是保存在第四个隐藏参数中meld,即$MERGED文件(你甚至看不到).该$BASE文件并没有包含任何冲突或部分成功的合并,因为它不是$MERGED文件.

在可视化编辑中,当向您呈现$BASE文件(而不是$MERGED文件)时,git基本上丢弃所有尝试进行合并(这些尝试在$ MERGED文件中可见,如果您需要)并让您完全进行合并从头开始.

最重要的是,在手动和视觉合并冲突中,您不会查看相同的文件,但最终结果将写入同一文件(即$MERGED文件).

冲突的手动校正上完成$MERGED,因为git 没有平均值为您呈现三个文件,所以它从瓜类三个文件(信息$LOCAL,$BASE,$REMOTE)在该$MERGED文件中.

但可视化工具有办法给你看三个文件:他们给你的$LOCAL,$BASE,$REMOTE文件.您正在从$LOCAL$REMOTE文件中选择更改,并将这些更改带入$BASE文件,完全重新构建甚至覆盖合并$MERGED文件的失败尝试.


Saa*_*lik 15

Cosmin的解决方案有效,但$ BASE文件已更新 - 而非$ MERGED.这将更新$ MERGED文件:

MELD: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE
Run Code Online (Sandbox Code Playgroud)

  • 在我的meld版本中 - 3.11,这个命令效果很好:`cmd = meld --auto-merge --output $ MERGED $ LOCAL $ BASE $ REMOTE` (3认同)

lum*_*ric 13

使用Meld 1.7,Tomek Bury的解决方案不再适用.

默认设置并不能满足我:

默认设置

相反,对于Meld> = 1.7,我建议使用另外两种解决方案之一.

第一个解决方案:

 meld $LOCAL $BASE $REMOTE --auto-merge
Run Code Online (Sandbox Code Playgroud)

第一解决方案

二解决方案:

 meld $LOCAL $MERGED $REMOTE
Run Code Online (Sandbox Code Playgroud)

第二解决方案

的.gitconfig

将其复制并粘贴到您的.gitconfig文件中以获得上述解决方案:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local
Run Code Online (Sandbox Code Playgroud)

.gitconfig.local如果您在多台计算机上使用.gitconfig,请将此文件复制并粘贴到文件中以仅为此计算机设置meld17或meld16:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17
Run Code Online (Sandbox Code Playgroud)

  • 您的"第一"和"第二"解决方案具有相同的命令. (5认同)

Tho*_*ard 11

我发现没有显示任何默认文件.MELD被显示$LOCAL,$REMOTE$BASE在默认情况下.为了使它工作,我需要制作融合表演$MERGED而不是$BASE.把这个放在我的~/.gitconfig修复中:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"
Run Code Online (Sandbox Code Playgroud)

我正在使用Arch,其中:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1
Run Code Online (Sandbox Code Playgroud)