履歴の理解:コミット

プロジェクトの全ての変更履歴は、commit として表現されます。 git-show(1) コマンドは現在のブランチ上で最後にコミットした 履歴を表示します:

$ git show
commit 17cf781661e6d38f737f15f53ab552f1e95960d7
Author: Linus Torvalds <torvalds@ppc970.osdl.org.(none)>
Date:   Tue Apr 19 14:11:06 2005 -0700

    Remove duplicate getenv(DB_ENVIRONMENT) call

    Noted by Tony Luck.

diff --git a/init-db.c b/init-db.c
index 65898fa..b002dc6 100644
--- a/init-db.c
+++ b/init-db.c
@@ -7,7 +7,7 @@

 int main(int argc, char **argv)
 {
-       char *sha1_dir = getenv(DB_ENVIRONMENT), *path;
+       char *sha1_dir, *path;
        int len, i;

        if (mkdir(".git", 0755) < 0) {

このように、コミットは誰が最後に変更したか、何を、何故変更したかを表示します。

全てのコミットは 40桁の16進数の ID ("オブジェクト名" 又は "SHA-1 id" と呼ぶこともあります) を持ち、"git show" の出力の1行目にその ID が表示されます。 通常、コミットはタグやブランチ名のような短い名前で参照できますが、 この長い名前も役に立つことがあります。特に重要なのは、この ID がこのコミットを 大局的にユニークにしている点です:つまり、他のだれかにその ID を (例えば emailで)伝えた場合、その ID が彼らのリポジトリ内でもあなたのリポジトリ内でも 同じコミットを指し示すことを保障しています。 (彼らのリポジトリにそのコミットが完全に含まれている場合にはです)。 オブジェクト名はコミット対象のコンテンツのハッシュとして計算される為、 変更しない限りは、決して変わらないことが保障されています。

実際、gitのコンセプト では、git に格納されている全ての履歴が、 ファイルデータとディレクトリの中身も含めて、その中身のハッシュの名前で オブジェクトが格納されていることを見るでしょう。

履歴の理解:コミット、親、到達可能性

全てのコミットは(プロジェクトの最初のコミットを除き)、そのコミットの前に 行われた変更を示す親のコミットを持っています。 親のつながりは最終的にはプロジェクトの開始点まで繋がっています。

しかし、コミットは単純なリストの形式にはなりません; git は分散開発とその統合を許可しており、2つの開発ラインが統合する点は、 "マージ" と呼ばれます。その為、マージを表現するコミットは1つ以上の親を持ち、 各親はその点につながる開発ラインの最新コミットを表現しています。

これがどのように作業するかを見る最良の方法は gitk(1) コマンドを 使用することです;git リポジトリ上で gitk を実行し、マージコミットを 探すことで、git が履歴をどのように整理しているかを理解することができます。

以下では、コミット X がコミット Y の祖先である場合に、 コミット X はコミット Y から "到達可能"(reachable) であると言うことにします。 同様に、Y は X の子孫である、あるいは、コミット Y から コミット X へ 繋がる親のチェーンがあると言うこともできます。

履歴の理解:履歴ダイアグラム

時々 git の履歴を以下のようなダイアグラムを使用して表現することがあります。 コミットは "o" で、コミット間のリンクは - / \ です。 時間は左から右に流れます:

         o--o--o <-- Branch A
        /
 o--o--o <-- master
        \
         o--o--o <-- Branch B

特定のコミットについて話をする必要がある時は。記号 "o" は 他の文字や数字に置き換えられることもあります。

履歴の理解:ブランチとは?

正確さが必要な時は、用語 "ブランチ" は開発ラインという意味で使用し、 "ブランチのヘッド" (あるいは単に "ヘッド") はブランチ上の最新のコミット という意味で使用します。上記例では、"A" というブランチヘッドは、 ある特定コミットの点を指しますが、その点につながる3つのコミットの線は 全て "ブランチ A" を構成する部品です。

しかしながら、混乱が起きないようなときには、ブランチの場合にも ブランチのヘッドの場合にも単に "ブランチ" ということがあります。