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.