当我运行git checkout branch1
后跟git merge branch2
合并两个分支时,看起来branch2只是覆盖了branch1。这应该发生吗?
编辑:
合并前
合并后
tbh,我不确定合并在技术上应该做什么。
答案 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.txt
和branch1
分歧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 不保证合并文件内容,而是合并与公共基础相比的更改。