0

我让 Git 将似乎是diff命令的接口输出的内容添加到文件的行中:

$ git pull
U       public_html/spider/spider.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both modified:      spider.php
#
no changes added to commit (use "git add" and/or "git commit -a")

$ git diff spider.php
diff --cc public_html/spider/spider.php
index a89b8ef,4b091a7..0000000
--- a/public_html/spider/spider.php
+++ b/public_html/spider/spider.php
@@@ -136,13 -136,7 +136,17 @@@ if ( isset($_SERVER['HTTP_USER_AGENT']
                                $providersList[] = $p['name'];
                        }
                }
++<<<<<<< HEAD
+
+              if ( ensure_fields($input, 'version') ) {
+                      $output['providers'] = $providers;
+              } else {
+                      $output['providers'] = $providersList;
+              }
+
++=======
+               $output['providers'] = $providersList;
++>>>>>>> 5de401379b275bdb805298fd3db919028506cc60
                $logData['providers'] = implode(', ', $providersList);

                echo json_encode($output);

$ git add spider.php

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
# Changes to be committed:
#
#       modified:   spider.php
#

现在,当我打开 spider.php 文件时,我发现它是直接从 VIM 复制的:

- bruno:spider$ vim spider.php
135             if ( $p['url']!='' ) {
136                 $providersList[] = $p['name'];
137             }
138         }
139 <<<<<<< HEAD
140 
141         if ( ensure_fields($input, 'version') ) {
142             $output['providers'] = $providers;
143         } else {
144             $output['providers'] = $providersList;
145         }
146 
147 =======
148         $output['providers'] = $providersList;
149 >>>>>>> 5de401379b275bdb805298fd3db919028506cc60
150         $logData['providers'] = implode(', ', $providersList);
151 
152         echo json_encode($output);

编辑文件的唯一机器是这台(本地)机器。在这种情况之前唯一不寻常的 Git 用法是commit --amendpush. 可能是造成这种情况的吗?如果不是,那又如何?这是一个 Git 错误吗,看起来确实如此?

4

1 回答 1

3

a) 为什么会发生合并?

这不是 100% 确定的,但可能是:

你有过:

A--B--C--D

你推这个然后修改 D 得到:

A--B--C--D'

然后在某个时候,您拉取并取回了您之前推送的提交 D,并且与您稍后创建的 D' 没有正式关系。此时,需要合并以创建作为 D 和 D' 的后继者的提交。这就是事情出错的地方。

如前所述,我不能完全确定它是这样展开的,但你所拥有的肯定是一个出错的合并。

b) 合并如何发生以及如何解决冲突?

git 尝试自动进行合并,如果提交 D 和 D' 都更改了不同的文件或一个文件的不同部分,则文件会自动更改,您只需git commit进行确认即可。如果 D 和 D' 都更改了一个文件的同一部分(并且不要以完全相同的方式更改它),则您遇到了合并冲突,并且 git 要求您解决它。因此它将冲突标记放在文件中,它们看起来像这样:

139 <<<<<<< HEAD
140 
141         if ( ensure_fields($input, 'version') ) {
142             $output['providers'] = $providers;
143         } else {
144             $output['providers'] = $providersList;
145         }
146 
147 =======
148         $output['providers'] = $providersList;
149 >>>>>>> 5de401379b275bdb805298fd3db919028506cc60

冲突标记告诉您,此部分有两个版本,一个 from <<<<to====和一个 from ====to >>>>HEAD并且哈希用于识别具有提交的各个版本。您有责任通过选择任一版本或保留两个版本(一个接一个,以正确的顺序)或创建一个全新的版本(希望具有两个版本结合的效果)将文件带到其已解决的版本. 您可以使用您选择的文本编辑器来执行此操作,也可以使用 git mergetool 之类的工具。当您对结果感到满意时,您git commit可以确认合并。

您(可能)所做的是“什么都不做并提交”,因此即使您对拉动时放置在其中的冲突标记 git 没有做任何事情,也告诉 git 文件已正确合并。

于 2013-07-14T14:50:23.870 回答