2012-03-01 9 views
3

git statusがローカルフォルダに変更があるかどうかを確認するとどうなりますか?"git status"の背後にあるGitのテクニックとロジック

私がこれを理解する限り、すべてのファイルはハッシュコード(正確にはsha1)で「登録」されており、git status「単純に」計算されたハッシュコードと一致するように試みます。それは状態の変化とみなされます。私はこれについて正直であるとは確信していません、もし私が間違っていたら私は訂正したいと思います。とにかく、いくつかの質問が出現します:

  1. どのハッシュが見つかりましたか?レポ固有のものには多くのハッシュがありますが、各ファイルの登録済みハッシュはどこで見つかるのですか?次のコマンドのいずれかが実行された場合は、これらのハッシュとどうなりますか
  2. git addgit commit -amgit gc

答えて

5

これを理解するには、最初にgitストアのオブジェクトを理解する必要があります。それらはすべてSHA1ハッシュで識別されます。それらはコミット、ツリー、ブロブです。

コミットにはコミットメッセージ、コミッター、日付、親コミットのSHA1とツリーのSHA1(およびいくつかの追加情報)が含まれています。

ツリーはディレクトリを表します。このファイルには、ファイルやディレクトリの名前(およびその他のメタデータ)が含まれています。各ファイルには、対応するBLOBのSHA1も含まれ、各サブディレクトリには別のツリーのSHA1が格納されます。

Blobは、名前やその他のメタデータのないファイルの内容を表します。 (通常、最新のが現在のブランチにコミットHEAD)現在のコミットに属し

  1. 1:

    は今、git statusは、3本の木を比較します。

  2. ステージング領域にあるもの。ここでファイルはgit addの後にあり、実際にコミットする前にコミットの準備に使用されます。
  3. あなたの作業ツリー。これは現在、ディスク上のディレクトリの表示方法です。

ファイル(たとえば、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を通じて到達可能であるためです。
2

Goがprogit電子書籍のchapter 9.2を参照してください。

全体の電子書籍は読む価値があります。

関連する問題