私は、git の高度な操作に関しては初心者です。ブログ フレームワークOctopressを使用してブログを管理しています。Octopress は 2011 年以降開発されていませんが、私の目的には十分対応しているので、今のところ何も変更しようとは思っていません。
ちなみに、私のブログは Github Pages でホストされています。
今日、新しい投稿を作成中に、git status
次のメッセージが表示されました。
On branch source
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
git add .
、git commit -m 'message'
、などの後続のすべてのコマンドに対して同じメッセージが繰り返されますgit push origin source
。
- このメッセージはどういう意味ですか?
- 何か壊れてますか?
- もしそうなら、何ですか?
- 修正する必要がありますか?
可能であれば、今後のため、これについて読んで理解できる PDF または Web の記事を教えてください。
詳細:
bash-3.2$ git branch -a
* source
remotes/octopress/2.1
remotes/octopress/HEAD -> octopress/master
remotes/octopress/gh-pages
remotes/octopress/linklog
remotes/octopress/master
remotes/octopress/refactor_with_tests
remotes/octopress/rubygemcli
remotes/octopress/site
remotes/origin/source
さらに情報が必要な場合はお知らせください。ありがとうございます。
ベストアンサー1
TL;DR バージョン: リモート追跡ブランチはorigin/master
以前は存在していましたが、現在は存在しないため、ローカル ブランチはsource
存在しないものを追跡しています。これはせいぜい疑わしい状態です。つまり、別の Git 機能が何もできないことを意味し、Git はそれについて警告しています。これまでは「アップストリーム追跡」機能が意図したとおりに動作しなくても問題なく使用できていたため、何かを変更するかどうかはあなた次第です。
アップストリーム設定の別の見方については、「なぜ「git push --set-upstream origin <branch>」を実行する必要があるのですか?」を参照してください。
この警告は Git の新機能で、Git 1.8.5 で初めて登場しました。リリース ノートには、これに関する短い箇条書き項目が 1 つだけ記載されています。
- 「git branch -v -v」(および「git status」) は、他のブランチに基づいていないブランチ、上流ブランチと同期しているブランチ、および存在しない上流ブランチで構成されているブランチを区別しませんでした。
それが何を意味するかを説明するには、まず「リモート」、「リモート追跡ブランチ」、および Git が「アップストリームの追跡」をどのように処理するかについて知っておく必要があります。(リモート追跡ブランチはひどく誤った用語です。私は代わりにリモート追跡名を使い始めました。これは少し改善されたと思います。ただし、以下では Git ドキュメントとの一貫性を保つために「リモート追跡ブランチ」を使用します。)
各「リモート」は、この場合のorigin
または のような単なる名前です。その目的は、またはが更新した場所の完全な URL などを記録することです。 1 を使用すると、Git はそのリモート (保存された URL を使用) に移動し、適切な更新セットを取得します。また、「リモート追跡ブランチ」を使用して更新を記録します。octopress
git fetch
git pull
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 つの構成エントリがあり、それぞれ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/
git branch --set-upstream-to
これは、3を使って実行できます。例:
$ git branch --set-upstream-to=origin/source
(まだブランチ「source」上にいて、それがorigin/source
必要なアップストリームであると仮定します。ただし、実際に必要なのがどれなのか、あるいはあるとしてもどれなのかは私にはわかりません)。
(既存の Git ブランチでリモート ブランチを追跡するにはどうすればよいでしょうか?も参照してください。)
git clone
おそらく、最初に を実行したときに、クローン元にブランチ があったからだと思いますmaster
。また、ブランチ がありmaster
、それを track に設定しましたorigin/master
(これは、git の通常の標準設定です)。つまり、 とがと に設定されていbranch.master.remote
たことになります。しかし、その後、リモートの名前がからに変更されました。それに合わせて、ローカル名もからに変更したと思います。これにより、設定の名前がからに、から に変更されましたが、古い値が残っているため、は間違っています。branch.master.merge
origin
refs/heads/master
origin
master
source
master
source
branch.master.remote
branch.source.remote
branch.master.merge
branch.source.merge
branch.source.merge
この時点で「上流」リンクが壊れていましたが、1.8.5 より前のバージョンの Git では、壊れた設定に Git が気付きませんでした。1.8.5 になった今、Git はこれを指摘しています。
これでほとんどの質問は解決しましたが、「修正する必要があるか」という質問は解決していません。おそらく、あなたは何年もの間、(例: ) を実行して、壊れた状態を回避してきたのでしょう。それを続けていると、問題が回避され続けることになります。つまり、修正する必要はありません。必要に応じて、 を使用してアップストリームを削除し、苦情を止め、ローカル ブランチにアップストリームがまったく存在しないようにすることができます。git pull remote branch
git pull origin source
--unset-upstream
source
アップストリームを持つことの目的は、さまざまな操作をより便利にすることです。たとえば、アップストリームが正しく設定されていれば、通常git fetch
は に続いて がgit merge
「正しい処理」を実行し、git status
after はgit fetch
、そのブランチのリポジトリがアップストリームのリポジトリと一致しているかどうかを通知します。
利便性を重視する場合は、アップストリームを再設定してください。
1 はgit 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
を示しているため、これは「より良い方法」です。