ブランチを1つだけ選択:fetch/ merge vs. pull
「フェッチ」と「マージ」を分離するように勧められることがよくあります。彼らはこれの代わりにこう言います:
git pull remoteR branchB
これを行う:
git fetch remoteR
git merge remoteR branchB
彼らが触れていないのは、そのようなフェッチコマンドは実際にはリモートリポジトリからすべてのブランチをフェッチするということです。これは、そのプルコマンドが行うことではありません。リモートリポジトリに数千のブランチがあるが、それらすべてを表示したくない場合は、次のあいまいなコマンドを実行できます。
git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
git branch -a # to verify
git branch -t branchB remoteR/branchB
もちろん、これは.git/config途方もなく覚えるのが難しいので、本当にすべてのブランチをフェッチしないようにしたい場合は、ProGitで説明されているように変更することをお勧めします。
え?
これらすべての最良の説明は、ProGitの第9-5章、Git Internals-The Refspec(またはgithub経由)にあります。それをグーグル経由で見つけるのは驚くほど難しい。
まず、いくつかの用語を整理する必要があります。リモートブランチトラッキングの場合、通常、次の3つのブランチに注意してください。
- リモートリポジトリのブランチ:
refs/heads/branchB他のリポジトリ内
- あなたのリモート追跡ブランチ:
refs/remotes/remoteR/branchBで、あなたのレポ
- あなた自身のブランチ:
refs/heads/branchB内部のあなたのレポ
リモートトラッキングブランチ(内refs/remotes)は読み取り専用です。それらを直接変更することはありません。自分のブランチを変更してから、リモートリポジトリの対応するブランチにpushします。結果はrefs/remotes、適切なプルまたはフェッチの後まで反映されません。その区別は、gitのmanページから理解するのが困難でした。主に、ローカルブランチ(refs/heads/branchB)が.git/config定義時にリモート追跡ブランチを「追跡」すると言われているためbranch.branchB.remote = remoteRです。
'refs'はC ++ポインターと考えてください。物理的には、SHAダイジェストを含むファイルですが、基本的にはコミットツリーへのポインタにすぎません。git fetchコミットツリーに多くのノードを追加しますが、gitが移動するポインタを決定する方法は少し複雑です。
別の答えで述べたように、どちらも
git pull remoteR branchB
また
git fetch remoteR branchB
移動するrefs/remotes/branches/branchBと、後者は確かに移動することはできませんrefs/heads/branchB。ただし、どちらも移動しFETCH_HEADます。(catこれらのファイルのどれでも、いつ.git/変更されるかを確認できます。)そして、git mergeを参照しFETCH_HEADながらMERGE_ORIG、などを設定します。
git fetch origin an-other-branchフェッチしたチップをに保存しますがFETCH_HEAD、保存しませんorigin/an-other-branch(つまり、通常の「リモートトラッキングブランチ」)。したがって、1つは実行できますがgit fetch origin an-other-branch && git merge FETCH_HEAD、@ Garethが言うようにそれを実行することをお勧めします(または単にgit pullを使用します)。