リモートトラッキングブランチから「git fetch」および「git merge」する方法(「git pull」など)


111

gitでいくつかのリモートトラッキングブランチを設定しましたが、 'git fetch'でそれらを更新すると、ローカルブランチにマージすることができないようです。

たとえば、「another-other-branch」というリモートブランチがあるとします。私はそれを使用して追跡ブランチとしてローカルに設定しました

git branch --track an-other-branch origin/an-other-branch

ここまでは順調ですね。しかし、そのブランチが更新され(通常、私はマシンを移動し、そのマシンからコミットする)、元のマシンでそれを更新したい場合、フェッチ/マージで問題が発生しています。

git fetch origin an-other-branch
git merge origin/an-other-branch

これを行うと、「最新のメッセージ」が表示され、何もマージされません。

ただし、

git pull origin an-other-branch

常にあなたが期待するようにそれを更新します。

また、git diffを実行する

git diff origin/an-other-branch

違いがあることを示しているので、構文が間違っていると思います。

何が悪いのですか?

編集[2010-04-09]:何度か確認しましたが、間違いなく別のブランチにはいません。'git fetch'の後に 'git merge'(上記のように)を実行すると、git pullとまったく同じことを行う必要がありますか?gitステータスなどの結果を示すワークフローを取得します。

回答:


170

ブランチをフェッチするのではなく、リモート全体をフェッチします。

git fetch origin
git merge origin/an-other-branch

8
詳細: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を使用します)。
クリスジョンセン2010

オリジンに1000のブランチがある場合、それらすべてのリモートブランチを使用しますか?
Gauthier

4
承知しました。私は私の1000軒の支店を持つリモートリポジトリを追加しました、と私はリモートが持っているものを枝尋ねれば、それは気も良く、私にすべての千与える
ギャレス・

git merge origin/an-other-branchマージorigin/an-other-branchそれを追跡するように設定されているすべてのローカルブランチに?どうすれば1つのローカルブランチのみにマージできますか?
両生類2014

1
では、git pull(引数なしで)何をしますか-どのブランチをマージしますか?現在のブランチに対応するリモート追跡ブランチをマージしますか?
2015

69

ブランチを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つのブランチに注意してください。

  1. リモートリポジトリのブランチ:refs/heads/branchB他のリポジトリ内
  2. あなたのリモート追跡ブランチrefs/remotes/remoteR/branchB、あなたのレポ
  3. あなた自身のブランチ: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などを設定します


1
Git Internalsへのリンクがこの同じ質問へのリンクであることをご存知ですか?
Shahbaz

9

an-other-branchマージするときにローカルにいることを確認しますか?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

その他の説明

マージしようとしているブランチからのすべての変更は、現在作業中のブランチにすでにマージされています。
より具体的には、マージしようとしているブランチが現在のブランチの親であることを意味します

リモートリポジトリよりも1コミット進んでいる場合、古くなっているのはリモートリポジトリであり、あなたではありません。

しかし、あなたの場合、うまくいけばgit pull、それはあなたが正しいブランチにいないことを意味します。


3

Gitプルは実際にはコンボツールです:git fetch(変更を取得)とgit merge(現在のコピーとマージ)を実行します

あなたは正しいブランチにいますか?


OPは差があると思います。ブランチ、私に起こります。
Chaklader Asfak Arefe

1

これらはコマンドです:

git fetch origin
git merge origin/somebranch somebranch

2行目でこれを行う場合:

git merge origin somebranch

ローカルマスターを現在のブランチにマージしようとします。

私が理解しているように、質問はあなたがすでにローカルでフェッチしていて、ブランチを同じブランチの最新のものにマージしたいということでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.