可以git合并两个文件忽略他们共同的祖先

时间:2015-03-27 07:35:02

标签: git

例如,我有以下文件:

// first part
function() {
    var timer = 1;
}

// second part
function() {
    var timer = 2;
}

// third part
function() {
    var timer = 3;
}

现在两个不同的分支改变了它。我有变化:
在branch1:

// first part
function() {
    var timer = "changed in branch1";
}

// second part
function() {
    var timer = 2;
}

// third part
function() {
    var timer = 3;
}
分支2中的


// first part
function() {
    var timer = 1;
}

// second part
function() {
    var timer = "changed in branch2";
}

// third part
function() {
    var timer = 3;
}

使用3向合并时,这些更改将合并干净,因为每个分支都会更改一块与另一个不同的代码。但是,合并后我想要以下内容:

// first part
function() {
<<<<<<< branch1
    var timer = "changed in branch1";
=======
    var timer = 1;
>>>>>>> branch2
}

// second part
function() {
<<<<<<< branch1
    var timer = 2;
=======
    var timer = "changed in branch2";
>>>>>>> branch2
}

// third part
function() {
    var timer = 3;
}

有没有办法在git中实现这种合并?我假设根据评论,这种合并将是这样的:

  1. 制作文件的差异
  2. 在最终版本中插入不在diff
  3. 中的块
  4. 标记与冲突标记不同的块

3 个答案:

答案 0 :(得分:1)

如果您只想查看代码与某个提交之间的差异,请执行以下操作:

git diff HEAD..<sha-commit2>

或者如果您想将当前提交与另一个分支的提示进行比较:

git diff HEAD..other_branch

修改 正如@Maximus在评论中所说:如果你想看到某人做出的改变

    主分支上的
  • 特别是文件
  • 自你分支的时间

所以我们需要先找到共同的祖先:(我想你是在你的分支上;我从哪里使用HEAD。可以用你的分支名称替换)

git merge-base HEAD master

然后您可以看到更改,因为特定文件中的共同祖先(git log -pgit diff;取决于您喜欢的输出):

git log -p <sha-common-ancestor>..master -- <the files and dirs you want>
git diff <sha-common-ancestor>..master -- <the files and dirs you want>

答案 1 :(得分:1)

使用git merge --no-commit ,然后在提交合并结果之前将其修复。对于一次性而言,这是最简单的方法(到目前为止)。

如果您需要一种可自动执行此操作的可重复方法,则可以定义自定义合并驱动程序(请参阅,例如this nabble thread)。但是,您必须提出一些系统规则,以便如何结合明显不冲突的变化。

答案 2 :(得分:1)

Git提供了管道命令git merge-file,它允许您在没有基础的情况下合并两个文件,但是没有一种简单的方法可以调用它。如果您要将branch合并到master并想要对某个文件foo.txt进行无基本合并:

git show master:foo.txt > /tmp/master.foo.txt
git show branch:foo.txt > /tmp/branch.foo.txt
echo -n > /tmp/empty.txt
git merge-file -p -L master -L base -L branch /tmp/master.foo.txt /tmp/empty.txt /tmp/branch.foo.txt > foo.txt

在上面的例子中,这会产生:

// first part
function() {
<<<<<<< master
    var timer = 1;
=======
    var timer = "changed in branch1";
>>>>>>> branch
}

// second part
function() {
<<<<<<< master
    var timer = "changed in branch2";
=======
    var timer = 2;
>>>>>>> branch
}

// third part
function() {
    var timer = 3;
}

(脚本将其作为读者的练习。)