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
常に期待どおりに更新します。
また、git diffを実行します
git diff Origin/an-other-branch
違いがあることを示しているので、構文が間違っていると思います。
私は何が間違っていますか?
EDIT [2010-04-09]:何度か確認しましたが、間違いなく別のブランチにはいません。 「git fetch」の後に「git merge」(上記を参照)を実行すると、git pullとまったく同じことが行われますか? gitステータスなどの結果を示すワークフローを取得します。
ブランチをフェッチするのではなく、リモート全体をフェッチします。
git fetch Origin
git merge Origin/an-other-branch
fetch
/merge
vs。pull
多くの場合、「フェッチ」と「マージ」を分離することを勧められます。彼らはこれの代わりに言う:
git pull remoteR branchB
これを行う:
git fetch remoteR
git merge remoteR branchB
彼らが言及していないのは、そのようなフェッチコマンドは実際にリモートレポジトリからallブランチをフェッチするということです、それはnotそのpullコマンドの動作。リモートリポジトリに数千のブランチがあるが、それらのすべてを表示したくない場合は、このあいまいなコマンドを実行できます。
git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
git branch -a # to verify
git branch -t branchB remoteR/branchB
もちろん、それを覚えるのはとてつもなく難しいので、本当にすべてのブランチをフェッチしたくない場合は、ProGitで説明されているように.git/config
を変更することをお勧めします。
このすべての最良の説明は、ProGitの9-5章、 Git Internals-The Refspec ( またはgithub経由 )にあります。 Googleで見つけるのは驚くほど難しい。
まず、いくつかの用語を明確にする必要があります。リモートブランチトラッキングの場合、通常、次の3つのブランチに注意する必要があります。
refs/heads/branchB
他のリポジトリ内refs/remotes/remoteR/branchB
inyourリポジトリrefs/heads/branchB
insideyourrepoリモート追跡ブランチ(refs/remotes
内)は読み取り専用です。それらを直接変更しないでください。独自のブランチを変更してから、リモートリポジトリの対応するブランチにプッシュします。適切なプルまたはフェッチを行うまで、結果はrefs/remotes
に反映されません。主にrefs/heads/branchB
が.git/config
を定義するときにローカルブランチ(branch.branchB.remote = remoteR
)がリモートトラッキングブランチを「追跡」すると言われているため、この区別はgitマンページから理解するのが困難でした。 。
「参照」をC++ポインターと考えてください。物理的には、SHAダイジェストを含むファイルですが、基本的にはコミットツリーへの単なるポインターです。 git fetch
は多くのノードをコミットツリーに追加しますが、gitが移動するポインターを決定する方法は少し複雑です。
別の答え で述べたように、どちらも
git pull remoteR branchB
また
git fetch remoteR branchB
refs/remotes/branches/branchB
を移動し、後者は確かにrefs/heads/branchB
を移動できません。ただし、両方ともFETCH_HEAD
を移動します。 (.git/
内のこれらのファイルのcat
は、いつ変更されるかを確認できます。)git merge
は、FETCH_HEAD
を設定しながら、MERGE_ORIG
を参照しますなど
マージするときに、ローカルan-other-branch
にいることを確認しますか?
git fetch Origin an-other-branch
git checkout an-other-branch
git merge Origin/an-other-branch
その他の説明 :
マージしようとしているブランチからのすべての変更は、現在使用しているブランチに既にマージされています。
具体的には、マージしようとしているブランチが現在のブランチの親であることを意味します1回のコミットでリモートリポジトリより先に進んでいる場合、古くなっているのはリモートリポジトリであり、あなたではありません。
しかし、あなたの場合、git pull
が機能する場合、それはちょうどあなたが正しいブランチにいないことを意味します。
Git pullは実際にはコンボツールです:git fetch(変更を取得)とgit merge(現在のコピーにマージ)を実行します
本当に正しいブランチにいるのですか?
これらはコマンドです:
git fetch Origin
git merge Origin/somebranch somebranch
2行目でこれを行う場合:
git merge Origin somebranch
ローカルマスターを現在のブランチにマージしようとします。
私が理解したように、質問はすでにローカルにフェッチされていて、ブランチを最新のsameブランチにマージしたいというものでした。