どうしてgitは「マージされていないファイルがあるのでプルはできない」と言うのですか?


195

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

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"ですか、どうすれば解決できますか?


1
私の場合、これらのコマンド「git add」を使用しました。次に "git commit -m" Test "そして最後に" git push "エラーが削除されました
Akhzar Nazir

「$ git add <file>」を追加するだけで、コミットまたは復元する内容を更新したり(作業ディレクトリの変更を破棄したり)、「$ git commit」をコミットしたり、マージを終了したりするために「$ git push」したりするだけです。
find_X

それが役立つ場合:私は「git add」を実行していることに気づきました。その後、コミットは機能しませんでした。個々のファイルを名前で追加し、コミットしてプル/プッシュする必要がありました。
ouonomos

回答:


212

現在起こっていることは、以前にマージしようとした特定のファイルのセットがあり、それらがマージの競合を引き起こしたことです。理想的には、マージの競合が発生した場合、手動で解決し、を使用して変更をコミットする必要があり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、私たちのget

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

1
完全にするために、@ Pawanの回答を追加して、「git mergetool」を使用して競合を解決します。最後から2番目のステップはあまり実用的ではない場合があります(「マージを解決... [設定により...] ...その内容を:[一部のテキスト]」)
間違いなくロブ

または、@ user261のアドバイスを使用してマージできます。どちらにせよ、実用的な意味でマージする方法にステップを追加すると、この答えは完成すると思います。
間違いなくロブ

3
この答えは、単一のファイルで修正する単純な競合がある場合に非常にうまく機能します。たとえば、異なる1行または2行のコードです。大幅に変更された複数のファイルがある場合、これは難しい修正です。しかし、Gitを使用すると、困難な競合を回避するために頻繁にコミットする必要があるという考えが浮かび上がります。
ボーンD.テイラー

46

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

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

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

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

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

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

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

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

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

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

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

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

Gitを使いこなすには、単方向リンクリストを理解して操作できる必要があります。この説明で、Gitの使用について正しい方向に考えていただければ幸いです。


33

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

vimdiff

矛盾を取り除くには、

git mergetool

上記のコマンドは、競合するファイルごとに、基本的にローカルファイル、混合ファイル、リモートファイル(合計3ファイル)を開きます。ローカルファイルとリモートファイルは参照用であり、それらを使用して、混合ファイルに含める(または含めない)ファイルを選択できます。ファイルを保存して終了するだけです。


2
vimdiffは必要ないと思います(WinMergeやOSXの組み込みFileMergeなど、任意のマージ/差分ツールを使用できます)。そうは言っても、これは@muの答えに素晴らしい追加です。
間違いなくロブ

32

変更をマージしたくないがローカルを更新したい場合は、次を実行:

git reset --hard HEAD  

これにより、HEADでローカルがリセットされ、git pullを使用してリモートがプルされます。

マージをローカルでコミットしているが(まだリモートにプッシュしていない)、マージも元に戻したい場合:

git reset --hard HEAD~1 

6

リモートブランチをプルダウンしてローカルで実行したい場合(たとえば、確認やテストのために)、$ 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

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

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master

マージすると、2つのファイルの内容が結合されます。現在、ローカルファイルはリモートサーバー上のファイルとは異なります。マージはリモートサーバーで行う必要があります。したがって、編集したファイルをステージングしてプッシュすると、変更はリポジトリー上のファイルに追加されます。その後、ファイルが同期され、プロジェクト全体を他の変更でプルできます。gitを使い始めたとき、gitのヘルプブックが非常に役立ちました。あなたはここでそれを見つけることができます:git-scm.com/book/en/Getting-Started
ニック・

私はOPではないことに注意してください。「ファイルのマージ」は不適切な用語です。厳密に言えば、ファイルではなくコミットをマージします。
jub0bs 2014年

ああ、そうですね、私の方針です。私は簡単な答えを出そうとしていました
Nick

まあ、コミットをマージするときに競合がある場合は、はい、競合するマージされていないファイルがあり、それらをマージする必要があります。
エドワードトムソン

3

従うべき手順:

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

ありがとう、Sarbasish


2

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

  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

この画像でどのターンが問題を解決するか- ここに画像の説明を入力してください


1

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

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


-1

次のコマンドを実行するだけです:

git reset --hard

3
一部の人々は非常に失望されますので、彼らがしようとすると、それは彼らの現在のローカルな変更のすべてを削除したことを見つける場合は、コマンドが何をするか説明する必要があります:/
ジョセフBudin

これは、変更を外部の一時的なソースにコピーするだけで機能します。プロジェクトの構成ファイルの例など、いくつかのファイルしかない場合は、完璧です。コマンドを実行してから、変更を元に戻します。私のために働く!
cwiggo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.