【问题标题】:Setting default diff algorithm does not translate to default merge algorithm (patience)设置默认差异算法不会转换为默认合并算法(耐心)
【发布时间】:2014-07-31 15:28:33
【问题描述】:

我看过很多博客文章和堆栈溢出文章都这么说 git config --global diff.algorithm patience 将允许差异和合并使用默认递归算法的耐心策略选项。

我发现情况并非如此,我提出以下演示来说明原因。

git config --global diff.algorithm patience   //mythical config statement  

git clone https://github.com/kjlubick/PracticingGit.git
cd PracticingGit
git checkout origin/patience-merge-1 -t

git checkout -b merge_test           //temp branch for merging
git diff origin/patience-merge-2

这个差异(图片由meld 提供,看起来不错。让我们尝试将其合并。

git merge origin/patience-merge-2

嗯?这种合并看起来很难看。尽管第 9-19 行实际上并没有改变,但它们被标记为冲突/改变的方式与差异完全不同。

如果我们强制合并使用耐心策略选项:

git merge --abort
git merge origin/patience-merge-2 -X patience

这样好多了。冲突与我们之前创建的差异相匹配,并且在语义上是正确的。

我怎样才能让合并真正使用耐心设置,而不仅仅是差异?

我在黑暗中尝试了其他拍摄(不成功):

git config --global merge.algorithm patience
git config --global merge.diff.algorithm patience

系统信息:
视窗 8.1
git 版本 1.8.4.msysgit.0(通过 GitHub for Windows 2.0)

【问题讨论】:

  • 手册页为-s 选项说明了这一点:Use the given merge strategy; can be supplied more than once to specify them in the order they should be tried. If there is no -s option, a built-in list of strategies is used instead (git merge-recursive when merging a single head, git merge-octopus otherwise). 这听起来不太可能将其设为默认行为。
  • 所以也许通过git config 可能是不可能的,但是解决方法呢?还有其他方法吗?

标签: git git-merge git-diff git-config


【解决方案1】:

修补 git,如 Appleman1234 并不理想。我希望这个功能会出现在未来的版本中。

现在,我想我不得不接受别名

git config --global alias.pmerge "merge -X patience --"

这让我可以做

git pmerge origin/patience-merge-2

而不是

git merge origin/patience-merge-2 -X patience

在我之前给出的示例中。

【讨论】:

    【解决方案2】:

    There is a config item for branch-specific merge options,

    git config branch.master.mergeoptions "-X patience"
    

    但不是全局默认设置。

    【讨论】:

      【解决方案3】:

      一种方法是修补 git 以添加您要求的功能。

      builtin/merge.c 的示例未经测试、未编译补丁是

      diff -Nar merge.c merge.c-new 
      77c77
      < static const char *pull_twohead, *pull_octopus;
      ---
      > static const char *pull_twohead, *pull_octopus,*diff_algorithm;
      586a587,588
      >       else if (!strcmp(k, "diff.algorithm"))
      >               return git_config_string(&diff_algorithm, k, v);
      1305a1308,1311
      >               int diff_algorithm_mask = 0;
      >               if (diff_algorithm != null){
      >                       diff_algorithm_mask = parse_algorithm_value(diff_algorithm);
      >               }
      1308a1315,1317
      >                       if (diff_algorithm != null){
      >                               add_strategies(diff_algorithm,diff_algorithm_mask);
      >                       }
      1310a1320,1322
      >                       if (diff_algorithm != null){
      >                               add_strategies(diff_algorithm,diff_algorithm_mask);
      >                       }
      

      请注意,我相信如果要在 git 中包含这样的补丁,可能需要额外的工作来添加启用和禁用此行为的配置值,因为 documentation 明确指出要更改它value 只会改变 diff 算法。另一种方法是添加一个配置变量 merge.algorithm,如果未设置,则让它执行默认逻辑,如果设置,则在 merge.algorithm 中执行算法。

      另一个不需要更改代码的替代方法是 shell 别名 git 命令。

      【讨论】:

      • 代码更改并不理想。我想我将不得不接受别名 git config --global alias.pmerge "merge -X patience --"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2022-10-16
      相关资源
      最近更新 更多