我想在git repo中的两个任意文件上利用git-merge算法。这是我的工作目录:
folder/
file1
file2
file1和file2是相似的,但我想看看git如何将它们合并,就好像它们是同一文件的不同版本一样。换句话说,我想要这样的事情:
git merge-files file1 file2 > merge_of_file1_file2
有办法做到这一点吗?
答案 0 :(得分:49)
这没有任何意义,因为你没有提供共同的祖先。但是,如果你有一个,你可以使用:
git merge-file <current-version> <common-ancestor> <other-version>
这会将结果放在当前版本文件中;如果你想在别处使用它们,请使用:
git merge-file -p <current> <common> <other> > <dest>
它需要共同的祖先提供一些东西来考虑相对于的变化。您可以通过从存储库的历史记录中提供一个空文件或其中一个旧版本的副本来破解它,但结果的质量将取决于您选择共同祖先的程度,因为它合并了两个差异,在它和每个新版本之间。只有两个非常相似(多次运行至少三条相同的行)时,空文件才能正常工作。
如果没有这个,你所能做的就是看看差异:
git diff --no-index file1 file2
答案 1 :(得分:37)
对于你想要做的事情:
touch file3 #empty
git merge-file file1 file3 file2
这将以file3(空文件)为基础进行file1和file2的三向合并。
请注意,这会写入file1。如果不需要,您当然可以执行以下操作:
touch file3
cp file1 merge_of_file1_file2
git merge-file merge_of_file1_file2 file3 file2
答案 2 :(得分:3)
只需添加到manojlds的答案中,这是一个很好的完整功能,您可以将其添加到.bashrc
中以完成此工作。这样做的好处是可以在“合并冲突”块中正确识别两个文件的名称。
function merge() {
local ext
[ $# -ne 2 ] && echo "Error: Need exactly two args." && return 1
[[ ! -r $1 || ! -r $2 ]] && echo "Error: One of the files is not readable." && return 1
if [[ ${1##*/} =~ '.' || ${2##*/} =~ '.' ]]; then
[ ${1##*.} != ${2##*.} ] && echo "Error: Files must have same extension." && return 1
ext=.${1##*.}
fi
touch tmp$ext # use empty file as the 'root' of the merge
cp $1 backup$ext
git merge-file $1 tmp$ext $2 # will write to file 1
mv $1 merge$ext
mv backup$ext $1
rm tmp$ext
echo "Files merged into \"merge$ext\"."
}
答案 3 :(得分:1)