114

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

たとえば、「an-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

常に期待どおりに更新します。

また、gitdiffを実行します

git diff origin/an-other-branch

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

私は何が間違っているのですか?

編集[2010-04-09]:私は数回チェックしました、そして私は間違いなく別のブランチにいません。「gitfetch」の後に「gitmerge」(上記のように)を続けると、git pullとまったく同じことを行う必要がありますか?gitステータスなどの結果を示すワークフローを取得します。

4

5 に答える 5

175

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

git fetch origin
git merge origin/an-other-branch
于 2010-04-08T19:08:06.963 に答える
70

ブランチを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つの異なるブランチに注意する必要があります。

  1. リモートリポジトリのブランチ:refs/heads/branchB他のリポジトリ内
  2. リモートトラッキングブランチ:リポジトリrefs/remotes/remoteR/branchB
  3. あなた自身のブランチ:あなたのリポジトリrefs/heads/branchB

(内の)リモート追跡ブランチrefs/remotesは読み取り専用です。それらを直接変更しないでください。独自のブランチを変更してから、リモートリポジトリの対応するブランチにプッシュします。refs/remotes結果は、適切なプルまたはフェッチが完了するまで、に反映されません。その区別は、gitのマンページから理解するのが困難でした。主な理由は、ローカルブランチ( )が定義refs/heads/branchB時にリモートトラッキングブランチを「追跡」すると言われているためです。.git/configbranch.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_HEADMERGE_ORIG

于 2011-01-17T23:32:11.757 に答える
11

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

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

他の説明

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

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

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

于 2010-04-08T18:52:49.023 に答える
3

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

正しいブランチにいることを確認しますか?

于 2010-04-08T18:54:12.267 に答える
1

これらはコマンドです:

git fetch origin
git merge origin/somebranch somebranch

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

git merge origin somebranch

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

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

于 2013-07-21T17:50:18.827 に答える