Git - 为冲突的版本自动创建不同的文件

Posted

技术标签:

【中文标题】Git - 为冲突的版本自动创建不同的文件【英文标题】:Git - automatically create distinct files for versions on conflict 【发布时间】:2011-10-13 06:41:20 【问题描述】:

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

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

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

如何实现?


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


解决方案:

我已经选择了@Karl Bielefeldt's answer 的变体:

savefiles.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

【问题讨论】:

您可以查看以下答案以查看示例工作流程:***.com/questions/161813/… 我以前见过,谢谢! 【参考方案1】:

创建一个名为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

【讨论】:

谢谢!这或多或少是我想要的——我稍微修改了一下,根据$MERGE git 变量的内容自动选择输出文件名。【参考方案2】:

如果您想不使用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 通话联系起来。

【讨论】:

另外,git mergetool 无论如何都会在您的编辑器中打开三个版本。 实际上,我正是出于这个原因要求的——能够在我最喜欢的合并工具(即 Eclipse)中打开文件。 :) 而且我认为我不能通过命令行在 Eclipse 中自动打开三向补丁编辑器。 这个方案比较麻烦,尤其是有几个文件的路径很长的时候。也许有可能发明一个自定义的mergetool 可以自动为我做到这一点? @Kos egit 插件具有 3 窗格视图的合并冲突解决方案;你用吗?见wiki.eclipse.org/EGit/User_Guide#Using_Merge_Tool @CharlesB 不,我放弃了 EGit,因为通常我从控制台更有效地使用 Git(我还没有发现 EGit 可用,我希望它很快成熟)。在纯 Eclipse 中,您可以选择任意 3 个文件并运行 Compare with -> Each other 以获得 3 路差异。【参考方案3】:

总结

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 apparently tries to outsmart me by invoking kdiff3 with a hard-coded --auto flag 指示 kdiff3 自动解决冲突并退出,而不向我显示 GUI 或允许我参与该过程 (see also)。当这种情况发生并且 kdiff3 错误地解决了冲突时,我就去找这个。

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

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

索引和file保持不变

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

file.BACKUP.num
file.BASE.num
file.LOCAL.num
file.REMOTE.num

file.BACKUP.numfile 相同。

注意事项

如果mergetool.prompt 设置为false,我认为-y 应该是不必要的。而且,根据文档,它看起来像在较新版本的 git -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

但是,如果您解决了file1 中的冲突并再次运行git mergetool,它将转到下一个文件。

【讨论】:

以上是关于Git - 为冲突的版本自动创建不同的文件的主要内容,如果未能解决你的问题,请参考以下文章

Git 多人协作以及 版本冲突问题解决

Git 多人协作以及 版本冲突问题解决

如何通过获取当前分支中的版本来自动解决 Git 冲突?

git 使用

git gitlab 使用 提交代码解决冲突

git冲突合并