如何将没有更改的分支合并到git的主分支中?

5
在git分支和合并方面有一个基本的疑问。 一个分支是否可以在没有任何更改的情况下合并到主分支中。如果可以,那么存在于主分支和分支之间的差异变化会发生什么。它们会被主分支的变化覆盖吗?请参考以下情况: 我有两个分支master和BugBranch。 步骤1:
C--B--A   (master)
      |
      X   (branch)

从主分支master创建了一个名为BugBranch的分支。 现在我有一个TestMerge.java文件。
public static void main(String[] args){
...
...
callSomeMethod();
  switch(decision)
  {
    case A:
        do_something
        break;
    case B:
        do_something
        break;
  }
}

第一步:在第一步中,主分支和BugBranch看起来是相同的。

第二步:文件(TestMerge)在主分支中被更改如下(只删除了开关)。

public static void main(String[] args){
...
...
callSomeMethod();
}

C--B--A--1  (master)
      |
      X     (branch)

步骤三:

问题出在当我试图合并分支和主分支时。期望文件中存在冲突,因为肯定存在差异,希望保留BugBranch的更改。但奇怪的是,它被主分支的更改覆盖了。

尝试以下命令:

git checkout master

git merge BugBranch

这真的很令人困惑!


你在BugBranch上对这个文件做了任何更改吗? - chaoluo
3
Git 中没有增量。每个提交都是工作目录的完整快照。分支只是指向提交的指针,仅此而已。因此,如果您从“master”中分支出来,那么就没有“X”,分支“BugBranch”将指向提交“A”。当您将提交“A”合并到提交“1”中时,这是一个无操作,因为提交“A”已经成为提交“1”历史的一部分。 - user4003407
你在分支X(BugBranch)上做了任何更改吗? - axiac
如果大家的话不太清楚,XA 是完全相同的提交。因此,在合并时,您只需将 X 快进到与 1 完全相同即可。 - kabanus
在BugBranch中没有进行任何更改。但是在主分支中,在版本“1”中更改了该文件。 - shashantrika
1个回答

7
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会向您显示“Already up-to-date.”(已经是最新的)的消息。
另一方面,如果您想将master合并到X中,因为masterX的未来,Git将把合并操作转换为“快速转发”操作。这意味着它不会创建一个不必要的新合并提交,而只是将X分支(您合并到的分支)推进,直到达到master提交(您要合并的分支)。
您可以使用--no-ff标志强制Git在命令行中使用git merge创建合并提交,但除非确实存在特殊情况,否则您没有任何理由这样做。这将产生一个不引入文件更改的提交。

是的--no-ff也会显示“已经是最新的”。因此,合并这两个分支没有意义,因为它们都是相同的提交? - shashantrika
这取决于合并的方向(Xmaster 不会产生任何新的内容,而 masterX 应该将 X 快进到 master)。使用 git branch -v 命令查看两个分支是否指向同一个提交。或者更好的方法是尝试使用 GUI Git 客户端进行可视化检查。 - axiac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接