1

これは以前に尋ねられたかもしれませんが、答えが見つかりません。

次のシナリオを想定します。

次のローカルブランチを持つローカルリポジトリがあります。

Scenario 1 

local
    Branch A
    Branch B
    Branch C (not reachable from A or B)

ブランチ A でプルを実行した場合、暗黙的に B と C のフェッチを実行しますか? フェッチは、プル操作で行われるのとは異なり、ただフェッチを行うだけですか?

C でフェッチする場合、A と B の HEAD をフェッチしますか?

ブランチ A のみがローカルにチェックアウトされているシナリオ 2 についてはどうでしょうか。

Scenario 2

local
    Branch A

Remote
    Branch A
    Branch B
    Branch C (not reachable from A or B)
4

1 に答える 1

1
  • 2 つのシナリオの説明 (およびその違い) は明確ではありません。なぜなら、リモートにいくつかのブランチ名AB、およびがある場合、それは、およびとC同様に常にローカル リポジトリに存在するからです (ブランチをローカルでチェックアウトしたかどうかに関係なく、リモートまたは) を使用して。origin/Aorigin/Borigin/Cgit fetchgit pull

  • fetchリモートからコミットの更新されたリストを取得するために使用されます。fetch操作の最初のコマンドとして実行されpullます。

    一般的な構文は次のとおりです。git fetch <REMOTE> <REFSPEC>

    refspec 引数はオプションです。指定しない場合、git はリモートからすべての参照を取得します。refs によって、refspec に到達可能なすべてのヘッドとタグが含まれます。

  • refspecgit pull <REMOTE>を指定しないコマンドは、マージ先の現在のローカル ブランチに対応するコミットだけでなく、リモートからすべての ref を取り込みます

  • git pull originシナリオ 1 で、現在 branch をチェックアウトしているときにa を実行するとA、git はローカル リポジトリでorigin/Aorigin/B、およびを更新します。origin/Cさらに、 にマージorigin/AされAます。

  • シナリオ 1 で を実行すると、ローカル リポジトリgit fetch origin Cのみが更新されます。origin/Cこのため、マージもまったくありませんfetch

  • シナリオ 2 では、シナリオ 1 と同じ結果が得られます。リモートからのすべての参照は、ローカル リポジトリの<REMOTE_NAME>/BLAHブランチに更新されます。実際、シナリオ 2 はシナリオ 1 と何ら変わりはありませんが、チェックアウトするローカル ブランチの数が少ないというだけで、これはfetch操作には関係ありません。

git pull origin <BRANCHNAME>ところで、何をして何をするかについてのコメントであなたの質問に答えてくださいgit fetch origin <BRANCHNAME>

  • git pull origin <BRANCHNAME>あなたが期待するものとは違うことをします。

    • git は<BRANCHNAME>、リモートからのコミットを のFETCH_HEAD代わりに に取り込みますorigin/<BRANCHNAME>
    • 更新しないorigin/<BRANCHNAME>
    • 現在チェックアウトされているブランチにマージFETCH_HEADされるため、ローカル ブランチの状態に関する限り、同様の最終結果が得られます。
  • git fetch origin <BRANCHNAME>のコミットをリモートから にgit pull origin <BRANCHNAME>持ち込むだけで停止することを除いて、上記と非常によく似た動作をします。<BRANCHNAME>FETCH_HEAD

  • 特定のブランチに対応するコミットのみを取得したい場合は、正しい refspec 引数を使用する必要があります。詳しくはこちらをご覧ください。remoteoriginおよび branchからコミットのみをフェッチするmasterには、正しいコマンドは次のようになります。

     git pull origin refs/heads/master:refs/remotes/origin/master
    
  • refspecs を使用して、ローカル ブランチにマージせずfetchにコミットのみをフェッチすることもできます。origin/master

     git fetch origin refs/heads/master:refs/remotes/origin/master
    
  • の長い refspec を入力したくない場合git pull、およびリモートからのすべての ref に関する情報を取得することを気にしない場合、およびリモート トラッキング ブランチ セットを持っていない場合は、次のようにすることができます。

    git fetch origin
    git checkout <BRANCH-THAT-NEEDS-TO-BE-MERGED-INTO>
    git merge origin/<BRANCH-TO-BE-MERGED-FROM>
    

ボーナス - 何をしGIT_FETCH_HEADますか?

これは、リモート リポジトリからのフェッチを追跡するために git によって使用される短命の参照です。FETCH_HEADファイル を調べると、 の現在の値を確認できます.git/FETCH_HEAD。例えば:

72a90cf95456b14630ddff427c3df1b00be24670                branch 'master' of git://github.com/foo/bar.git
于 2013-04-27T17:59:37.827 に答える