web-dev-qa-db-ja.com

タグはGitのブランチとどう違うのですか?ここでどちらを使うべきですか?

tagsbranchesgit の使い方の理解が困難です。

現在のバージョンのコードを cvs から git に移動したところで、今度は特定の機能についてそのコードのサブセットに取り組んでいきます。他の数人の開発者もこれに取り組んでいますが、私たちのグループのすべての開発者がこの機能を気にかけているわけではありません。ブランチやタグを作成するべきですか?どのような状況で、どちらを使用するべきですか?

569
Bialecki

タグは、ある時点における特定のブランチのバージョンを表します。ブランチは、同じコードベースで他の開発作業と並行して実行される可能性がある個別の開発スレッドを表します。ブランチへの変更は結局それらを統合するために別のブランチにマージされるかもしれません。

通常、特定のバージョンにタグを付けて再作成できるようにします。たとえば、これはXYZ Corpに出荷されたバージョンです。それを開発します。配布されたバージョンのブランチを作成し、メインラインで開発を続けますが、配布されたバージョンを表すブランチにバグ修正を行います。やがて、これらのバグ修正をメインラインにマージします。多くの場合、分岐とタグ付けの両方を一緒に使用します。あなたは作り直すことを望むかもしれないそれぞれのブランチに沿ってメインラインと特定のバージョン(例えば顧客に配達されたもの)をマークするそのブランチの両方に適用できる様々なタグを持つでしょう.

それは実際にはこれよりも複雑です - またはそれを実現したいのと同じくらい複雑です - しかしこれらの例はあなたに違いの考えを与えるべきです。

482
tvanfosson

理論的の観点からは、

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

テクニカルの観点からは、

  • タグrefs/tags/名前空間に存在し、タグオブジェクト(注釈付きおよびオプションでGPG署名付きタグ)を指すか、またはを直接指すことができます。オブジェクトをコミットする(ローカル名にあまり使われていない軽量のタグ)、あるいはツリーオブジェクトのblobオブジェクトにも(例:GPG署名).
  • ブランチrefs/heads/名前空間にあり、コミットオブジェクトのみを指すことができます。 HEADポインタは、ブランチ(シンボリックリファレンス)を参照するか、または直接コミット(デタッチされたHEADまたは名前のないブランチ)を参照する必要があります。
  • リモートトラッキングブランチrefs/remotes/<remote>/名前空間に存在し、リモートリポジトリ<remote>の通常のブランチに従います。

gitglossary manpageもご覧ください。

ブランチ

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

タグ

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

タグオブジェクト

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

493
Jakub Narębski

あなたのリポジトリをあなたのプロジェクトの進歩を記録した本と考えているなら...

あなたはそれらの付箋しおりの1つとしてブランチを考えることができます:

enter image description here

まったく新しいリポジトリには、masterと呼ばれるものが1つしかなく、自動的に最新のページに移動します(thinkcommit)。ただし、その本の他の関心点をマークするために、より多くのしおりを自由に作成して使用することができるので、すぐにそれらに戻ることができます。

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

タグ

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

bookmarks

タイトル( のタグ付きタグ )が含まれていても含まれていなくてもかまいません。タグは、本に対して歴史的な興味のあるポイントを示すという点で、ブランチと似ていますが異なります。その歴史的な側面を維持するために、いったんタグを共有したら(つまり、共有リモートにプッシュしたら)、 を本の別の場所に移動することは想定されていません。

136
jubobs

CVSから来て、あなたが実現する必要があるのは、ブランチを設定するとき、あなたはもはやディレクトリを作らないということです。
これ以上「スティッキータグ」(1つのファイルにのみ適用可能)、または「ブランチタグ」は不要です。
分岐とタグはGitの2つの異なるオブジェクトであり、常にallリポジトリに適用されます。

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

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

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

あなたがタグをチェックアウトするのに慣れているならば、あなたの質問は意味をなします、そしてその中で働き始めます
どちらをしてはいけません;)
タグは不変のコンテンツを表すものとされており、毎回同じコンテンツを取得することを保証してアクセスするためにのみ使用されます。

Gitでは、リビジョンの履歴はグラフを形成する一連のコミットです。
枝はそのグラフの1つのパスです

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

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

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


あなたのケースでは、各開発者は特定の機能に取り組んでいます。

  • それぞれのリポジトリに独自のブランチを作成するべきです
  • 同僚のリポジトリ(同じ機能に取り組んでいるもの)からブランチを追跡する
  • あなたの仕事をあなたの仲間と共有するために引っ張る/押す。

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

41
VonC

枝は木でできており、木の幹から成長します。タグは紙(木の派生物)で作られており、木の様々な場所からクリスマスの飾りのように吊り下げられています。

あなたのプロジェクトはツリーであり、プロジェクトに追加されるあなたの機能は枝で成長するでしょう。答えは枝です。

37
Jason

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

15

タグは、 符号付きまたは符号なし のいずれかです。枝は署名されません。

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

ブランチは別のコミットに移動できるだけでなく、そうすることが期待されています。あなたはあなたの地域の開発プロジェクトのためにブランチを使うべきです。 "タグを付けて" Gitリポジトリに作業をコミットすることはあまり意味がありません。

12
Greg Hewgill

Git Parable は、典型的なDVCSがどのように作成されるのか、そしてなぜ彼らの作成者が彼らのしたことをしたのかを説明します。また、 Git for Computer Scientist を見てください。ブランチやタグなど、Gitの各タイプのオブジェクトの動作について説明しています。

10
Bombe

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

6
Number45

ブランチとして、と考えるのが好きです。タグとしてを付けたところ

タグは、バージョンリリースなど、過去における特定の重要なポイントのブックマークのように感じます。

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

6
Gazzer

シンプル:

タグは常にプロジェクトの同じバージョンを指すことが期待されていますが、開発が進むにつれてヘッドは前進することが期待されています。

Gitユーザーマニュアル

3
Bar Horing

簡単な答えは:

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

しかし

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

0
jsina