初期インポートとしてプログラムv2.0のソースコードを持っているgitリポジトリがあります。
v2.0(master) - o - o - ...
v2.0の初期インポートコミットの前にv1.0コードのブランチを作成できますか?お気に入り:
v1.0 - o - o - ...
\
v2.0(master) - o - o - ...
初期インポートとしてプログラムv2.0のソースコードを持っているgitリポジトリがあります。
v2.0(master) - o - o - ...
v2.0の初期インポートコミットの前にv1.0コードのブランチを作成できますか?お気に入り:
v1.0 - o - o - ...
\
v2.0(master) - o - o - ...
短い答えはノーです。
長い答えは有益です:Gitではブランチ名前 ただコミットへのポインター。これは、「ブランチ」の意味に関係なく、「ブランチ」とはどういう意味ですか?を参照してください。少なくとも1つのコミット その上。
さらに、この図は根本的に間違っています。
これは、ブランチが名前 左側に座って、新しいコミットが1つずつ右に成長します。確かに新しいコミット行う 右側に1つずつ成長しますが、ブランチは名前 右側にも座っています!つまり、
master
という名前 最初は、最初に行ったコミットを指します。完全に空のリポジトリから始めます。名前
HEAD
存在し、ブランチ名master
に接続されている 、しかしブランチ自体存在しない コミットがないためです!1 支店名しなければならない 既存の有効なコミットを指しますが、まったくありません。最終的に、最初のコミットを行い、Gitはすぐに
master
という名前を付けます それを指します。コミットには大きなbigいハッシュIDがあります。これは実際、そのコミットの内容の暗号チェックサムです。これは、名前とメールアドレス、そのコミットの下に保存されているすべてのファイル、および日時によって異なります。予測することを本質的に不可能にします。しかし、単にA
と呼びましょう。 :その後、しばらくして、新しいコミットを作成します。これを
B
と呼びます ここに。新しいコミットB
コミットA
の実際のハッシュIDを記録します 、だから我々はそのB
と言う に指差すA
:この時点でブランチ名に何が起こるかが鍵です。名前
master
止まるA
のコミットを指す Gitはすぐにmaster
を上書きするため 新しいコミットB
の新しいハッシュID :この時点で、新しいブランチ名を作成する場合は、これら2つの既存のコミットのいずれかを指すように設定することで作成します。その後、名前
HEAD
を添付できます それに:そして今、あなたが新しいコミットをするなら、それを
C
と呼びましょう -新しいコミットはB
を指す GitはC
を書き込みます のHEAD
を持つ名前のハッシュID それに添付:コミット
A
他のコミットを指すことはありません。コミットは一度行われると読み取り専用になります。A
をコミットする ありません親 そして、それは永遠にそのままです。(いつでも、一連の新規および違う コミットすると、Gitで変更できますすべて を指すブランチ名完全に新しい異なるセット コミットの数なので、次のように作成できます:
コミットを残す
A-B-C
永遠に遅れ、最終的にこれらの3つのコミットは期限切れになり削除されますが、これはしません変化するA-B-C
をコミットします 、それらは実際のハッシュIDによって識別されますが、それらはどのようなものであってもかまいません。このアイデアの一般的な用語-コミットのまったく新しいチェーンを作成し、ブランチ名が新しいチェーンを指すようにするの代わりに 古いチェーン—と呼ばれます書き換え履歴。コンセプトが機能する場合、それが機能するのは、私たち人間はどちらかをコミットするところから始めるからです。名前 を指し、Gitと同じように、これらの後方を指す内部コミット矢印を介して後方に向かって動作します。)1つまり、Gitにどのブランチにいるのかを尋ねると(
git status
たとえば))、それはmaster
と言うでしょう 、しかし、どのブランチが存在するかをGitに尋ねると、番号 枝が存在します。文字通り、存在しないブランチにいます。 Gitはこれをさまざまに胎児の枝 または孤児の枝。前者は、少なくとも私の意見では、実際にはより良い名前です。 「オーファンブランチ」という名前は、Gitの開発の早い段階で誰かがだまされたために私たちが行き詰まっている間違いです。