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.num
与 file
相同。
注意事项
如果mergetool.prompt
设置为false
,我认为-y
应该是不必要的。而且,根据文档,它看起来像在较新版本的 git -t
中暗示 -y
。
-t
部分可以进一步缩短,例如-t x
或 -t 0
。
如果您有多个未合并的文件,似乎没有任何方法可以一次为多个文件生成这些版本。例如。如果您有未合并的文件 files/file1
和 files/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 - 为冲突的版本自动创建不同的文件的主要内容,如果未能解决你的问题,请参考以下文章