[英]Producing a git merge conflict
我试图故意产生git merge冲突。 这是我所做的
mkdir to-stack
cd to-stack
git init
vi a.txt
Added some text to first line of a.txt
git add a.txt
git commit -m "Added a line to a.txt"
git checkout -b other
vi a.txt
Updated the text on first line of a.txt to something else
git add a.txt
git commit -m "Updated line 1"
git checkout master
git merge other
发生合并,并且master分支中的内容a.txt被其他分支的内容覆盖
我期待合并时发生合并冲突。 由于我在其他分支中更改了同一行
您能告诉我为什么在上述情况下没有发生合并冲突吗?
合并将更改从某个常见提交更改为两个不同的提交(它们之间的关系是它们在历史记录中都具有该相同的提交)。
也就是说,考虑以下提交图,其中每个o
或*
代表一个提交,并且每个提交的父级都是通过向左跟随其连接(如有必要,向上或向下移动)找到的提交:
o <-- branchA
/
...--o--*
\
o--o <-- branchB
branchA
和branchB
共享的第一个提交是标记为*
提交。 它们还共享每个较早的提交(在*
的左侧),但是*
是最有趣的此类提交。 我们称此提交为branchA
和branchB
的合并基础 。
运行时:
$ git checkout branchA
$ git merge branchB
git merge
步骤看到我们在 branchA
(由于git checkout
命令),并且我们要求合并branchB
的最尖端提交。 然后,Git定位此合并基础提交,并运行两个 git diff
命令。
比方说,提交的哈希值*
是ba5e...
,和尖端提交上branchA
是提交1111...
与尖端提交的branchB
是2222...
。 这两个git diff
命令实际上是:
$ git diff ba5e 1111
和:
$ git diff ba5e 2222
第一个差异告诉Git“我们做了什么”: 我们从*
更改为branchA
的尖端。 第二个差异告诉Git“他们做了什么”:从*
到branchB
的尖端, 它们发生了什么变化。
当“我们所做的事情”的某些部分更改同一文件的同一行时,与“他们所做的事情”的某些部分更改时,发生合并冲突 ,但是这两个更改是不同的。 例如,如果我们都更改README.txt
来更改苹果的颜色,但是我们将其从紫色更改为黑色,然后又将其从紫色更改为橙色,则Git不知道要选哪个。
因此,让我们这样做:
mkdir mtest && cd mtest && git init
echo 'for testing' > README.txt
echo 'have a purple apple' >> README.txt
git add README.txt && git commit -m initial
这将使用一个文件README.txt
创建分支master
。 现在,让我们从一次提交中创建两个独立的分支,并在每个分支中更改苹果的颜色:
git checkout -b branchA master
sed -i '' s/purple/black/ README.txt
git add README.txt && git commit -m black
git checkout -b branchB master
sed -i '' s/purple/orange/ README.txt
git add README.txt && git commit -m black
现在,我们简单地将一个分支与另一个分支合并。 我们目前在branchB
,因此我们现在可以git merge branchA
。 解决冲突并提交后,将在branchB
上进行合并。 或者,我们可以先git checkout branchA
,然后git merge branchB
。 我们将得到相同的冲突,但是一旦解决并提交,我们将在branchA
上进行合并。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.