GitHubで削除されたブランチをチェックアウトできるのはなぜですか?


26

GitHubリポジトリで、同僚がという名前のブランチを削除しましたrelease。しかし、git checkout releaseローカルで実行すると、削除されたブランチが常に取得されreleaseます。同じように、別のブランチをチェックアウトしても、releaseブランチを削除して、git branch -D release再度実行しましたgit checkout release

GitHubリポジトリに修正するものはありますか、それともローカルに修正する必要がありますか?


1
git branch --remote実行後の出力は何git fetchですか?git fetch -p削除されたリモートブランチを忘れるには、プルーニングが必要になる場合があります。
スティーブンキット

2
そのブランチがGitHubにプッシュされ、その後プルした場合、ブランチのコピーもあります。浅いクローンなどを使用しない限り、すべてのgitリポジトリはそれ自体で完全です。
ムル

@StephenKitt:ありがとう。git branch --remote出力origin/releasegit fetch -p追加の引数なしで実行するつもりですか、削除されたすべてのリモートブランチを整理しますか?
ティム

1
はい。git fetch -p追加の引数を指定しないと、削除されたすべてのリモートブランチが削除されます。
スティーブンキット

1
分散バージョン管理の世界へようこそ!
クリリス

回答:


24

リモート側でブランチを削除しても、以前にフェッチされたリモートブランチがローカルに表示される場合があります。以下を参照してください。

$ git branch -a
[...]
release
remotes/origin/release
[...]

「リリース」のみを削除し、「リモート/オリジン/リリース」は削除しませんでした。次のように削除します。

$ git branch -rd origin/release

または、リモート側に存在しないフェッチされたブランチをすべて削除ます。

$ git remote prune origin 

ありがとう。ではgit branch -rd origin/release、どういう-r意味ですか?ん-dと同じ意味-Dgit branch -rd origin/releaseに置き換えることができ ます git branch -d remotes/origin/releaseか?
ティム

@Tim:マニュアルから。-r:List or delete (if used with -d) the remote-tracking branches.; -D:Shortcut for --delete --force.
ルーパー

ありがとう。git branch -rd origin/releaseに置き換えることができますgit branch -d remotes/origin/releaseか?
ティム

@Tim no -rリモートブランチを指します、それは必要です。ローカルおよびリモートブランチは、別のディレクトリに保存され、比較されている ls -l .git/refs/headsls -l .git/refs/remotes。なしで削除されるローカルブランチを呼び出すこともできます。これは紛らわしいように聞こえるかもしれませんが、ただ遊んでみて、奇妙な名前でブランチを作成し、それがどのように見えるかを見ることができます。remotes/origin/release-r.git/
-rudimeier

15

ブランチをリモートで削除する場合、ローカルリポジトリを整理する必要があります。これを行う最も簡単な方法は

git fetch -p

これにより、リモートリポジトリに加えられたすべての変更でローカルリポジトリが更新されますが、ローカルブランチは更新されません。これを実行した後、

git branch --remote

削除されたリモートブランチは表示されなくなります。

gitリポジトリは、独自のシステム上であれサーバー上であれ、完全です。したがって、最初にリポジトリのクローンを作成すると、完全なコピーが取得され、ローカルgitはすべてのリモートブランチとローカルブランチを「認識」します。この情報は自動的に同期されないため、同僚releaseがサーバー上のブランチを削除しても、ローカルgitリポジトリはリモートreleaseブランチという概念を失うことはありませんでした。同期するとgit fetch、リモートブランチ上のすべてのローカル情報が更新され、サーバー上の状態(厳密に言えばリモートリポジトリ)に一致しますが、リモートブランチ上のローカル情報は削除されません。git fetch -p(またはgit fetch --prune、またはgit remote prune)でプルーニングすると、削除されたリモートブランチのローカル情報が削除されます。


ありがとう。「ローカルブランチを更新せずに、リモートリポジトリに加えられたすべての変更を使用してローカルリポジトリを更新します。」ローカルブランチの更新ではない場合、どのような更新がありますか?
ティム

すべてのリモート更新です。ローカルgitリポジトリはローカルブランチとリモートブランチを区別しますが、リモートブランチは魔法のようにサーバーと同期されません-それらもローカルに存在します(ローカルgitリポジトリに格納されているように)。取得により、ローカルリポジトリがリモートリポジトリと同期され、リモートブランチの状態が更新されます。デフォルトでは、削除されたリモートブランチはリモートブランチのローカル情報から削除されません-p((--prune)強​​制的に。
スティーブンキット

ありがとう。ブランチの取得を停止releaseするgit branch -D release前にブランチを削除しなかったのはなぜですか?git checkout releasegit checkout releaserelease
ティム

1
git checkout releaseその名前のリモートブランチがある場合、ブランチを自動的に再作成するためです。
スティーブンキット

「リモートブランチ」とは、ローカルリポジトリまたはGithubリポジトリのブランチを意味しますか?以前の場合、ローカルリポジトリのブランチgit branch -D releaseは既に削除されていreleaseます。後者の場合、同僚がreleaseGitHub のブランチを削除しました。だから、「その名前のリモートブランチがある場合、ブランチを自動的に再作成する」理由はまだわかりませんか?
ティム

3

Tim:GitはVCSを配布しているので、リモートからローカルにリポジトリを複製すると、すべて(履歴)が複製されます。そのため、レポジトリのクローンを作成すると、リリースというブランチがありました。同僚がリリースブランチをリモートで削除したため、ブランチをプルーニングgit fetch -pまたは削除するまで、ローカルにブランチが作成されます。


3
この回答は、すでに存在する回答とどのように異なりますか?
スティーブンラウフ

1

おそらく少し接線ですが、このサイトの観点はブランチを削除する一般的なトピックを理解するのに役立つかもしれません:

http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/

ここですでに説明した内容の一部と重複していますが、焦点はハウスキーピングにあります。リモート環境とローカル環境のブランチを削除することは、コラボレーション環境ではもはや必要ありません。特に、このgit branch --mergedコマンドは、メインラインにマージされたために削除しても安全なブランチ(または関心のあるブランチ)を識別します。共同作業をしている場合、このような手の込んだミニスクリプトは、日付と著者を含む、わかりやすい形式で表示します。

for branch in `comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r

(残念ながら、「ナイス、消化可能」は、スクリプト自体のフォーマットには適用されません。)

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