web-dev-qa-db-ja.com

git pull Origin masterはOrigin / masterを更新しませんか?

ドキュメントによると、git pullgit 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ページを調べましたが、これを示唆するものは見当たりませんでしたが、見落としていたかもしれません。

36

ちょっと変ですが、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
29
Cascabel

リポジトリをフォークしており、フォークされたブランチが最新のコードで更新されていないようです

0
Nishant Ranjan