git merge之后源和目标分支会发生什么?

时间:2012-12-23 12:44:29

标签: git

当我运行git checkout branch1后跟git merge branch2合并两个分支时,看起来branch2只是覆盖了branch1。这应该发生吗?

编辑:

合并前

  • branch1 = readme.txt(Hello World!)
  • branch2 = readme.txt(Hello 2!)

合并后

  • branch1 = readme.txt(Hello 2!)

tbh,我不确定合并在技术上应该做什么。

2 个答案:

答案 0 :(得分:19)

当将一个分支合并到另一个分支时, git merge 将从合并的分支中的所有提交应用到要合并的分支,因为两个分歧。您可以将其视为形成一个新头,其中包含来自两个分支的最新状态。如果您更改了分支中的文件并将其合并回其父级,则更改将应用​​于该分支的当前状态之上。如果两个文件在同一个地方都发生了变化,那么合并可能无法解决这个问题,您将不得不进行干预。通常,你最终会得到两个分支机构的最新作品。

在您的示例中,您在branch2中所做的更改已合并到branch1中。这似乎是将文本更改为"Hello 2!"

git-merge联机帮助页有关于此的说法:

  

假设存在以下历史记录且当前分支为“master”:

          A---B---C topic
         /
    D---E---F---G master
     

然后“git merge topic”将重放在主题分支上所做的更改,因为它与master分道扬..   (即E)直到它在master上的当前提交(C),并将结果记录在新的提交中   使用两个父提交的名称和用户描述更改的日志消息。

          A---B---C topic
         /         \
    D---E---F---G---H master

简而言之,这是 merge 的正确操作。

答案 1 :(得分:4)

如果readme.txtbranch1分歧branch2,合并分支将导致文件处于冲突状态。冲突由用冲突标记描述的文件中存在的两种不同内容的变体表示:

<<<<<<< HEAD:hello.txt
Hello world!
=======
Hello 2!
>>>>>>> 01234567890abcdef:hello.txt

不会自动提交包含冲突的合并。相反,将显示一条消息,指示您手动解决冲突并显示如何提交更改:

CONFLICT (content): Merge conflict in <file>
Automatic merge failed; fix conflicts and then commit the result.

作为Nevik Rehnel的pointed out,如果文件在分支中没有分歧,而只是从公共共享内容(Hello world!)修改为新内容(Hello 2! ),不存在冲突,合并操作只会应用更改。换句话说, merge 不保证合并文件内容,而是合并与公共基础相比的更改。