如何在没有更改的情况下将分支合并到git中的master分支中?

时间:2016-12-10 14:11:52

标签: git github git-branch git-merge branching-and-merging

对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

这真令人困惑!

1 个答案:

答案 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,因为masterX的未来,Git会将合并操作转换为“快进“的操作。这意味着,它不会创建不必要的新合并提交,只是向前推送X分支(您合并的分支),直到它到达master提交(您合并的分支)。 / p>

您可以强制Git使用git merge命令行中的--no-ff标志创建合并提交,但除了非常特殊的情况外,您没有任何理由这样做。它会生成一个不会在文件中引入任何更改的提交。