git合并后,源分支和目标分支会发生什么情况?

git合并后,源分支和目标分支会发生什么情况?,git,Git,当我运行git checkout branch1然后运行git merge branch2来合并两个分支时,看起来branch2只是覆盖了branch1。这应该发生吗 编辑: 合并前 branch1=readme.txt(你好,世界!) branch2=readme.txt(你好2!) 合并后 branch1=readme.txt(你好2!) tbh,我不确定合并在技术上应该做什么。当将一个分支合并到另一个git中时,合并将应用从合并的分支到合并的分支的所有提交,因为这两个分支是分开的。

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

编辑:

合并前

  • branch1=readme.txt(你好,世界!)
  • branch2=readme.txt(你好2!)
合并后

  • branch1=readme.txt(你好2!)

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

当将一个分支合并到另一个git中时,合并将应用从合并的分支到合并的分支的所有提交,因为这两个分支是分开的。你可以把它看作是一个新的头,它包含了两个分支中最新的状态。如果更改了分支中的文件并将其合并回其父级,则更改将应用于该分支的当前状态。如果两个文件在同一位置发生了更改,则“合并”可能无法解决此问题,您必须进行干预。通常情况下,你只需要从两个分支得到最新的工作

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

git merge
manpage对此有如下描述:

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

然后,“git合并主题”将重播主题分支上所做的更改,因为它与主分支不同 (即,e)直到其当前提交(C)在主控上,并将结果记录在新的提交中 包含两个父提交的名称和用户描述更改的日志消息

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

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

如果
readme.txt
branch1
branch2
中出现分歧,合并分支将导致文件处于冲突状态。冲突由两种不同内容的变体表示,这两种变体均存在于用冲突标记划定的文件中:

<<<<<<< HEAD:hello.txt
Hello world!
=======
Hello 2!
>>>>>>> 01234567890abcdef:hello.txt
>01234567890abcdef:hello.txt
带有冲突的合并不会自动提交。相反,将显示一条消息,指示您手动解决冲突,并显示如何提交更改:

CONFLICT (content): Merge conflict in <file>
Automatic merge failed; fix conflicts and then commit the result.
冲突(内容):将冲突合并到
自动合并失败;修复冲突,然后提交结果。

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

这取决于具体情况。请添加更多详细信息。它应该做的是应用您对分支2所做的所有承诺,因为这两个分支发散到分支1。请更具体一点,当你进行合并时会发生什么。编辑:我想合并是指合并的文件,而不是被合并的文件的内容。不一定。如果分支2包含分支1的更改(更确切地说,是与该文件相关的更改),Git可以识别分支2中的所有更改将取代其他更改(它们是公共历史)。在这种情况下,不会产生冲突,因为很明显,分支2的更改是在后来进行的。我本以为会有冲突,但正如Bevik Rehnel所暗示的,没有冲突。如何模拟冲突?@Okyeyein您可以通过编辑两个分支中文件的相同部分来创建冲突。因此,将文本更改为
“Hello1”
或分支1中的内容。然后,当您合并它们时,git将不知道要使用哪个更改,并将要求您手动排序冲突。(如果在您的平台上正确设置,您可以使用
git mergetool
很好地完成此操作。)@nevkrehnel Good point;我现在更新了答案以涵盖这个场景,并删除了OP误解合并结果的说法。
CONFLICT (content): Merge conflict in <file>
Automatic merge failed; fix conflicts and then commit the result.