繁体   English   中英

产生git合并冲突

[英]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

branchAbranchB 共享的第一个提交是标记为*提交。 它们还共享每个较早的提交(在*的左侧),但是*是最有趣的此类提交。 我们称此提交为branchAbranchB合并基础

运行时:

$ git checkout branchA
$ git merge branchB

git merge步骤看到我们 branchA (由于git checkout命令),并且我们要求合并branchB的最尖端提交。 然后,Git定位此合并基础提交,并运行两个 git diff命令。

比方说,提交的哈希值*ba5e... ,和尖端提交上branchA是提交1111...与尖端提交的branchB2222... 这两个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM