ブランチを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-Refspec(またはgithub経由)にあります。それをグーグルで見つけるのは驚くほど難しい。
まず、いくつかの用語を明確にする必要があります。リモートブランチ追跡の場合、通常、次の3つの異なるブランチに注意する必要があります。
- リモートリポジトリのブランチ:
refs/heads/branchB
他のリポジトリ内
- リモートトラッキングブランチ:リポジトリ
refs/remotes/remoteR/branchB
内
- あなた自身のブランチ:あなたのリポジトリ
refs/heads/branchB
内
(内の)リモート追跡ブランチrefs/remotes
は読み取り専用です。それらを直接変更しないでください。独自のブランチを変更してから、リモートリポジトリの対応するブランチにプッシュします。refs/remotes
結果は、適切なプルまたはフェッチが完了するまで、に反映されません。その区別は、gitのマンページから理解するのが困難でした。主な理由は、ローカルブランチ( )が定義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