我们在Github上有一个存储库。一位用户创建了一个分支,将其签到Github,并创建了一个拉取请求。当他登录Github并查看PR时,底部会显示一条消息,提示没有冲突,并且可以合并此PR。有一个绿色按钮可以做到这一点。
当我登录Github并查看相同的PR时,会看到不同的消息:“由于冲突,该分支无法重新建立基础。由于冲突,无法自动执行将该分支的提交重新置于基础分支之上重新应用来自head分支的单个提交时遇到的问题。”
为什么我们看不到相同的东西?
我们的登录名和配置选项有什么不同吗?
他在他的IDE中可能有不同的选择,但这没有什么不同。 Github上只有一个版本的仓库。他在Windows上,而我在Mac上,但这也不应该有所不同。
在尝试重新本地化之前,有没有办法让我看到冲突到底是什么?
答案 0 :(得分:3)
如果一个修订版本添加的代码是冲突生成器,而另一个修订版本又将其收回,则可能存在基准冲突,而没有合并冲突。如果合并,则该分支不会具有冲突的代码...但是,如果您逐个修订(如在变基中),则必须处理两次冲突。
答案 1 :(得分:1)
问题下方的注释中指出,这是因为GitHub提供了合并的提交给没有问题的人,但是对您来说,GitHub提供了 rebase 提交。有时,合并很容易,而重新设置则不容易。
这是提交系列的一个简单示例,可以轻松合并,但不能重新建立基础。首先,让我们绘制实际的提交图:
...--G--H------L <-- master
\
I--J--K <-- branch
在提交H
中,文件makeconfict
的内容如下:
This is line 1
This is line 2
This is line 3
在提交L
中,我们将第2行更改为This is line two
。因此H
-vs-L
更改了文件makeconflict
的第2行(并且没有其他更改)。
与此同时,在提交I
中,我们删除文件makeconflict
的第2行。在提交J
中,我们对一些有用的文件进行了有用的更改,而没有涉及文件makeconflict
。在提交K
中,我们将文件makeconflict
的第2行放回去。
如果我们尝试merge
(分支K
的尖端branch
到master
中,则Git比较H
与L
并发现makeconflict
的第2行已更改。它将H
与K
进行比较:这表示我们必须从H
更改文件makeconflict
的第2行,以保留在master
中所做的更改。然后将H
与K
进行比较,看看我们做了什么。由于我们将第2行放回K
中,因此,唯一的 change Git需要与对makeconflict
的更改结合起来,即对重要文件的更改。这样合并可以顺利进行,更改重要文件,我们得到:
...--G--H------L--M <-- master (HEAD)
\ /
I--J--K <-- branch
但是,如果我们尝试重新构建,则Git需要将提交I
复制到I'
之后的新提交L
:
I' [in progress, not actually committed yet]
/
...--G--H------L <-- master
\
I--J--K <-- branch
尝试将I
复制到I'
(与H
到I
的区别)表示我们必须删除文件的第2行makeconflict
,而H
和L
之间的区别在于,我们必须更改文件makeconflict
的第2行。这两个不同的更改相互冲突。我们必须选择要进行的更改:将2
替换为two
,还是完全删除该行?
如果我们完全删除该行(这需要人工干预,而GitHub不会通过Web UI进行删除),则可以继续将J
复制到J'
和K
到K'
:
I'-J'-K' <-- branch (HEAD)
/
...--G--H------L <-- master
\
I--J--K [abandoned]
在此过程中,我们将文件makeconflict
的第2行放回了原来的状态,现在仍在废弃的提交K
中。因此,我们遇到一个合并冲突(将I
复制到L
上以制作I'
),实际上,最终是撤消了L
中所做的更改。但是一旦完成,我们就会有一系列提交,这些提交只会直接添加到master
中,因此我们可以使用master
将名称K'
提前提交到git checkout master; git merge --ff-only branch
:
...--G--H------L--I'-J'-K' <-- branch, master (HEAD)
\
I--J--K [abandoned]
或者,当然,当在I'
处理合并冲突时,我们可以选择舍弃对I
的更改,并保留L
的更改。最后,我们只是跳过完全复制I
。当我们将提交K
复制为K'
时,通常会遇到另一个合并冲突,尽管有时Git会意识到也不需要提交K
。如果我们正确处理了冲突,我们也会删除K
:
J' <-- branch (HEAD)
/
...--G--H------L <-- master
\
I--J--K [abandoned]
同样,我们现在可以快进master
指向复制J'
。
这个示例当然是人为的,但是这些事情确实确实发生在现实生活中。