2

非常に単純な質問だと思いますが、ドキュメントから直接答えを得たり、GIT のコマンドラインで遊んだりするのは一見難しいです。これがシナリオです。ローカルリポジトリがあり、マスターになっています。branch1 というブランチを作成し、branch1 をチェックアウトします。次に、いくつかの変更を加え、変更を追加/コミットします (ステージングとコミット)。この時点で、branch1 に「git tag 1.0」というタグを付けます。

私の質問は - そのタグは、私が branch1 にいるという事実を自動的に取得するので、branch1 にのみ適用されますか? または、コマンド「git tag 1.0 branch1」を使用して、参照先のブランチを明示的に指定する必要がありますか。branch1 作業ディレクトリとマスター作業ディレクトリの両方から「git branch --list」などを試してみましたが、どちらの場合もタグがリストされています。branch1 を master にリベースした場合、この結果に驚くことはありません。しかし、差し当たり、変更を元にマージせずに、コマンド ラインで特定のブランチを参照するタグだけを表示するにはどうすればよいでしょうか (その場合)。

4

3 に答える 3

3

タグはブランチを参照しません。それらはコミットを参照します。あなたがどのブランチにいるかはまったく関係ありません。まったくブランチにいない場合もあります。

git tag foo branch1

タグを に適用しませんbranch1HEADのコミットに適用するための簡略表記ですbranch1

于 2013-03-02T14:26:42.857 に答える
2

タグはブランチには適用されず、コミットに適用されます。タグは、単一のコミットを識別するための追加のラベルです。マスターに切り替えると、そのコミットにはまだそのタグが含まれているため、リストに表示されても驚くことではありません。

さらに、ブランチは 1 つのコミットの単なるラベルでもあります。ブランチをチェックアウトすると、名前付きコミットが現在のリポジトリの HEAD になります。

于 2013-03-02T14:26:13.497 に答える
2

コミットは一連の変更です。したがって、最初のコミットは「何もない」から何かに変わり、最初の後の各コミットはそれ以前に存在していたものを変更します。このように、各コミットは以前のコミットに依存しており、最初のコミットまでさかのぼります。最初に戻るパスにはすべての親コミットが含まれますが、マージ コミットには 2 つ以上の親があるため、常に直線的であるとは限りません。

git には、参照したいコミットを指定する方法がいくつかあります。デフォルトは SHA1 ハッシュですが、他にもあります:

  • HEAD: リポジトリでの作業中、常に一緒に移動します。つまり、作業ディレクトリでチェックアウトされた現在のコミットを常に参照します。
  • <branch>: はコミットに付けられるラベルです。コミットに名前を付けるだけです。HEADのように自動で動くという特殊な性質を持っています。この場合、ラベルは、現在チェックアウトさ<branch>れている間にコミットが作成されると、新しく作成されたコミットに移動します。<branch>このように、<branch>は単一のコミットだけでなく、先頭に戻るコミットのパスも参照しているように見えます。しかし、それは常に単一のコミットにあるラベルです。
  • <tag>: これは、コミットにラベルを付ける別の方法です。ただし、a とは異なり<branch><tag>移動しません。常に、配置されている単一のコミットを参照します。
  • など: 特定のコミットを参照する方法は他にもたくさんありますが、上記はこの議論に関連しています。

上記のいずれかが git コマンドで使用されると、最初にそのコマンドによって参照先のコミットに変換されます。結局のところ、それらはコミットを参照するために使用される単なるラベルです。それぞれが他のすべてから完全に独立しています。

さまざまでありながら関連性のある質問を 1 つずつ取り上げるには、次のようにします。

GIT でブランチをチェックアウトし、ブランチ名を明示的に指定せずにタグを付けるとどうなりますか?

タグはブランチを参照するのではなく、どちらもコミットを参照するラベルであり、互いに完全に独立しています。したがって、あなたの質問は用語が少し「奇妙」です。あなたが読んだ本から来たようです。

のマンページからの実際の関連構文git tag ...: git-tag マニュアルページ

git tag <tagname> <commit>

タグは、タグ名とタグを付けるコミットを指定することで作成されます。そのコミットは、ハッシュ、別のタグ、ブランチ、または別の方法で指定できます。これは、コミットを参照するために使用されるラベルとタグの間にいかなる種類の接続も作成しません。コミットを参照するだけです。

それで、コミットが指定されていない場合(ブランチまたは別の手段によって)はどうなりますか。まあ、コミットは常に指定されます-gitは、その値をデフォルトで にできる場合、コマンド引数を省略できますHEADHEADしたがって、 : を指定した場合と同じことが起こりますgit tag HEAD

繰り返しますが、明確にするために、新しく作成されたタグは現在参照されているコミットに添付され、変更されHEADても移動しませんHEAD

そのタグは、私がbranch1にいるという事実を自動的に取得して、branch1にのみ適用されますか?

いいえ。タグが作成されると、特定のコミットに添付されます。そのコミットが属するブランチ (存在する場合) は関係ありません。

**または、コマンド「git tag 1.0 branch1」を使用して、参照先のブランチを明示的に指定する必要がありますか?

git tag ...コマンドにブランチ名を追加する<branch>と、現在参照しているコミットへの参照として使用され、そのコミットにタグが付けられます。ブランチはチェックアウトされているため(例では)、HEAD同じコミットも参照しているため、コマンドgit tag <tagname>git tag <tagname> HEADおよびgit tag <tagname> <branch>すべてが同じコミットを参照し、同じタグを生成します。

コマンドラインで特定のブランチを参照するタグだけを表示するにはどうすればよいですか (その場合)。

繰り返しますが、タグはブランチを参照するのではなく、単にコミットを参照しますが、それはさておき、単一のブランチのいずれかのコミットに添付されたすべてのタグのリストを取得することは、単一のコマンドがあるものではないようです。いくつかの質問で議論されています(少なくとも)

また、他の回答に対するコメントからの質問 (直接の繰り返しは無視):

あなたの答えに関する私の質問は、GITに「gitタグ」の構文さえあるのに、まったく違いがないのはなぜですか?

そのような構文はありません。この本は、主題を実際よりも単純にしようとする犠牲になっています。git tag <tagname> <commit>正しい構文については、上記のセクションを参照してください。

OK、ブランチ1のHEADコミットと言います(私には正しいように聞こえます)。つまり、リベースする前にブランチ1にのみ適用されますか?

まず、HEADブランチのヘッドコミットと同じではありません。HEAD上記で、作業ディレクトリで現在チェックアウトされているコミットを常に参照するラベルとして定義しました。ブランチの先頭は、そのブランチの最新のコミットです。つまり、ブランチ ラベルが現在関連付けられているコミットです。

ちなみにタグはリベースで移動しません。リベースにより新しいコミットが作成され、古いコミットを参照するタグは引き続きそれらを参照します。

たとえば、マスターでコミットし、(コミットを行わずに) branch1 に切り替え、「git タグを実行すると、マスターの最後のコミットにタグが付けられますか?

作成されたタグは、最新のコミットのbranch1-- の先頭に付けられbranch1ます。から分岐してからコミットが作成されていないため、 (その先頭)masterの最新のコミットは同じコミットです。masterこれは、同じコミットに対処する別の方法であり、それ以上のものではありません。

タグ (コミット) が参照するブランチのみを照会するにはどうすればよいですか?

簡単な答えは、git branch --contains <commit>コマンドを使用し、タグをコミットへの参照として使用することgit branch --contains <tagname>です。

これについては、次の質問で詳しく説明します: 特定のコミットを含むブランチを一覧表示する方法は?

これであなたの固有の質問はすべてカバーされていると思います。お役に立てば幸いです。

于 2013-03-02T23:06:28.690 に答える