web-dev-qa-db-ja.com

なぜgitが「マージされていないファイルがあるためプルできない」と言ったのですか?

ターミナルでプロジェクトディレクトリを引き込もうとすると、次のエラーが表示されます。

harsukh@harsukh-desktop:~/Sites/branch1$ git pull Origin master
U app/config/app.php
U app/config/database.php
U app/routes.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は"Pull is not possible because you have unmerged files"と言っているのですか。

136
Harsukh Makwana

現在起こっていることは、あなたが以前にマージしようと試みたファイルの特定のセットを持っているということです、しかしそれらはマージ競合を投げました。理想的には、マージの競合が発生した場合、手動でそれらを解決し、git add file.name && git commit -m "removed merge conflicts"を使用して変更をコミットする必要があります。今、別のユーザが自分のリポジトリで問題のファイルを更新し、そして彼の変更を一般的な上流レポジトリにプッシュしました。

そのため、最後のコミットからの(おそらく)最後のコミットからのマージの競合は解決されず、ファイルは完全にはマージされず、したがってファイルのUunmerged)フラグが使用されます。さて、あなたがgit pullを実行するとき、あなたがファイルのあるバージョンを持っているので、gitはエラーを投げています、そしてそれは正しく解決されません。

これを解決するには、git pullを実行する前に、問題のマージの競合を解決し、変更を追加してコミットする必要があります。

問題のサンプルの再現と解決策

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

まず、リポジトリ構造を作成しましょう

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

今私たちはrepo_cloneにいます、そしてあなたがgit pullをするならば、それは衝突を投げかけます

repo_clone $ git pull Origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> Origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

クローンの衝突を無視して、今すぐ元のリポジトリのコミットを増やすと、

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

そしてgit pullを実行します。

repo_clone $ git pull
U   file
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'.

fileは現在マージされていない状態にあり、git statusを実行すると、明らかに同じことがわかります。

repo_clone $ git status
On branch master
Your branch and 'Origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

したがって、これを解決するには、最初に無視したマージ競合を解決する必要があります。

repo_clone $ vi file

その内容を

text2
text1
text1

それを追加して変更をコミットします

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
173
mu 無

作業ディレクトリがクリーンでないときに、ローカルブランチにもう1つの新しいコミットを追加しようとしています。その結果、Gitはプルを拒否しています。次の図を考慮して、シナリオをよりよく視覚化します。

リモート:A <-B <-C <-D
ローカル:A <-B *
(*変更されているがコミットされていないファイルがあることを示します。)

この状況に対処するための2つのオプションがあります。ファイルの変更を破棄するか、保持することができます。

オプション1:変更を破棄する
マージされていないファイルごとにgit checkoutを使用するか、git reset --hard HEADを使用してブランチ内のすべてのファイルをHEADにリセットできます。ちなみに、ローカルブランチのHEADはBであり、アスタリスクはありません。このオプションを選択すると、ダイアグラムは次のようになります。

リモート:A <-B <-C <-D
ローカル:A <-B

プルすると、マスターからの変更を使用してブランチを早送りできます。プルした後、ブランチはマスターのようになります:

ローカル:A <-B <-C <-D

オプション2:変更を保持する
変更を保持する場合は、まず各ファイルのマージの競合を解決する必要があります。 IDEで各ファイルを開き、次の記号を探すことができます。

<<<<<<< HEAD
//コードのバージョン
========
//リモートのバージョンのコード
>>>>>>>

Gitは2つのバージョンのコードを提供しています。 HEADマーカー内に含まれるコードは、現在のローカルブランチのバージョンです。他のバージョンは、リモートから来ているものです。コードのバージョンを選択(およびマーカーとともに他のコードを削除)したら、git addと入力して、各ファイルをステージング領域に追加できます。最後のステップは、git commit -mと適切なメッセージを入力して結果をコミットすることです。この時点で、図は次のようになります。

リモート:A <-B <-C <-D
ローカル:A <-B <-C '

ここでは、リモートでのコミットCとは異なるため、作成したコミットにC 'というラベルを付けました。これで、プルしようとすると、早送りエラーが発生します。ブランチとリモートの両方が共通の祖先コミットBから分岐しているため、Gitはブランチのリモートで変更を再生できません。この時点で、プルしたい場合は別のgit mergeまたはgit rebaseリモートのブランチ。

Gitを習得するには、単方向リンクリストを理解して操作できる必要があります。この説明がGitの使用について正しい方向に考えてくれることを願っています。

37
Tim Biegeleisen

それに対する単純な解決策です。しかしそのためには、まず次のことを学ぶ必要があります。

vimdiff

紛争を取り除くには、

git mergetool

上記のコマンドは基本的に、競合ファイルごとに、ローカルファイル、混合ファイル、リモートファイル(合計3ファイル)を開きます。ローカルファイルとリモートファイルは参考用です。これらを使用して、混在ファイルに含めるかどうかを選択できます。ファイルを保存して終了します。

25
Pawan Seerwani

リモートブランチをプルダウンしてローカルで実行する(レビューやテストを目的とする)場合、そして$ git pullを実行するとローカルマージの競合が発生します。

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)
5
user5245397

あなたが引っ張ることができる前にマージされる必要があるローカルにいくつかのファイルがあります。ファイルをチェックアウトしてから、ローカルファイルを上書きすることができます。

git checkout app/config/app.php app/config/database.php app/routes.php
git pull Origin master
5
Nick

変更をマージしたくなくてもローカルを更新したくない場合は、コマンドに進みます。

git reset HEAD —hard

これはHEADであなたのローカルをリセットし、それからgit pullを使ってあなたのリモートを引っ張ります!

3
Santosh

私と同じ問題がありました
私の場合、手順は以下のとおりです。

  1. U(未マージ)記号で始まっていたすべてのファイルを削除しました。として-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. マスターからコードを取得

$ git pull Origin master
  1. 状況をチェック

 $ git status

これが登場したメッセージです -
そしてそれぞれ2つと1つの異なるコミットがあります。
(use "git pull" to merge the remote branch into yours)
あなたにはマージされていない道があります。
(fix conflicts and run "git commit")

マージされていないパス
(解像度をマークするには "git add ..."を使用してください)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. すべての新しい変更を追加しました -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. 頭に変更をコミット

$ git commit -am "resolved conflict of the app."
  1. コードを推進しました -

$ git Push Origin master

このターンでどのターンが解決されるか - enter image description here

1
S.Yadav

マージの競合が発生したら、個々のファイルを開くことができます。 「<<<<<<<または>>>>>>>」の記号が表示されます。これらはあなたの変更とリモートに存在する変更を参照します。あなたが手動で必要な部分を編集することができます。その後、ファイルを保存してから実行します。git add

マージの競合は解決されます。

0
dfordevy