TL; DRバージョン:origin/master
以前はリモートトラッキングブランチが存在していましたが、現在は存在しないため、ローカルブランチsource
は存在しないものを追跡しているため、疑わしいだけです。 Gitはそれについて警告しています。「アップストリームトラッキング」機能が意図したとおりに機能することなく問題なく進んでいるため、何かを変更するかどうかはあなた次第です。
アップストリーム設定の別の方法については、なぜ「git push --set-upstream origin <branch>」を実行する必要があるのかを参照してください。
この警告はGitの新しいもので、Git 1.8.5で最初に登場しました。リリースノートには、短い箇条書きが1つだけ含まれています。
- 「git branch -v -v」(および「git status」)は、他のブランチに基づいていないブランチ、上流のブランチと同期しているブランチ、および上流で設定されているブランチを区別しませんでした存在しないブランチ。
それが何を意味するかを説明するには、まず「リモート」、「リモート追跡ブランチ」、およびGitが「アップストリームの追跡」を処理する方法について知る必要があります。(リモートトラッキングブランチはひどく欠陥のある用語です。代わりにリモートトラッキング名を使い始めましたが、これは少し改善されたと思います。ただし、以下では、Gitのドキュメントとの整合性を保つために「リモートトラッキングブランチ」を使用します。 )
それぞれ、「リモート」のように、単に名前であるorigin
か、octopress
このケースでは。それらの目的は、あなたgit fetch
またはgit pull
更新元の場所の完全なURLなどを記録することです。1を使用すると、Gitは(保存されたURLを使用して)そのリモートにアクセスし、適切な一連の更新を引き継ぎます。また、「リモート追跡ブランチ」を使用して更新を記録します。git fetch remote,
「リモート追跡ブランチ」(またはリモート追跡名)は、単に「リモート」で最後に見たブランチ名の記録です。各リモートはそれ自体がGitリポジトリであるため、ブランチがあります。リモートの "origin"のブランチは、のローカルリポジトリに記録されますremotes/origin/
。あなたが示したテキストは、名前付きブランチがあることを言うsource
にはorigin
、名前付きの支店2.1
、linklog
などにoctopress
。
(もちろん、「通常」または「ローカル」ブランチは、自分のリポジトリに作成したブランチ名にすぎません。)
最後に、(ローカル)ブランチを設定して、「リモートトラッキングブランチ」を「追跡」することができます。ローカルブランチL
がリモートトラッキングブランチを追跡するように設定されるとR
、GitはR
その「アップストリーム」を呼び出して、(コミットに関して)アップストリームの「先」または「後ろ」のどちらであるかを通知します。これは、ローカルブランチのために(でもお勧め可能な)普通のことだとリモート追跡の枝のように、(リモートプレフィックス部分を除く)と同じ名前を使用するsource
とorigin/source
、それは実際には必要ありません。
そしてこの場合、それは起こっていません。source
リモート追跡ブランチを追跡するローカルブランチがありorigin/master
ます。
Gitがリモートブランチを追跡するためにローカルブランチをセットアップする方法の正確なメカニズムを知っている必要はありませんが、それらは以下に関連するので、これがどのように機能するかを示します。まず、ローカルブランチ名から始めますsource
。この名前を使用する2つの構成エントリー、spelled branch.source.remote
およびがありbranch.source.merge
ます。表示された出力から、両方が設定されていることが明らかであるため、指定されたコマンドを実行すると、次のように表示されます。
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
これらをまとめると、2これは、ブランチsource
が「リモート追跡ブランチ」を追跡することをGitに伝えますorigin/master
。
しかし、今度はの出力を見git branch -a
てください。これは、リポジトリ内のすべてのローカルおよびリモート追跡ブランチ名を示しています。リモートトラッキング名はremotes/
...にリストされ、はありませんremotes/origin/master
。おそらく一度はあったと思われますが、今はなくなっています。
Gitは、を使用して追跡情報を削除できることを通知しています--unset-upstream
。これは、両方をクリアしますbranch.source.origin
とbranch.source.merge
、警告を停止します。
しかし、あなたが望むのは、追跡から別のものの追跡に切り替えるorigin/master
ことです。おそらくorigin/source
、octopress/
名前の1つです。
これはgit branch --set-upstream-to
、3で実行できます。例:
$ git branch --set-upstream-to=origin/source
(もしあなたがまだブランチ「ソース」origin/source
にいて、それがあなたが望むアップストリームであると仮定します-でも、もしあれば、実際にあなたが望むものを私が知る方法はありません)。
(既存のGitブランチをリモートブランチに追跡させる方法も参照してください。)
ここにたどり着いた方法は、最初にを作成したgit clone
ときに、クローン元からブランチにブランチがあったことだと思いますmaster
。master
追跡するように設定されたブランチもありましたorigin/master
(これはgitの通常の標準セットアップです)。これは、あなたが持っていた意味branch.master.remote
とbranch.master.merge
セットにorigin
してrefs/heads/master
。しかし、その後、origin
リモコンの名前がからmaster
に変更されましたsource
。一致するように、あなたのローカル名もからmaster
に変更したと思いますsource
。これにより、設定の名前がbranch.master.remote
to branch.source.remote
とfrom branch.master.merge
からbranch.source.merge
...に変更されましたが、古い値が残っているため、branch.source.merge
間違っていました。
「上流」のリンケージが壊れたのはこの時点でしたが、1.8.5より古いGitバージョンでは、Gitは壊れた設定に気づくことはありませんでした。1.8.5ができたので、これが指摘されています。
これはほとんどの質問をカバーしますが、「修正する必要があるか」という質問はカバーしません。(例えば)を実行することにより、何年にもわたって壊れやすさを回避している可能性があります。それを続ければ、問題は回避されます。つまり、いいえ、それを修正する必要はありません。必要に応じて、を使用してアップストリームを削除し、苦情を停止できます。ローカルブランチにアップストリームがないとマークされていなくてもかまいません。git pull remote branch
git pull origin source
--unset-upstream
source
アップストリームを持つことのポイントは、さまざまな操作をより便利にすることです。たとえば、アップストリームが正しく設定されている場合、通常、「git fetch
フォローするgit merge
」は「正しいことを行います」。git status
その後git fetch
、そのブランチのリポジトリがアップストリームのリポジトリと一致するかどうかを通知します。
便利にしたい場合は、アップストリームを再設定してください。
1git pull
はを使用しgit fetch
、Git 1.8.4以降、これは(ついに!)「リモート追跡ブランチ」情報も更新します。古いバージョンのGitでは、更新はgit pull
でのみリモート追跡ブランチに記録されませんでしたgit fetch
。Gitは少なくともバージョン1.8.5でなければならないため、これは問題ではありません。
2さて、これに加えて、私が故意に無視している構成行は、の下にありremote.origin.fetch
ます。Gitは「マージ」名をマッピングして、リモートブランチの完全なローカル名がであることを理解する必要がありrefs/remotes/origin/master
ます。それは予測可能ですので、マッピングは、ほとんど常に、しかし、ちょうどこのように動作しますmaster
になりますorigin/master
。
3それとも、とgit config
。アップストリームorigin/source
を変更する必要がある唯一の部分に設定したい場合はbranch.source.merge
、それgit config branch.source.merge refs/heads/source
を行います。しかし--set-upstream-to
言う何あなたがそうそれは「より良い方法」だというあなたは手動でそれを自分で行う行く作るよりも、行って欲しいです。