タグはGitのブランチとどう違うのですか?ここでどちらを使用すればよいですか?


616

私が使用する方法を理解するいくつかの困難が午前タグを支店での

現在のバージョンのコードを 、そして今、私は特定の機能のためにそのコードのサブセットに取り組んでいます。他にも数人の開発者がこれに取り組んでいますが、私たちのグループのすべての開発者がこの機能を気にするわけではありません。ブランチまたはタグを作成する必要がありますか?どちらを使用すればよいですか?


4
gitのタグを使用する方法については、ウェブ検索が最初にそのリンクに私をもたらしたので、私はここで、タグについてよりよく(私見)答えがあることを追加します。stackoverflow.com/questions/35979642/...
アレクセイMartianov

回答:


520

タグは、時間内に現時点では特定のブランチのバージョンを表します。分岐は、同じコードベース上の他の開発作業と並行して実行することができる開発の別のスレッドを表します。ブランチへの変更は、最終的にそれらを統合するために別のブランチにマージされます。

通常、特定のバージョンにタグを付けて、再作成できるようにします。たとえば、これはXYZ Corpに出荷したバージョンです。ブランチコードの開発を継続しながら、コードの特定のバージョンに継続的な更新を提供するための戦略です。提供されたバージョンのブランチを作成し、メインラインで開発を継続しますが、提供されたバージョンを表すブランチにバグ修正を行います。最終的には、これらのバグ修正をメインラインにマージします。多くの場合、ブランチとタグ付けの両方を一緒に使用します。メインラインとそのブランチの両方に適用される可能性のあるさまざまなタグがあり、特定のバージョン(たとえば、顧客に配信されたもの)をマークして、配信、バグ診断などのために再作成する可能性のある各ブランチに沿って配置します。

これは実際にはこれよりも複雑です-または、作成したいほど複雑です-これらの例は、違いを理解するのに役立ちます。


40
彼の場合、彼はブランチを使用したいと考えています。おそらく、これも回答に含める必要があります;)
knittl

13
AFAIK、タグはブランチごとに一意ではありません。したがって、別々のブランチの異なるコミットに同じ名前を付けることはできません。
-MY

5
@MY確かに悪いことではない、私見。特に、tvanfossonが説明している方法では、異なるブランチ間で同じ名前のタグが複数あると、保守が困難になる可能性があります。この例を考えると、異なるブランチ間で同じ名前のタグを付けることができれば、それはすぐに悪い習慣として確立されると思います。ただし、できません。ありがとうMY!
2013

28
タグは、コミットハッシュの単なるエイリアスです。コミットをチェックアウトできるのと同じgit checkout 88c9f229fようにgit checkout your_tagして、タグによってエイリアスされたコミットをチェックアウトします。
jterm 2016年

6
@jterm、ブランチエイリアスもですか?唯一の違いは、ブランチエイリアスがチェーン内の最新のコミットを自動的に再ポイントすることです。
Viktor Molokostov 16

529

理論的な観点から:

  • タグは、特定のリビジョンのシンボル名です。それらは常に同じオブジェクトを指します(通常:同じリビジョンを指します)。彼らは変わりません。
  • ブランチ、開発ラインのシンボル名です。新しいコミットはブランチの上に作成されます。ブランチポインタは自然に進み、新しいコミットを指します。

技術的な観点から:

  • タグrefs/tags/名前空間に存在し、タグオブジェクト(注釈付きおよびオプションでGPG署名付きタグ)をポイントするか、オブジェクトを直接コミットする(ローカル名にはあまり使用されない軽量タグ)、または非常にまれなケースでツリーオブジェクトまたはblobオブジェクトを指すこともできます(例:GPG署名ます)。
  • ブランチrefs/heads/名前空間に常駐し、コミットオブジェクトのみを指すことができます。のHEADポインタは、分岐(シンボリック参照)または直接コミット(一戸建てHEADまたは無名ブランチ)を参照しなければなりません。
  • リモート追跡ブランチrefs/remotes/<remote>/名前空間に存在し、リモートリポジトリの通常のブランチに従います<remote>

gitglossaryのマンページも参照してください。

ブランチ

「ブランチ」は活発な開発ラインです。ブランチでの最新のコミットは、そのブランチの先端と呼ばれます。ブランチの先端はブランチヘッドによって参照され、ブランチで追加の開発が行われると前方に移動します。単一のgitリポジトリは任意の数のブランチを追跡できますが、作業ツリーはそのうちの1つ(「現在の」または「チェックアウトされた」ブランチ)に関連付けられており、HEADはそのブランチを指します。

鬼ごっこ

タグまたはコミットオブジェクトを指す参照。ヘッドとは異なり、タグはコミットによって変更されません。タグ(タグオブジェクトではない)はに保存され$GIT_DIR/refs/tags/ます。[...]。タグは、最も一般的には、コミットの祖先チェーンの特定のポイントをマークするために使用されます。

タグオブジェクト

別のオブジェクトを指す参照を含むオブジェクト。コミットオブジェクトと同様にメッセージを含めることができます。また、(PGP)署名を含めることもできます。その場合、「署名済みタグオブジェクト」と呼ばれます。


36
質問:ブランチをタグのように扱う場合(つまり、ブランチを作成してから、更新しない場合)、実際の違いはありますか?
スティーブベネット、

30
@SteveBennett絶対に。さまざまな情報が含まれています(タグに署名したり、ブランチに説明を追加したりできます)。ブランチを移動できます(そのため、ブランチを更新しなくても、リベースできます)。タグは移動できません(特定のコミットにリンクされています)。ブランチをプッシュすることを選択できます。タグはデフォルトではプッシュされません。どちらか一方をもう一方に使用しないでください(実際にSVNの考え方を持っている場合を除きます。この場合、gitを使い続ける場合は、その速度で「学習を解除」する必要があります)。
VonC、2012

19
@SteveBennett:Gitがブランチを処理する方法とタグを処理する方法には違いがあります。VonCが言ったこと以外に、誤ってタグを進めることはできません: " git checkout <tag>"は匿名の無名ブランチ(いわゆる「切り離されたヘッド」)を生成し、タグの状態を選択します。新しいコミットを作成すると、この名前のないブランチで実行され、タグの指す場所は変更されません。
JakubNarębski、2012

60
IMO、ブランチは別々のタイムライン(パラレルワールド)であり、タグはタイムラインの特定の瞬間です。
Eonil 2012

25
ここではまだ誰も言及していませんが、タグを使用してブランチを開始できます:git checkout -b <branch name> <tag name>

143

リポジトリを、プロジェクトの進捗を記録する本だと考えるなら...

ブランチは、これらのスティッキーブックマークの 1つと考えることができます

ここに画像の説明を入力してください

新しいリポジトリにはそのうちの1つ(と呼ばれるmaster)のみがあり、作成した最新のページ(commitと考える)に自動的に移動します。ただし、本の他の興味のある箇所にマークを付けるために、より多くのブックマークを自由に作成して使用できるため、すばやくブックマークに戻ることができます。

また、特定のブックマークをブックの他のページにいつでも移動できます( git-resetたとえば)。関心のあるポイントは通常、時間とともに変化します。

タグ

タグは章の見出しと考えることができます。

ブックマーク

タイトルが含まれている場合があります(注釈付きのタグと考えてください)。タグは、本の歴史的関心のあるポイントを示すという点でブランチと似ていますが異なります。その歴史的側面を維持するために、タグを共有した(つまり、共有リモコンにプッシュした)場合、そのタグを本の他の場所に移動することは想定されていません


16
枝は本であり、ブックマークはタグであると想像します。引き続き本を書くことはできますが、編集することはできません。タグは本の中で決まった瞬間にすぎません。
–MārtiņšBriedis 2015

5
@Jubobsブランチの説明は開発の一環として気に入りました。本は枝になります。本店を出たところから新しい本を始めることができます。あなたはそれらを並列に書いて、それから1つの本/枝にマージしようとすることができます。
マルティンスBriedis

2
@MārtiņšBriedis私はあなたがブランチをどう思うかを理解していますが、Gitではそれは実際には誤解を招くものであることがわかりました。stackoverflow.com/questions/25068543/…を
jub0bs

2
これは本当に時間節約の答えです
Ali Foroughi

2
本を書き始め、最初の50ページがある場合、それをコピーし(そこから新しいブランチを作成)、2冊の本を同時に書き続ける(またはその本のコピーを他の作家-開発者に渡す)ことができ、最後に他の本からあなたの本への変更。
バレル2017

42

CVSから来ることを理解する必要があるのは、ブランチを設定するときにディレクトリを作成しなくなったことです。
「1つのファイルにのみ適用できる」「スティッキータグ」や「ブランチタグ」はもうありません。
ブランチとタグはGitの2つの異なるオブジェクトであり、常にすべてのリポジトリに適用されます。

(今回はSVNを使用して)リポジトリを明示的に構造化する必要はもうありません。

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

この構造は、CVSがリビジョンシステムであり、バージョンシステムではないという事実に由来しています(「ソース管理とリビジョン管理?」を参照)。
つまり、ブランチはCVSのタグ、SVNのディレクトリコピーを通じてエミュレートされます。

あなたがタグをチェックアウトし、タグで作業開始することに慣れている場合、あなたの質問は理にかなっています。
すべきでないこと;)
タグは不変を表すことになっていますコンテンツことになっており、毎回同じコンテンツを取得するという保証付きでアクセスするためにのみ使用されます。

Gitでは、リビジョンの履歴は一連のコミットであり、グラフを形成します。
ブランチはそのグラフの1つのパスです

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • タグをチェックアウトする場合、そこから作業を開始するにはブランチを作成する必要があります。
  • ブランチをチェックアウトすると、そのブランチの最新のコミットit( 'HEAD')が直接表示されます。

すべての専門性についてはJakubNarębskiの回答を参照してください。しかし、率直に言って、現時点では、(まだ)すべての詳細は必要ありません;)

主なポイントは次のとおりです。タグはコミットへの単純なポインタであるため、その内容を変更することはできません。ブランチが必要です。


あなたの場合、各開発者は特定の機能に取り組んでいます:

  • それぞれのリポジトリに独自のブランチを作成する必要があります
  • 同僚のリポジトリ(同じ機能に取り組んでいるもの)からブランチを追跡する
  • 自分の作品を仲間と共有するためにプル/プッシュする。

同僚のブランチを直接追跡するのではなく、この特定の機能に関する全員の作業を統合して共有するために、全員が自分の作業をプッシュする1つの「公式」中央リポジトリのブランチのみを追跡できます。


1
ブランチとタグがどのように機能するかを明確にしてくれてありがとう:)あなたの例がなければそれを完全に理解することはできません。
ufk 2011年

3
@VonC:回答では「CVS」ではなく「SVN」を意味していると思います。CVSにはディレクトリ構造はありません。SVNはそうします。実際、gitでのタグ付けは、SVNでのタグ付けよりも、RCS / CVSでのタグ付けの方を思い出させます(ここでtag ==縮退ブランチ)。
クリスクリーランド

1
@ChrisCleeland良い点。(編集された)回答でCVSとSVNのポイントをもう少し分離しようとしました。
VonC、2012

37

枝は木で作られ、木の幹から育ちます。タグは紙(木の派生物)で作られ、クリスマスオーナメントのように木のさまざまな場所から吊り下げられます。

プロジェクトはツリーであり、プロジェクトに追加される機能はブランチ上で成長します。答えはブランチです。


3
アナロジーへの愛
doz87

16

説明する最良の方法は、タグが読み取り専用ブランチとして機能することです。ブランチをタグとして使用できますが、新しいコミットで誤ってブランチを更新する可能性があります。タグは、存在する限り同じコミットを指すことが保証されています。


11
タグは、存在する限り同じコミットを指すことが保証されています。完全に真実ではありません。実際にでタグを移動できgit tag -fます。
jub0bs 2015

14

タグは、署名付きでも署名なしでもかまいません。ブランチは署名されません。

署名付きのタグは、特定のコミットに暗号で(署名付きで)バインドされているため、決して移動できません。署名されていないタグはバインドされておらず、移動することができます(ただし、タグの移動は通常の使用例ではありません)。

ブランチは別のコミットに移動できるだけでなく、そうすることが期待されています。ローカル開発プロジェクトにはブランチを使用する必要があります。「タグ上」でGitリポジトリーに作業をコミットすることはまったく意味がありません。


12

私はブランチどこへ行くのかタグどこへ行くのかと考えるのが好きです

タグは、バージョンリリースなど、過去の特定の重要なポイントのブックマークのようなものです。

ブランチは特定のパスであるのに対し、プロジェクトはダウンしているため、ブランチマーカーはあなたと共に進みます。完了したら、ブランチ(マーカー)をマージまたは削除します。もちろん、その時点で、そのコミットにタグを付けることを選択できます。



6

タグは、バージョンをマークするために使用されます。より具体的には、ブランチ上の特定の時点を参照します。ブランチは通常、プロジェクトに機能を追加するために使用されます。



4

簡単な答えは:

ブランチ:現在のブランチポインターは、リポジトリへのコミットごとに移動します

だが

タグ:タグが指すコミットは変更されません。実際、タグはそのコミットのスナップショットです。

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