web-dev-qa-db-ja.com

削除されたコミットを指すGitタグはどうなりますか

次のようにするとします。

  1. ブランチを作成X
  2. タグtを作成(ブランチXへ)
  3. 押す
  4. ブランチを削除X

タグtはどうなりますか?ただそこに浮いているだけですか?それはゴミと見なされますか?

ブランチ自体を削除する前に、ブランチを指すすべてのタグを削除する必要がありますか?

参照

From Git Basics-Tagging

Gitは2つの主なタイプのタグを使用します。軽量と注釈付きです。軽量タグは、変化しないブランチに非常に似ています–特定のコミットへの単なるポインタです。

40
idanshmu

タグtはどうなりますか?

コミットxからブランチEを作成し、そのコミットにタグtをタグ付けしたとします。例えば。

                           x (branch)
                           |
                           V             
A-----B------C------D------E
                           ^
                           |
                           t (tag)

ブランチxを削除すると、タグtは何も起こりません。

git branch -D x

タグはまだコミットEを指しています。

A-----B------C------D------E
                           ^
                           |
                           t (tag)

それはゴミと見なされますか?

いいえ、コミットはタグtによって参照されているためです。

コミットが削除された場合はどうなりますか?

コミットは削除しません。コミットへのポインタを削除すると、コミットが参照されなくなった場合、gitはいつかガベージコレクションを実行します(構成によって異なります)。

git gc を参照

ブランチやタグなどの通常の参照をすべて削除した場合でも、コミットはしばらくの間reflogで参照され、それらにアクセスできます。ブランチを再作成し、タグを付けるか、チェリーピックなどを行います。

git reflog を使用してreflogを表示できます。 gc.reflogExpireUnreachablegc.reflogExpireもご覧ください

46
René Link

OPの質問の特定のシナリオではなく、タイトルの質問に対処します。削除されたコミットを指すgitタグはどうなりますか?

タグによって参照されたコミットをなんとかして削除した場合(その方法がわからない- RenéLinkの回答 を参照)、タグは無効なコミットへのポインタになります( .git/refs/tagsからタグを手動で編集してこれをテストできます)。

このような場合、git tagの出力は次のようになります。

$ git tag
error: refs/tags/v1.0 does not point to a valid object!
v1.1
...etc

チェックアウトでもエラーが発生します。

$ git checkout v1.0
fatal: reference is not a tree: v1.0

それで、「削除されたコミットを参照するgitタグはどうなりますか?」という質問への回答です。なんでもない。 git tag -d <tag>で削除するまで、無効な参照を指しているままです。

5
1615903

タグが作成されたブランチを削除しても、タグには影響しません。タグはそれがどこから作成されたかの参照を保持しません。

タグとブランチの詳細について知りたい場合は、次の質問を検討することをお勧めします: タグはブランチとどう違うのですか?ここでどちらを使うべきですか?

0
Jacob Nelson