10

当 Git 在合并期间检测到冲突时,默认行为是用<<< >>> ===标记填充文件。

大多数时候这是可以的,但有时我想以不同的方式解决冲突,我只想让 Git 创建不同的文件:

  • 原版,
  • 更改了版本 A,
  • 更改了 B 版。

如何做到这一点?


如果没有简单的命令一次性创建这些文件(这有点令人惊讶),也许有一种方法可以扩展 Git 以便它可以做到这一点?风俗mergetool还是什么?只是一个想法。


解决方案:

我已经选择了@Karl Bielefeldt 答案的变体:

保存文件.sh

#!bash
BASE=$1
LOCAL=$2
REMOTE=$3
MERGED=$4

cp "$BASE" "$MERGED.git_BASE"
cp "$LOCAL" "$MERGED.git_LOCAL"
cp "$REMOTE" "$MERGED.git_REMOTE"

# never mark the conflict as merged
exit 1 

配置

mergetool.savefiles.cmd=/path/to/savefiles.sh $BASE $LOCAL $REMOTE $MERGED
mergetool.savefiles.trustexitcode=true
4

3 回答 3

6

创建一个名为的文件savefiles.sh,其内容如下:

#!/usr/bin/bash

cp $1 /path/to/BASE
cp $2 /path/to/LOCAL
cp $3 /path/to/REMOTE

在您的存储库中执行以下命令:

git config mergetool.savefiles.cmd "/path/to/savefiles.sh \$BASE \$LOCAL \$REMOTE"

--global如果要更改此存储库以外的其他内容,请添加一个。

然后运行这个自定义合并工具,使用:

git mergetool --tool=savefiles
于 2011-07-29T20:38:44.217 回答
5

如果您想不使用mergetool,而只是以您提到的状态显示或保存文件,则索引会保存冲突文件的不同状态。您可以显示(并根据需要重定向到文件):

$ git show :1:file.txt  # the file in a common ancestor of both branches
$ git show :2:file.txt  # the version from HEAD.
$ git show :3:file.txt  # the version from MERGE_HEAD.

但是,使用图形合并工具会显示冲突文件的 3 窗格视图。这通常是人们所做的,所以只需拿起你最喜欢的工具,看看如何将它与git mergetool通话联系起来。

于 2011-07-26T09:52:12.067 回答
1

概括

git mergetool -y -t bogus <file>

适用于 git 1.7.9.5 / Ubuntu 12.04 和 msysgit 1.9.4 / Windows 7 x64。

解释

我只想让 Git 创建不同的文件

我一直在寻找同样的东西。恰当的例子:当调用时git mergetool -t kdiff3,git显然试图通过使用硬编码标志调用 kdiff3 来超越我,该--auto标志指示 kdiff3 自动解决冲突并退出而不向我显示 GUI 或允许我参与该过程(另见)。当这种情况发生并且 kdiff3 错误地解决了冲突时,我去寻找这个。

当我像这样调用时mergetool(哪里bogus是一个不是有效合并工具标识符的字符串[例如,git mergetool --tool-help如果您的 git 版本具有该标识符,则不在输出中]),会发生以下情况:

  • 它报告“未知合并工具伪造”

  • 索引和file未触及

  • 生成以下文件(其中{num}是一个整数,在此调用创建的所有文件中都相同):

    file.BACKUP.{num}
    file.BASE.{num}
    file.LOCAL.{num}
    file.REMOTE.{num}
    

file.BACKUP.{num}与 相同file

笔记

我认为如果设置为-y应该是不必要的。而且,根据文档,它看起来像在较新版本的 git 中暗示.mergetool.promptfalse-t-y

-t部分可以进一步缩短,例如-t x-t 0

如果您有多个未合并的文件,似乎没有任何方法可以一次为多个文件生成这些版本。例如,如果您有未合并的文件files/file1files/file2,以下任何一项仍将仅生成这些版本(备份、基本、本地、远程)file1

git mergetool -y -t x
git mergetool -y -t x files
git mergetool -y -t x files/file1 files/file2

However, if you resolve the conflicts in file1 and run git mergetool again, it'll move on to the next file.

于 2014-11-21T17:21:12.003 回答