これを理解するには、最初にgitストアのオブジェクトを理解する必要があります。それらはすべてSHA1ハッシュで識別されます。それらはコミット、ツリー、ブロブです。
コミットにはコミットメッセージ、コミッター、日付、親コミットのSHA1とツリーのSHA1(およびいくつかの追加情報)が含まれています。
ツリーはディレクトリを表します。このファイルには、ファイルやディレクトリの名前(およびその他のメタデータ)が含まれています。各ファイルには、対応するBLOBのSHA1も含まれ、各サブディレクトリには別のツリーのSHA1が格納されます。
Blobは、名前やその他のメタデータのないファイルの内容を表します。 (通常、最新のが現在のブランチにコミットHEAD
)現在のコミットに属し
- 1:
は今、git status
は、3本の木を比較します。
- ステージング領域にあるもの。ここでファイルは
git add
の後にあり、実際にコミットする前にコミットの準備に使用されます。
- あなたの作業ツリー。これは現在、ディスク上のディレクトリの表示方法です。
ファイル(たとえば、A.TXT)を編集する場合、これは、理由は、git add
それは、いくつかのより多くのそれを編集してからgit status
を使用し、あなたがこのような出力が得られます。
今
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
#
あなたの実際の質問に:
どのハッシュが見つかりましたか?レポ固有のものには多くのハッシュがありますが、各ファイルの登録済みハッシュはどこで見つかるのですか?
これらはツリーオブジェクトに格納されます。(HEAD
)コミット現在のツリーオブジェクトを参照するにはたとえば、git ls-tree HEAD
を使用します。
$ git ls-tree HEAD
100644 blob 9c59e24b8393179a5d712de4f990178df5734d99 a.txt
あなたはレポのルートディレクトリを1つのファイル(blob
)が含まれていることがわかります9c59e24b8393179a5d712de4f990178df5734d99のSHA1とA.TXTと呼ばれます。
同じコマンドを使用して、サブディレクトリのSHA1とそれらのサブディレクトリ内のファイルを確認できます。詳細については、コマンドのマニュアルを参照してください。
ディスク上の一部のファイルのSHA1を計算するには、git hash-object
を使用できます。次のコマンドのいずれかが
あなたはSHA1sがオブジェクトの内容に基づいていることを覚えておいてくださいを実行している場合は、これらのハッシュとどうなりますか
。各オブジェクトは完全に不変であるため、一部のオブジェクトのSHA1は決して変更されません。しかし、多くの操作は新しいオブジェクトを作成することができ、たとえば、いくつかの分岐点のオブジェクトを変更することもできます。
git add
コマンドのパラメータに応じて、バックステージングエリアに修飾ツリーを保存いくつかのファイルを追加または変更することによってそれを修正、ステージング領域にツリーをとります。
git commit
は、ステージング領域でツリーを取得し、そのツリーを指すコミットを作成します。新しいコミットには、現在の日付、コミッターとしてのあなた、そしてその親としての現在のコミットもあります。コマンドは、現在のブランチを新しいコミットを指すように変更します。
git commit -a
は、git add
のショートカットで、git commit
が続きます。
git gc
は、すべてのオブジェクトを格納し、到達できないオブジェクトを削除します。到達可能なオブジェクトは、すべてのブランチ、タグ、または現在のコミットのヒントであり、それらが参照するすべてのオブジェクトも再帰的に使用されます。最近使用されたコミット(およびそれらが参照しているオブジェクト)も削除されません。これは、それらがreflogを通じて到達可能であるためです。