修正するために git branch --unset-upstream を呼び出すのはなぜですか? 質問する

修正するために git branch --unset-upstream を呼び出すのはなぜですか? 質問する

私は、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 を使用) に移動し、適切な更新セットを取得します。また、「リモート追跡ブランチ」を使用して更新を記録します。octopressgit fetchgit pullgit fetch remote,

「リモート追跡ブランチ」(またはリモート追跡名)は、単に「リモート」で最後に確認されたブランチ名を記録したものです。各リモートはそれ自体が Git リポジトリであるため、ブランチがあります。リモート「origin」のブランチは、 のローカル リポジトリに記録されます。示されたテキストには、にremotes/origin/という名前のブランチがあり、 に 、 などという名前のブランチがあることが示されています。sourceorigin2.1linklogoctopress

(もちろん、「通常の」または「ローカル」ブランチは、独自のリポジトリに作成したブランチ名にすぎません。)

最後に、(ローカル) ブランチを設定して、「リモート追跡ブランチ」を「追跡」することができます。ローカル ブランチがリモート追跡ブランチを追跡するようにL設定されるとR、Git は「上流」を呼び出し、上流よりも「進んでいる」か「遅れている」か (コミットに関して) を通知します。ローカル ブランチとリモート追跡ブランチで、や のRように同じ名前 (リモート プレフィックス部分を除く) を使用するのは普通 (推奨もされます) ですが、実際には必要ありません。sourceorigin/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.originbranch.source.merge

ただし、おそらく、 の追跡から何か他のものの追跡に切り替えることが目的であると思われます。おそらく ですが、名前のいずれかかもしれません。origin/masterorigin/sourceoctopress/

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.mergeoriginrefs/heads/masteroriginmastersourcemastersourcebranch.master.remotebranch.source.remotebranch.master.mergebranch.source.mergebranch.source.merge

この時点で「上流」リンクが壊れていましたが、1.8.5 より前のバージョンの Git では、壊れた設定に Git が気付きませんでした。1.8.5 になった今、Git はこれを指摘しています。


これでほとんどの質問は解決しましたが、「修正する必要があるか」という質問は解決していません。おそらく、あなたは何年もの間、(例: ) を実行して、壊れた状態を回避してきたのでしょう。それを続けていると、問題が回避され続けることになります。つまり、修正する必要はありません。必要に応じて、 を使用してアップストリームを削除し、苦情を止め、ローカル ブランチにアップストリームがまったく存在しないようにすることができます。git pull remote branchgit pull origin source--unset-upstreamsource

アップストリームを持つことの目的は、さまざまな操作をより便利にすることです。たとえば、アップストリームが正しく設定されていれば、通常git fetchは に続いて がgit merge「正しい処理」を実行し、git statusafter は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ことは予測可能です。masterorigin/master

3または、 を使用しますgit config。アップストリームを に設定したいだけの場合、origin/source変更する必要があるのはbranch.source.mergeとだけですgit config branch.source.merge refs/heads/source。ただし、 は、手動で自分で行うのではなく、実行したいこと--set-upstream-toを示しているため、これは「より良い方法」です。

おすすめ記事