git自动合并在不同的行

  • 本文关键字:合并 git git git-merge
  • 更新时间 :
  • 英文 :


我有一个repo,结构如下:

master -> b -----
----> a --   
----------v---v--> c

分支a,bc是基于master,但c只是包含ab的合并。

master中,我有以下文件(file.txt):

UNUSED_1
UNUSED_2

a通过写入

修改该文件
A
UNUSED_2

并且b通过写入

来修改这个文件
UNUSED_1
B

当我试图合并bc(合并a后),我得到一个合并冲突:

<<<<<<< HEAD
A
UNUSED_2
=======
UNUSED_1
B
>>>>>>> b

有没有办法告诉git merge我想要

A
B

在file.txt吗?

手动解决这是微不足道的,但这都是在脚本中自动完成的,其中我有几个"特性",每个"特性"都由一个分支表示,主分支"保留"。

如果我想要一个功能的组合,然后我创建一个新的分支,并合并所有需要的功能来构建。

下面是一个脚本,用于可靠地重新创建帖子中描述的情况,直到合并冲突:

# Setup `master`
git init .
echo "UNUSED_1" >> "file.txt"
echo "UNUSED_2" >> "file.txt"
git add "file.txt"
git commit -m "Master commit"
# Setup `a`
git checkout -b "a"
rm "file.txt"
echo "A" >> "file.txt"
echo "UNUSED_2" >> "file.txt"
git add "file.txt"
git commit -m "A commit"
# Setup `b`
git checkout "master"
git checkout -b "b"
rm "file.txt"
echo "UNUSED_1" >> "file.txt"
echo "B" >> "file.txt"
git add "file.txt"
git commit -m "B commit"
# Try to merge in `c`
git checkout "master"
git checkout -b "c"
git merge --no-ff "a" -m "Merge A"
git merge --no-ff "b" -m "Merge B"

有没有办法告诉git merge我想要

A
B

在file.txt吗?

不,但你需要说服的不是git merge本身。当git merge决定文件需要一个"真正的合并"时;因为"两边"都发生了变化对于合并基础版本,Git会将这个文件传递给一个低级的合并驱动程序。

Git有一个内置的低级合并驱动程序,这个内置的驱动程序会产生你上面看到的冲突。但是,通过在.git/config中定义一个合并驱动程序,然后引用.gitattributes中的合并驱动程序,你可以告诉Git:使用我的合并驱动程序而不是你的。

不幸的是,这意味着您必须找到或编写一个低级合并驱动程序。

幸运的是,Git包含了一个单独的程序,它是一个低级别的合并驱动程序,叫做git merge-file

不幸的是,这个程序在默认情况下做同样的事情(它和默认的低级合并使用相同的算法)。

幸运的是,这个程序有标志

不幸的是,这些标志大多与现有的-X标志相同,而现有的-X标志是不够的。

幸运的是,git merge-file有一个-X没有的标志,即--union。联合合并操作意味着接受两组更改。

遗憾的是,此操作没有针对您的特定情况进行测试。

幸运的是,您可以测试它。

(参见frogurt)

最新更新