34

私は Git に慣れようとしているので、これは主に好奇心によるものです。「git fetch」のドキュメントを見ましたが、以下の明確な説明がありません。事前に感謝します。これが非常に明白である場合はお詫び申し上げます。

1) GitHub などの中央リポジトリから、website2 台のマシンのそれぞれにある名前のリポジトリを複製しHostAHostB.

2) でHostA、ファイルに変更を加えて、README.txtコミットします。
この時点で、ブランチと HostAブランチのコミットは、まだプッシュしていないため、予想どおり異なりますmasterorigin/master

git show master
git show origin/master

異なるハッシュを報告する (master変更がある場合とorigin/masterない場合)

3) 一度押すと、その後は同じです。


4) ではHostB、次のようにすると、次のようになります。

git fetch
git merge FETCH_HEAD

その後、HostBでクエリを実行したときに同じハッシュmasterを報告しますorigin/mastergit show

しかし

代わりに私がやった場合HostB

git fetch origin master
git merge FETCH_HEAD

その時点で、ハッシュはまだ異なります。

git show origin
git show origin/master

異なるハッシュを報告する

プレーンを実行するまで追跡ブランチorigin/masterは更新されませんgit fetch

どうしてこれなの?

4

3 に答える 3

34

ブランチにリモート追跡ブランチが関連付けられている場合、その構成は次のようになります。

git config branch.[branch-name].remote [remote-name]
git config branch.[branch-name].merge [remote-master]

git fetch2 つのコマンドの違いを説明する重要な部分は次のとおりです。

<refspec>

パラメータの形式<refspec>は、オプションのプラス+、その後にソース ref <src>、コロン:、宛先 ref が続きます<dst>
一致するリモート ref<src>がフェッチされ、が空の文字列でない場合<dst>は、一致するローカル ref が を使用して早送りされ<src>ます。

繰り返します:

が空の文字列でない場合<dst>、それに一致するローカル ref は を使用して早送りされ<src>ます。
知っています:

  • git fetchgit fetch origin master:masterは(ブランチ構成のデフォルト値から) と同等であるため、リモート追跡ブランチが更新されます: refspec の宛先が指定されています

  • git fetch origin mastergit fetch origin master:" " ではなく" "と同等git fetch origin master:masterです。master' ' ブランチ (リモート ' origin' の)のフェッチされた値を に保存しFETCH_HEAD、' master' ブランチまたはリモート追跡 ' remotes/origin/master' ブランチ ( Jakub Narębski回答から)
    には保存しません。 refspec

于 2012-08-10T06:14:15.620 に答える
1

早送りしたい場合は自分でマージするか、git pull を使用してください。git fetch の目的が作業ツリーを更新することではないことを理解していないようです。Fetch は、追跡ブランチを更新するためのものです。

于 2013-06-12T20:14:32.270 に答える
1

答えは、 から返されるメッセージにありますgit fetch。最初のケースでは、refspec を提供せずにフェッチすると、リモート トラッキング ブランチが更新されていることがわかります。

remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
   c67d1c8..1941673  master     -> origin/master

オリジン/マスターがオリジンからのマスターで更新されたことをメッセージがどのように示しているかに注意してください。

refspec を指定する 2 番目のケースでは、まったく異なる結果が得られます。

remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
 * branch            master     -> FETCH_HEAD

そのため、refspec を指定すると、リモート トラッキング ブランチ (origin/master) は更新されず、FETCH_HEAD のみが更新されます。

最終結果は、実際にはそうでない場合でも、オリジン/マスターよりも進んでいるように見えることです。この動作が望ましい理由は想像できませんが、これは fetch コマンドの興味深いちょっとした癖であることは間違いありません。

于 2012-08-10T00:11:55.467 に答える