ターミナルでプロジェクトディレクトリを引き込もうとすると、次のエラーが表示されます。
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"
と言っているのですか。
現在起こっていることは、あなたが以前にマージしようと試みたファイルの特定のセットを持っているということです、しかしそれらはマージ競合を投げました。理想的には、マージの競合が発生した場合、手動でそれらを解決し、git add file.name && git commit -m "removed merge conflicts"
を使用して変更をコミットする必要があります。今、別のユーザが自分のリポジトリで問題のファイルを更新し、そして彼の変更を一般的な上流レポジトリにプッシュしました。
そのため、最後のコミットからの(おそらく)最後のコミットからのマージの競合は解決されず、ファイルは完全にはマージされず、したがってファイルのU
(unmerged
)フラグが使用されます。さて、あなたが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
作業ディレクトリがクリーンでないときに、ローカルブランチにもう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の使用について正しい方向に考えてくれることを願っています。
それに対する単純な解決策です。しかしそのためには、まず次のことを学ぶ必要があります。
vimdiff
紛争を取り除くには、
git mergetool
上記のコマンドは基本的に、競合ファイルごとに、ローカルファイル、混合ファイル、リモートファイル(合計3ファイル)を開きます。ローカルファイルとリモートファイルは参考用です。これらを使用して、混在ファイルに含めるかどうかを選択できます。ファイルを保存して終了します。
リモートブランチをプルダウンしてローカルで実行する(レビューやテストを目的とする)場合、そして$ 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)
あなたが引っ張ることができる前にマージされる必要があるローカルにいくつかのファイルがあります。ファイルをチェックアウトしてから、ローカルファイルを上書きすることができます。
git checkout app/config/app.php app/config/database.php app/routes.php
git pull Origin master
変更をマージしたくなくてもローカルを更新したくない場合は、コマンドに進みます。
git reset HEAD —hard
これはHEADであなたのローカルをリセットし、それからgit pullを使ってあなたのリモートを引っ張ります!
私と同じ問題がありました
私の場合、手順は以下のとおりです。
U project/app/pages/file1/file.ts
U project/www/assets/file1/file-name.html
$ git pull Origin master
$ 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
$ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
$ git commit -am "resolved conflict of the app."
$ git Push Origin master
マージの競合が発生したら、個々のファイルを開くことができます。 「<<<<<<<または>>>>>>>」の記号が表示されます。これらはあなたの変更とリモートに存在する変更を参照します。あなたが手動で必要な部分を編集することができます。その後、ファイルを保存してから実行します。git add
マージの競合は解決されます。