0

コマンドのインターフェイス出力と思われるものを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' の両方が異なるファイルまたは 1 つのファイルの異なる部分を変更した場合、ファイルは自動的に変更されgit commit、確認するだけで済みます。D と D' の両方が 1 つのファイルの同じ部分を変更した場合 (およびまったく同じ方法で変更しない場合)、マージの競合が発生し、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

<<<<競合マーカーは、このセクションに からまで====とから====までの 2 つのバージョンがあることを示しています>>>>HEADハッシュは、コミットでそれぞれのバージョンを識別するために使用されます。いずれかのバージョンを選択するか、両方のバージョンを保持する (正しい順序で順番に並べる) か、完全に新しいバージョンを作成する (両方のバージョンを組み合わせた効果があることを願っています) ことによって、ファイルを解決済みのバージョンにする責任があります。 . 選択したテキスト エディターを使用するか、git mergetool などのツールを使用してそれを行うことができます。結果に満足したらgit commit、マージを確認します。

あなたが(おそらく)したことは「何もせずにコミットする」ことでした。したがって、プルしたときにgitが配置した競合マーカーについて何もしなかったとしても、ファイルが問題なくマージされたことをgitに伝えました。

于 2013-07-14T14:50:23.870 に答える