ドキュメントによると、git pullはgit fetchを実行してからgit mergeを実行しますが、その場合はgit pull Origin masterを実行して- git fetch Origin masterそうですか?ただし、そうではないようです。以下に例を示します。
私のリモートOriginマスター(私の場合はGitHubにある)の履歴は次のとおりです。
commit 1111111 : my first commit
commit 2222222 : a commit from someone else
そして、私は次のショーを行うようにローカルで私の最初のコミットのみを持っています
git checkout master
git log --pretty=format:'%h' -n 1
1111111
git checkout Origin/master
git log --pretty=format:'%h' -n 1
1111111
ここからプルを実行し、次のように結果を確認します。
git checkout master
git pull Origin master
git log --pretty=format:'%h' -n 1
2222222
git checkout Origin/master
git log --pretty=format:'%h' -n 1
1111111
ご覧のように、プルは実際にマスターブランチをリモートOriginからの新しいコミットで更新しましたが、ローカルOrigin/masterはまだ元の場所にあります。次のことを強制する
git fetch Origin master
git checkout Origin/master
git log --pretty=format:'%h' -n 1
2222222
これはgit pullの正しい動作ですか、何か設定が間違っている可能性がありますか?私はgit pullのmanページを調べましたが、これを示唆するものは見当たりませんでしたが、見落としていたかもしれません。
ちょっと変ですが、git pull [remote] <refspec>
を使用すると、実際にはリモート参照が更新されません。特定の方法で考える場合、それは一種の理にかなっています:フェッチする特定のrefを指定しているので、リモートブランチについて何も調べる必要がないので、それは本質的にどのリモートブランチを知っていない更新する必要があります。もちろんそれを理解することができ、最終的に修正されても驚かないでしょうが、それは既存の動作です。 (それについてのメーリングリストにメッセージがあるかもしれません-私は知りません。)
ただし、簡単に回避できます。 git pull Origin/master
を使用する場合、リモートブランチを介してフェッチするものを指定しているため、そのリモートブランチを更新する必要があります。マスターブランチ(またはOrigin/masterを追跡する他のブランチ)を使用している場合は、git pull
を実行し、デフォルトを入力するだけで、リモートブランチが更新されます。
これはgit-pull
のmanページに文書化されており、最も簡潔な例は他にもあります。関連部分:
次に、現在のブランチにリモートブランチをマージします。
$ git pull Origin next
これにより、次のコピーがFETCH_HEADに一時的に残りますが、リモート追跡ブランチは更新されません。リモートトラッキングブランチを使用して、フェッチとマージを呼び出すことで同じことができます。
$ git fetch Origin $ git merge Origin/next
リポジトリをフォークしており、フォークされたブランチが最新のコードで更新されていないようです