存在しないリモートブランチを示す「git branch -av」


168

これはおそらく馬鹿げた質問ですが、私はgitに慣れていないため、存在しないリモートブランチを見つけました。

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

本番ブランチがリモートに存在しているとは思わないし、なぜローカルに表示されているのか理解できません。このブランチを削除/削除するにはどうすればよいですか?これを削除する試みは次のようになります。

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

おそらくリモートの本番ブランチをチェックアウトできますが、これを取得します。

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

一体何をやっているのか見当がつかない。任意の助けいただければ幸いです。


git branch -a後の出力は何git fetchですか?
alediaferia 2012年


私が提案した複製には、manojldsがここで行ったよりもはるかに多くを説明する答えがあります。
Cascabel 2012年

回答:


338

あなたはしなければならない:

git remote prune origin

8
うまくいきました!舞台裏で何が起こっているのか詳しく説明できますか?
CarpeNoctem 2012年

12
これらはローカルリポジトリのリモートトラッキングブランチであり、ブランチがリモートリポジトリで削除された場合、それらをクリアする必要があります。
manojlds 2012年

2
このような簡単な質問と回答をすばやく見つけて実装することはほとんどありません。
jleach

すばらしいものです。私のローカルでは、コードベースリポジトリと接続されていない奇妙なブランチが表示されていました。このコマンドを実行すると、ローカルのオリジンブランチが調整され、アップストリームマスター.thanksが追加されました
Srivastava

54

したがって、2つの問題があります。どちらの場合も、Gitが配布されていることを忘れないでください。

最初。あなたが次のようなことをするとき

$ gitブランチ-a

操作はリモートコンピューターではなくローカルリポジトリで実行されます。言い換えると、ローカルリポジトリは、認識されているすべてのブランチを報告しています。これらは、ローカルブランチ(「マスター」など)またはリモートからフェッチしたリモートブランチの場合があります。最後のフェッチ以降、リモートリポジトリの「本番」ブランチは変更されましたが、ローカルリポジトリはこれを認識していません。manojldsからの答えは正しいです。走る

$ git remote prune origin

古いブランチを削除します。

'git push origin:production'コマンドは、リモートコンピューターのgitリポジトリからブランチを削除するために使用されます。ローカルリポジトリではありません。この場合、他の誰かがリモートコンピューターのgitリポジトリのブランチをすでに削除しているため、このエラーメッセージが表示されます。

これらのコマンドをまとめたリンクがあります。

2番目の問題はチェックアウトを扱います。

ブランチをチェックアウトするときは、リモートブランチではなくローカルブランチからチェックアウトする必要があります。そのため、分離したHEADに関するエラーが発生します。レポのgit-ノート血みどろの詳細に問題の良い説明があります。基本的に重要なフレーズは

ただし、適切なローカルのブランチ名ではないものをチェックアウトすると、HEADは何もへのシンボリック参照ではなくなります。代わりに、切り替え先のコミットのSHA-1ハッシュ(コミットID)が実際に含まれています。

ここで、リモートブランチと同じローカルブランチをチェックアウトする方法は?

簡単です。リモートブランチをチェックアウトするときに、ローカルブランチを作成します。

$ git checkout -b my_local_branch origin / production


20
git remote prune origin

そうです、--dry-runオプションを追加するだけで、ローカルリポジトリから枝刈りされるブランチを報告しますが、実際には枝刈りしません

git remote prune origin --dry-run
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.