1. ホーム
  2. git

[解決済み] なぜgit branch --unset-upstream to fixupを呼び出すのですか?

2022-02-17 04:58:01

質問

gitの高度な操作に関しては、どちらかというと初心者です。私は自分の ブログ ブログフレームワークを使用した オクトプレス . 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

さらに情報が必要な場合はお知らせください。ありがとうございます。

解決方法は?

TL;DR版:リモートトラッキングのブランチ origin/master は存在していましたが、現在は存在しないため、ローカルブランチの source は存在しないものを追跡しています。これは、別のGit機能が何もできないことを意味し、Gitはあなたにそれを警告しているのですから、よく考えてみれば疑わしいことです。 上流追跡機能が意図したとおりに動かなくても、あなたはうまくやっていくことができます。

上流の設定に関する別の見解として、以下を参照してください。 なぜ "git push --set-upstream origin <branch>" としなければならないのでしょうか?


この警告はGitの新しい機能で、Git 1.8.5で初めて登場しました。 リリースノートには、それに関する短い箇条書きがひとつだけ書かれています。

<ブロッククオート
  • "git branch -v -v" (および "git status") は、以下のものを区別していませんでした。 ブランチ、他のブランチに基づかないブランチは 上流のブランチと同期しているブランチ、上流のブランチと設定されているブランチ 上流のブランチが存在しなくなった。

その意味を説明するには、まず "リモート" と "リモート追跡ブランチ" について、そして Git が "tracking an upstream" をどう扱うかを知る必要があります( リモート・トラッキング・ブランチ という用語はひどく欠陥のある言葉です。 リモート・トラッキングの名前 これは少し改善されたと思います。 しかし、Git のドキュメントとの一貫性を保つために、以下では "remote-tracking branch" を使うことにします)。

各"remote"は単に名前であり、例えば origin または octopress この場合 これらの目的は、たとえば git fetch または git pull の更新を行います。 を使用する場合 git fetch remote, 1 Git は (保存された URL を使って) リモートへ行き、適切な更新を行います。 また 記録 を使用して、更新を行います。

リモート追跡ブランチ(またはリモート追跡名)とは、単に、あるquot;リモート(remote)で最後に表示されたブランチ名を記録したものです。 各リモートはそれ自体が Git リポジトリであり、ブランチを持っています。 リモートの "origin"上のブランチは、あなたのローカルリポジトリにある remotes/origin/ . 表示されたテキストでは、ブランチの名前が sourceorigin という名前のブランチと 2.1 , linklog などのように octopress .

(もちろん、quot;normal" や "local" ブランチは、自分のリポジトリで作成したブランチ名だけです)。

最後に、(ローカル)ブランチを設定して、"リモート追跡ブランチ" を追跡することができます。 ローカルブランチが L がリモート追跡ブランチに追跡するように設定されている R を呼び出すと、Git は R の上流にいることを示し、(コミット数で)上流より進んでいるのか、遅れているのかを教えてくれます。 ローカルブランチとリモート追跡ブランチが同じ名前 (リモートプリフィックスの部分を除く) になるのは、普通のことです (推奨されることでもあります)。 source そして origin/source が、実はその必要はないのです。

そしてこの場合、それは起こっていません。 あなたはローカルブランチ source リモート追跡ブランチを追跡する origin/master .

の正確な仕組みを知る必要はないはずです。 いかに Git は、リモートブランチを追跡するためにローカルブランチをセットアップします。 まず、ローカルブランチの名前から始めます。 source . この名前を使った設定項目が2つあり、スペルは branch.source.remotebranch.source.merge . 表示された出力から、これらが両方とも設定されていることは明らかなので、与えられたコマンドを実行すると、次のように表示されます。

$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master

これをまとめると 2 これはGitに、あなたのブランチが source は、あなたの "remote-tracking branch" を追跡しています。 origin/master .

しかし、次の出力を見てください。 git branch -a これは、リポジトリ内のローカルおよびリモート追跡ブランチの名前をすべて表示します。 リモートトラッキングのブランチ名は remotes/ ... と はありません。 remotes/origin/master . おそらく、かつてはあったのだろうが、今はもうない。

Gitはあなたに、次のことを伝えています。 削除 を使用すると、トラッキング情報を --unset-upstream . これは branch.source.originbranch.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 を追跡するように設定されています。 origin/master (これはgitの通常の標準的な設定です)。 つまり、あなたは branch.master.remotebranch.master.merge に設定します。 originrefs/heads/master . しかし、その後、あなたの origin リモートの名前が master から source . それに合わせて、ローカル名も master から source . これによって 名前 から、設定の branch.master.remote から branch.source.remotebranch.master.merge から branch.source.merge ... しかし、それは古い ということで branch.source.merge が間違っていた。

この時点で "upstream" のリンクが切れました。しかし、Git 1.8.5 より古いバージョンでは、Git はこの壊れた設定に気づきませんでした。 1.8.5では、Gitはそのことを指摘しています。


ほとんどの疑問は解決されましたが、「修正する必要があるのか」という疑問は解決されませんでした。 おそらく、あなたはもう何年も前から、壊れた部分を git pull remote branch (例, git pull origin source ). そのようなことを繰り返していると、問題を回避し続けることになります。 必要 を修正する必要があります。 もしお望みなら --unset-upstream を使えば、上流を削除してクレームを止めることができ、ローカルブランチの source を持つものとしてマークされています。 任意の の上流にある。

上流がある意味は、様々な操作を便利にすることです。 例えば git fetch に続いて git merge は、上流が正しく設定されていれば、一般的に "正しいことをします" となります。 git status の後に git fetch は、そのブランチについて、あなたのレポが上流のレポと一致するかどうかを教えてくれます。

便利さを求めるなら、上流を設定し直してください。


1 git pull 用途 git fetch そして Git 1.8.4 では、(ついに!) "remote-tracking branch" の情報も更新されるようになったのです。 古いバージョンのGitでは、更新がリモート追跡用ブランチに記録されず git pull を使用した場合のみ git fetch . Gitのバージョンは1.8.5以上でなければならないので、これは問題ではありません。

2 さて、これに加えて、私が意図的に無視している設定行は、以下の場所にあります。 remote.origin.fetch . Git は "merge" の名前をマッピングして、リモートブランチの完全なローカル名が次のとおりであることを理解する必要があります。 refs/remotes/origin/master . しかし、マッピングはほとんど常にこのように動作するため、以下のように予測することができます。 masterorigin/master .

3 または git config . 上流を設定したいだけなら origin/source を変更する必要があるのは branch.source.mergegit config branch.source.merge refs/heads/source がやってくれるはずです。 しかし --set-upstream-to とは ということで、より良い方法だと思います。