对git分支和合并有一个基本的疑问。 可以合并分支而无需对主服务器进行任何更改。如果是这样,主和分支之间存在的增量变化会发生什么。是否会被主分支更改覆盖。请参阅以下方案:
我有两个分支master和BugBranch。
第1步:
C--B--A (master)
|
X (branch)
从大师手中接过一个分支说BugBranch。 现在我有一个文件TestMerge.java。
public static void main(String[] args){
...
...
callSomeMethod();
switch(decision)
{
case A:
do_something
break;
case B:
do_something
break;
}
}
所以在第1步,master和BugBranch看起来都一样。
第2步: 文件(TestMerge)在master中更改如下。 (刚删除开关)
public static void main(String[] args){
...
...
callSomeMethod();
}
C--B--A--1 (master)
|
X (branch)
第3步: 问题是当我尝试将分支与主服务器合并时。期待文件中的合并冲突,因为肯定存在delta并且想要保留BugBranch中的更改。但奇怪的是,它被主人改变了。
尝试了以下命令
git checkout master
git merge BugBranch
这真令人困惑!
答案 0 :(得分:4)
Git分支只是一个提交指针。您问题中的X
分支指向提交A
,对于许多Git操作,可以使用X
代替A
,反之亦然,您可以获得相同的结果。
只有通过创建,Git分支才会在存储库中产生任何更改。在您对文件进行一些更改并提交它们之前,分支不会偏离其源分支(在您的情况下为master
)。
您更改了一些文件并在master
上提交(提交1
)。如果你没有在分支X
上更改和提交任何内容,它仍然指向提交A
,它位于分支1
的历史记录中(实际上,它是它的父代)。
如果要将分支X
提交到分支master
,Git会检测到分支X
位于分支master
的过去;从master
开始,如果Git反复从一个提交跳转到其父之一,它可以到达分支X
指向的提交(即A
提交)。
这意味着分支X
不包含分支master
中尚未包含的任何内容。换句话说,没有任何东西可以合并,Git会通过“已经是最新的”消息通知您这种情况。
另一方面,如果您要将master
合并到X
,因为master
是X
的未来,Git会将合并操作转换为“快进“的操作。这意味着,它不会创建不必要的新合并提交,只是向前推送X
分支(您合并的分支),直到它到达master
提交(您合并的分支)。 / p>
您可以强制Git使用git merge
命令行中的--no-ff
标志创建合并提交,但除了非常特殊的情况外,您没有任何理由这样做。它会生成一个不会在文件中引入任何更改的提交。