1. ホーム
  2. git

[解決済み] Git Pullができない、ファイルがマージされない

2022-02-07 17:17:24

質問

この件に関する同様の質問をすべて読みましたが、以下のどれもがうまくいかないようです。

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

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

今、試したところです。

git stash
git pull

もうまくいきませんでした。

その他の情報

ローカルに1つコミットがあり、上流にもコミットがあります。そこで git pull --rebase が、やはりうまくいきません...。これでは、"exiting because an unresolved conflict"というエラーが出ます。もし私が git stash, git reset --hard HEAD, git pull --rebase というエラーが表示され、pullができません。

どうすればいいですか?

リモコンが origin で、ブランチは master を既に持っているとします。 master をチェックアウトした場合、次のようにするとよいでしょう。

git fetch origin
git reset --hard origin/master

これは基本的に、現在のブランチを受け取り、それを HEAD をリモートブランチの

警告 : コメントにある通りです。 を実行すると、ローカルでの変更が破棄されます。 オリジンにあるもので上書きする .

また、plumbingコマンドを使っても、基本的に同じことができます。

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 の内部ストレージ機構とは独立して動作します。 作業ディレクトリ . 以下のようにすることで

git reset --hard origin/master

git は、オリジン/マスターが指すのと同じハッシュ値を現在のブランチに向けます。そして、作業ディレクトリを強制的に変更して、そのハッシュのファイル構造/内容に一致させます。

この動作を確認するために、次のことを試してみてください。

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