gpt4 book ai didi

git - 设置和使用 Meld 作为你的 git difftool 和 mergetool

转载 作者:行者123 更新时间:2023-12-01 17:18:38 32 4
gpt4 key购买 nike

尽管此问题和答案中的大部分信息都可以在 StackOverflow 上找到,但它散布在许多页面上以及其他错误或误导性的答案中。我花了一段时间才把我想知道的一切拼凑起来。

有很多不同的程序可以用作您的 git difftool 和 mergetool,并且对于哪个是最好的肯定没有共识(意见、要求和操作系统会明显不同)。

Meld 是一种流行的免费、开源和跨平台(UNIX/Linux、OSX、Windows)选择,如 StackOverflow 问题 What's the best visual merge tool for Git? 所示。 ,其中提出 Meld 的答案的票数是任何其他工具的 3 倍以上。

以下2个问题将在我的回答中得到解答:

  • 如何设置和使用 Meld 作为我的 git difftool?
  • 如何设置和使用 Meld 作为我的 git mergetool?

  • 注意:您的 difftool 和 mergetool 不必使用相同的程序,可以为两者设置不同的程序。

    最佳答案

    如何设置和使用 Meld 作为我的 git difftool?

    git difftool使用 GUI 差异程序(即 Meld)显示差异,而不是在终端中显示差异输出。

    尽管您可以使用 -t <tool> / --tool=<tool> 在命令行上设置 GUI 程序在您的 .gitconfig 中配置它更有意义文件。 [注意:请参阅底部有关转义引号和 Windows 路径的部分。]

    # Add the following to your .gitconfig file.
    [diff]
    tool = meld
    [difftool]
    prompt = false
    [difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"

    [注意:这些设置不会改变 git diff 的行为它将继续照常运作。]

    您使用 git difftool与您使用 git diff 的方式完全相同.例如
    git difftool <COMMIT_HASH> file_name
    git difftool <BRANCH_NAME> file_name
    git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name

    如果配置正确,将打开一个 Meld 窗口,使用 GUI 界面显示差异。

    Meld GUI 窗口 Pane 的顺序可以由 $LOCAL 的顺序控制。和 $REMOTEcmd ,也就是说哪个文件显示在左 Pane 中,哪个显示在右 Pane 中。如果你想要它们反过来,只需像这样交换它们:
        cmd = meld "$REMOTE" "$LOCAL"

    最后是 prompt = false行只是阻止 git 提示您是否要启动 Meld,默认情况下 git 会发出提示。

    如何设置和使用 Meld 作为我的 git mergetool?

    git mergetool允许您使用 GUI merge 程序(即 Meld)来解决 merge 期间发生的 merge 冲突。

    与 difftool 一样,您可以使用 -t <tool> / --tool=<tool> 在命令行上设置 GUI 程序。但是,和以前一样,在您的 .gitconfig 中配置它更有意义。文件。 [注意:请参阅底部有关转义引号和 Windows 路径的部分。]
    # Add the following to your .gitconfig file.
    [merge]
    tool = meld
    [mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

    您不使用 git mergetool执行实际 merge 。使用前 git mergetool您以通常的方式使用 git 执行 merge 。例如
    git checkout master
    git merge branch_name

    如果存在 merge 冲突,git 将显示如下内容:
    $ git merge branch_name
    Auto-merging file_name
    CONFLICT (content): Merge conflict in file_name
    Automatic merge failed; fix conflicts and then commit the result.

    此时 file_name将包含带有 merge 冲突信息的部分 merge 文件(即包含所有 >>>>>>><<<<<<< 条目的文件)。

    Mergetool 现在可用于解决 merge 冲突。您可以通过以下方式轻松启动:
    git mergetool

    如果正确配置了一个 Meld 窗口,将打开显示 3 个文件。每个文件都将包含在其 GUI 界面的单独 Pane 中。

    在示例中 .gitconfig上面的条目,建议将 2 行作为 [mergetool "meld"] cmd线。事实上,高级用户可以通过各种方式配置 cmd行,但这超出了本答案的范围。

    这个答案有 2 个选择 cmd它们之间的线条将迎合大多数用户,并且对于希望将该工具提升到下一个复杂级别的高级用户来说,这将是一个很好的起点。

    首先这里是参数的含义:
  • $LOCAL是当前分支中的文件(例如 master)。
  • $REMOTE是正在 merge 的分支中的文件(例如 branch_name)。
  • $MERGED是包含 merge 冲突信息的部分 merge 文件。
  • $BASE$LOCAL 的共享提交祖先和 $REMOTE , 这就是当包含 $REMOTE 的分支时的文件最初创建。

  • 我建议你使用:
    [mergetool "meld"]
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"

    要么:
    [mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
    # See 'Note On Output File' which explains --output "$MERGED".

    选择是是否使用 $MERGED$BASE中间 $LOCAL$REMOTE .

    无论哪种方式,Meld 都会显示 3 个带有 $LOCAL 的 Pane 和 $REMOTE在左右 Pane 和 $MERGED 中或 $BASE在中间 Pane 中。

    在这两种情况下,中间 Pane 是您应该编辑以解决 merge 冲突的文件。区别仅在于您更喜欢哪个开始编辑位置; $MERGED对于包含带有 merge 冲突信息的部分 merge 文件的文件或 $BASE对于 $LOCAL 的共享提交祖先和 $REMOTE . [由于两者 cmd行可能很有用,我将它们都保存在我的 .gitconfig 中文件。大多数时候我使用 $MERGED线和 $BASE行被注释掉了,但是如果我想使用 $BASE 可以交换注释掉线代替。]

    关于输出文件的注意事项:不要担心 --output "$MERGED"用于 cmd不管是否 $MERGED$BASE早先在 cmd 中使用过线。 --output选项只是告诉 Meld git 希望将冲突解决文件保存在哪个文件名中。无论您是否使用 $MERGED,Meld 都会将您的冲突编辑保存在该文件中。或 $BASE作为您的起始编辑点。

    编辑中间 Pane 以解决 merge 冲突后,只需保存文件并关闭 Meld 窗口。 Git 将自动进行更新,当前分支(例如 master)中的文件现在将包含您在中间 Pane 中结束的任何内容。

    git 将通过附加 .orig 来备份部分 merge 的文件,其中包含 merge 冲突信息。到原始文件名。例如 file_name.orig .在检查您对 merge 是否满意并运行您可能希望执行的任何测试后, .orig文件可以删除。

    此时,您现在可以执行 commit 以提交更改。

    如果在 Meld 中编辑 merge 冲突时,您希望放弃使用 Meld,则退出 Meld,而不在中间 Pane 中保存 merge 解决方案文件。 git 将回复消息 file_name seems unchanged然后问 Was the merge successful? [y/n] , 如果你回答 n那么 merge 冲突解决将被中止,文件将保持不变。请注意,如果您在任何时候将文件保存在 Meld 中,那么您将不会收到来自 git 的警告和提示。 [当然你可以直接删除文件并用备份替换它 .orig git 为你制作的文件。]

    如果您有 1 个以上的文件存在 merge 冲突,那么 git 将为每个文件打开一个新的 Meld 窗口,一个接一个,直到它们全部完成。它们不会同时打开,但是当您完成其中一个冲突的编辑并关闭 Meld 时,git 将打开下一个,依此类推,直到所有 merge 冲突都已解决。

    创建一个虚拟项目来测试 git mergetool 的使用是明智的。在实际项目中使用它之前。确保在测试中使用包含空格的文件名,以防您的操作系统要求您转义 cmd 中的引号。行,见下文。

    转义引号字符

    某些操作系统可能需要在 cmd 中有引号逃脱了。经验不足的用户应该记住,配置命令行应该使用包含空格的文件名进行测试,如果 cmd行不适用于包含空格的文件名,然后尝试转义引号。例如
    cmd = meld \"$LOCAL\" \"$REMOTE\"

    在某些情况下,可能需要更复杂的引号转义。下面的第一个 Windows 路径链接包含一个对每个引号进行三重转义的示例。这很无聊,但有时是必要的。例如
    cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"

    窗口路径

    Windows 用户可能需要将额外的配置添加到 Meld cmd线。他们可能需要使用到 meldc 的完整路径。 ,它旨在从命令行在 Windows 上调用,或者他们可能需要或想要使用包装器。他们应该阅读下面链接的 StackOverflow 页面,这些页面是关于设置正确的 Meld cmd适用于 Windows 的线。由于我是 Linux 用户,因此无法测试各种 Windows cmd除了推荐使用我的示例并添加到 Meld 或 meldc 的完整路径之外,没有关于该主题的更多信息。 ,或将 Meld 程序文件夹添加到您的 path .
  • Git Diff and Meld on Windows
  • How to set Meld as git mergetool
  • Git mergetool with Meld on Windows

  • 使用 Meld 忽略尾随空格

    Meld 有许多可以在 GUI 中配置的首选项。

    在首选项中 Text Filters选项卡有几个有用的过滤器可以在执行差异时忽略诸如注释之类的内容。尽管有过滤器可以忽略 All whitespaceLeading whitespace ,没有忽略 Trailing whitespace过滤器(这已被建议添加到 Meld 邮件列表中,但在我的版本中不可用)。

    忽略尾随空格通常非常有用,尤其是在协作时,并且可以使用 Meld 首选项中的简单正则表达式轻松手动添加 Text Filters标签。
    # Use either of these regexes depending on how comprehensive you want it to be.
    [ \t]*$
    [ \t\r\f\v]*$

    我希望这对大家有帮助。

    关于git - 设置和使用 Meld 作为你的 git difftool 和 mergetool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34119866/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com