例如,我有以下文件:
// 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中实现这种合并?我假设根据评论,这种合并将是这样的:
答案 0 :(得分:1)
如果您只想查看代码与某个提交之间的差异,请执行以下操作:
git diff HEAD..<sha-commit2>
或者如果您想将当前提交与另一个分支的提示进行比较:
git diff HEAD..other_branch
修改强> 正如@Maximus在评论中所说:如果你想看到某人做出的改变
所以我们需要先找到共同的祖先:(我想你是在你的分支上;我从哪里使用HEAD。可以用你的分支名称替换)
git merge-base HEAD master
然后您可以看到更改,因为特定文件中的共同祖先(git log -p
或git 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;
}
(脚本将其作为读者的练习。)