Gitプルは不可能、マージされていないファイル


89

私はこれに関する同様の質問をすべて読みました。次のいずれも機能していないようです。

Delete offending files
git reset --hard HEAD
git stash
git pull

変更を隠し、リポジトリからプルするほぼすべての組み合わせにより、マージできないファイルが生成されます。ローカルの変更をすべて破棄してリモートを使用したいのですが、再度クローンを作成することはできません(開発者がこれを実行しようとすると、帯域幅とインターネットの使用制限が発生します)。どうすればよいですか?

試したばかり:

git stash
git pull

また、動作しませんでした。

より詳しい情報

ローカルコミットが1つあり、アップストリームにもコミットがあります。私はこのように試しましたgit pull --rebaseが、それでも正しく機能していません...それは私にエラーを与えます-「未解決の競合のために終了します」。私が行う場合git stash, git reset --hard HEAD, git pull --rebase、私はエラーを取得する「プルができない、マージされていない変更...」

回答:


199

リモートがoriginで、ブランチがでmaster、すでにmasterチェックアウトしているとすると、次のことを試してみてください。

git fetch origin
git reset --hard origin/master

これは基本的に、現在のブランチを取得してHEAD、リモートブランチのを指すだけです。

WARNING:コメントで述べたように、これはローカルの変更を捨てます、原点にあるものは何でもして上書きします

または、配管コマンドを使用して、基本的に同じことを行うことができます。

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

編集:これが機能する理由を簡単に説明したいと思います。

.gitフォルダは、リポジトリの任意の数のコミットを保持することができます。コミットハッシュは、実際には、ランダムに生成された値ではなく、コミットの内容の検証方法であるため、リポジトリ間でコミットセットを照合するために使用されます。

ブランチは、特定のハッシュへの名前付きポインターです。セットの例を次に示します。

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

これらの各ファイルには、コミットを指すハッシュが含まれています。

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

これらはすべて内部gitストレージメカニズム用であり、作業ディレクトリとは独立して機能します。次の手順を実行します。

git reset --hard origin/master

gitは、origin / masterが指すのと同じハッシュ値で現在のブランチを指します。次に、そのハッシュのファイル構造/コンテンツに一致するように作業ディレクトリを強制的に変更します。

これが機能していることを確認するには、次のことを試してください。

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD

2
最近承認された編集から、冒頭に大規模な警告を追加しました。これは、すでに述べたように、「次に、[git]は、そのハッシュのファイル構造/コンテンツに一致するように作業ディレクトリを強制的に変更します。」しかし、それは十分に明確ではなかったと思います。
トレバーノリス


5

次のコマンドセットを使用して解決しました。

git reset --hard
git pull --rebase
git rebase --skip
git pull

秘訣は、変更をリベースすることです... 1つの些細なコミットをリベースするのに問題があったため、(ファイルをコピーした後)git rebase--skipを使用してスキップしました。


3

を実行した後にこの問題が発生しgit fetch、その後gitがgit pullマージの競合(変更されたファイルとマージされていないファイルの両方)のために実行を許可しない場合、さらにイライラさせるために、競合マーカーは表示されませんまだマージされていないため、ファイル)。仕事を失いたくない場合は、次のことができます。

ファイルをステージングします。

$ git add filename

次に、ローカルの変更を隠します。

$ git stash

作業ディレクトリをプルして更新します

$ git pull

ローカルで変更されたファイルを復元します(可能な場合はgitが自動的にマージし、そうでない場合は解決します)

$ git stash pop

それが役立つことを願っています。


2

ローカルの変更を削除したくない場合でも、解決策があります。マージされていgit addないファイルを(またはでgit remove)修正するだけです。次に、実行しますgit pull


1

変更を破棄したい場合は、最初にの出力を確認してくださいgit status。横に「マージされていない」と表示されているファイルについては、を実行しgit add <unmerged file>ます。次に、をフォローアップしgit reset --hardます。これにより、追跡されていないファイルを除くローカルの変更がgitで削除されます。


そうそう。「マージされていない」とは言えない場合があります。また、「両方とも変更された」または1つまたは2つの他のことを言うこともできます。の出力はgit status何ですか?
ライアンスチュワート

これを投稿した後、私はチームメンバーに試してみるように言っています。git rebase --abortそしてgit pull --rebase、gitの提案に従って
Christian Stewart

1

gitで解決し、マージされていないファイルをローカルで削除しました。

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

後でgitcommitを送信すると:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

0

ライアン・スチュワートの答えはもうすぐそこにありました。ローカルの変更を実際に削除したくない場合は、マージに使用できるワークフローがあります。

  • 実行しますgit status。マージされていないファイルのリストが表示されます。
  • それらをマージします(手作業など)
  • 実行 git commit

Gitはマージだけを新しいコミットにコミットします。(私の場合、ディスク上に追加のファイルがありましたが、それらはそのコミットにまとめられていませんでした。)

次に、Gitはマージが成功したと見なし、先に進むことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.