tagsとbranchesの git の使い方の理解が困難です。
現在のバージョンのコードを cvs から git に移動したところで、今度は特定の機能についてそのコードのサブセットに取り組んでいきます。他の数人の開発者もこれに取り組んでいますが、私たちのグループのすべての開発者がこの機能を気にかけているわけではありません。ブランチやタグを作成するべきですか?どのような状況で、どちらを使用するべきですか?
タグは、ある時点における特定のブランチのバージョンを表します。ブランチは、同じコードベースで他の開発作業と並行して実行される可能性がある個別の開発スレッドを表します。ブランチへの変更は結局それらを統合するために別のブランチにマージされるかもしれません。
通常、特定のバージョンにタグを付けて再作成できるようにします。たとえば、これはXYZ Corpに出荷されたバージョンです。それを開発します。配布されたバージョンのブランチを作成し、メインラインで開発を続けますが、配布されたバージョンを表すブランチにバグ修正を行います。やがて、これらのバグ修正をメインラインにマージします。多くの場合、分岐とタグ付けの両方を一緒に使用します。あなたは作り直すことを望むかもしれないそれぞれのブランチに沿ってメインラインと特定のバージョン(例えば顧客に配達されたもの)をマークするそのブランチの両方に適用できる様々なタグを持つでしょう.
それは実際にはこれよりも複雑です - またはそれを実現したいのと同じくらい複雑です - しかしこれらの例はあなたに違いの考えを与えるべきです。
理論的の観点からは、
テクニカルの観点からは、
refs/tags/
名前空間に存在し、タグオブジェクト(注釈付きおよびオプションでGPG署名付きタグ)を指すか、またはを直接指すことができます。オブジェクトをコミットする(ローカル名にあまり使われていない軽量のタグ)、あるいはツリーオブジェクトやのblobオブジェクトにも(例:GPG署名).refs/heads/
名前空間にあり、コミットオブジェクトのみを指すことができます。 HEAD
ポインタは、ブランチ(シンボリックリファレンス)を参照するか、または直接コミット(デタッチされたHEADまたは名前のないブランチ)を参照する必要があります。refs/remotes/<remote>/
名前空間に存在し、リモートリポジトリ<remote>
の通常のブランチに従います。gitglossary manpageもご覧ください。
ブランチ
「ブランチ」は開発の活発な行です。ブランチに対する最新のコミットは、そのブランチのチップと呼ばれます。ブランチの先端はブランチヘッドによって参照されます。ブランチヘッドは、ブランチで追加の開発が行われるにつれて前進します。単一のgitリポジトリは任意の数のブランチを追跡することができますが、あなたの作業ツリーはそれらのうちの1つのみ( "現在"または "チェックアウト")に関連付けられ、HEADはそのブランチを指します。
タグ
タグまたはコミットオブジェクトを指す参照。ヘッドとは対照的に、タグはコミットによって変更されません。タグ(タグオブジェクトではない)は
$GIT_DIR/refs/tags/
に格納されています。 [...]タグは、コミット先祖チェーン内の特定のポイントをマークするために最も一般的に使用されます。タグオブジェクト
コミットオブジェクトのようにメッセージを含むことができる別のオブジェクトを指す参照を含むオブジェクト。それはまた(PGP)署名を含むことができ、その場合それは「署名されたタグオブジェクト」と呼ばれます。
あなたのリポジトリをあなたのプロジェクトの進歩を記録した本と考えているなら...
あなたはそれらの付箋しおりの1つとしてブランチを考えることができます:
まったく新しいリポジトリには、master
と呼ばれるものが1つしかなく、自動的に最新のページに移動します(thinkcommit)。ただし、その本の他の関心点をマークするために、より多くのしおりを自由に作成して使用することができるので、すぐにそれらに戻ることができます。
また、特定のブックマークをいつでもその本の他のページに移動することができます(たとえば、git-reset
を使用)。興味のあるポイントは通常、時間とともに変化します。
タグは章の見出しと考えることができます。
タイトル( のタグ付きタグ )が含まれていても含まれていなくてもかまいません。タグは、本に対して歴史的な興味のあるポイントを示すという点で、ブランチと似ていますが異なります。その歴史的な側面を維持するために、いったんタグを共有したら(つまり、共有リモートにプッシュしたら)、 を本の別の場所に移動することは想定されていません。
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
すべての専門知識については JakubNarębskiの回答 を参照してください。しかし、率直に言って、現時点では、(まだ)すべての詳細は必要ありません。
要点は次のとおりです。タグはコミットへの単純なポインタであり、その内容を変更することはできません。あなたは枝が必要です。
あなたのケースでは、各開発者は特定の機能に取り組んでいます。
同僚のブランチを直接追跡するのではなく、全員がこの機能のために統合して共有するために、全員が自分の仕事をプッシュした1つの「公式」中央リポジトリのブランチのみを追跡することができます。
枝は木でできており、木の幹から成長します。タグは紙(木の派生物)で作られており、木の様々な場所からクリスマスの飾りのように吊り下げられています。
あなたのプロジェクトはツリーであり、プロジェクトに追加されるあなたの機能は枝で成長するでしょう。答えは枝です。
説明するのに最適な方法は、タグが読み取り専用のブランチとして機能するということです。ブランチをタグとして使うことはできますが、誤って新しいコミットで更新する可能性があります。タグは、存在する限り同じコミットを指すことが保証されています。
タグは、 符号付きまたは符号なし のいずれかです。枝は署名されません。
署名付きタグは暗号的に(署名付きで)特定のコミットにバインドされているため移動できません。未署名のタグはバインドされていないため移動できます(ただし、タグの移動は通常の使用例ではありません)。
ブランチは別のコミットに移動できるだけでなく、そうすることが期待されています。あなたはあなたの地域の開発プロジェクトのためにブランチを使うべきです。 "タグを付けて" Gitリポジトリに作業をコミットすることはあまり意味がありません。
Git Parable は、典型的なDVCSがどのように作成されるのか、そしてなぜ彼らの作成者が彼らのしたことをしたのかを説明します。また、 Git for Computer Scientist を見てください。ブランチやタグなど、Gitの各タイプのオブジェクトの動作について説明しています。
タグは、バージョンをマークするために使用されます。より具体的には、タグはブランチ上のある時点を参照します。ブランチは通常、プロジェクトに機能を追加するために使用されます。
ブランチをとして、、と考えるのが好きです。タグとしてを付けたところ。
タグは、バージョンリリースなど、過去における特定の重要なポイントのブックマークのように感じます。
ブランチは特定の進路であるのに対して、プロジェクトは下降しているので、ブランチマーカーはあなたと共に進みます。完了したら、ブランチ(つまりマーカー)をマージ/削除します。もちろん、その時点でそのコミットにタグを付けることを選択できます。
簡単な答えは:
ブランチ:現在のブランチポインターは、リポジトリへのコミットごとに移動します
しかし
タグ:タグが指すコミットは変更されません。実際、タグはそのコミットのスナップショットです。