はじめに
この実験では、ディレクトリが Git で追跡されているかどうかを判断する方法を学びます。特定のコミットにおけるファイルとディレクトリを調べるために、git ls-tree
コマンドを使用して Git リポジトリの内容を調査します。
さらに、git status
コマンドを利用して、リポジトリ内のファイルの現在の追跡状態を確認し、Git が空のディレクトリをどのように扱うかを理解します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、ディレクトリが Git で追跡されているかどうかを判断する方法を学びます。特定のコミットにおけるファイルとディレクトリを調べるために、git ls-tree
コマンドを使用して Git リポジトリの内容を調査します。
さらに、git status
コマンドを利用して、リポジトリ内のファイルの現在の追跡状態を確認し、Git が空のディレクトリをどのように扱うかを理解します。
このステップでは、git ls-tree
コマンドを使用して Git リポジトリの内容を調査します。このコマンドを使うと、特定のコミットにおけるディレクトリの状態を表すツリーオブジェクトの内容を表示できます。
まず、my-time-machine
ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
では、git ls-tree
を使って最新のコミットの内容を見てみましょう。最新のコミットを参照するために HEAD
を使用します。
git ls-tree HEAD
以下のような出力が表示されるはずです。
100644 blob a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 message.txt
この出力を分解してみましょう。
100644
: これはファイルモードで、通常のファイルであることを示しています。blob
: これはオブジェクトのタイプを示しています。blob
オブジェクトはファイルの内容を格納します。a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
: これは message.txt
の内容を格納する blob オブジェクトの一意の識別子(SHA-1 ハッシュ)です。あなたのハッシュは異なるものになります。message.txt
: これはファイル名です。git ls-tree
コマンドは、特定のコミットの内容を調べるのに便利で、コミット全体をチェックアウトする必要はありません。このコマンドを使うと、その時点で Git が追跡していたファイルとディレクトリを確認できます。
これは、特定のタイムカプセル(コミット)の中を見て、どのファイルが含まれていたか、それらの一意の指紋(blob ハッシュ)は何かを正確に確認するようなものです。これは、プロジェクトの履歴の構造と内容を理解する強力な方法です。
前のステップでは、ファイルを作成し、それを Git リポジトリにコミットしました。では、再度 git status
コマンドを使用して、リポジトリの現在の状態を確認し、ファイルが追跡されていることを確認しましょう。
まだ ~/project/my-time-machine
ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
次に、git status
コマンドを実行します。
git status
以下のような出力が表示されるはずです。
On branch master
nothing to commit, working tree clean
この出力からいくつかの重要な情報がわかります。
On branch master
: 現在、master
ブランチにいます。これはプロジェクトのメインのタイムラインです。nothing to commit, working tree clean
: これが重要な部分です。作業ディレクトリに未コミットの変更がないことを意味します。Git は追跡対象のすべてのファイルを追跡しており、追加またはコミットする必要のある新しいまたは変更されたファイルはありません。これは、変更を完了してコミットしたときの理想的な状態です。これにより、Git がプロジェクトの現在の状態を認識しており、リポジトリ内のすべてが最新であることが確認されます。
この出力を、message.txt
を作成してコミットする前に見た git status
の出力と比較すると、空のリポジトリ、追跡されていないファイルがあるリポジトリ、および追跡されたファイルがあるクリーンなリポジトリの違いが明確になります。
git status
を理解することは非常に重要です。これは、リポジトリ内で何が起こっているか、および必要なアクション(ファイルの追加やコミットなど)を把握するための主要なツールだからです。
このステップでは、Git が空のディレクトリをどのように扱うかを調べます。これは初心者にとってよく混乱するポイントです。なぜなら、Git はディレクトリをファイルとは異なる方法で扱うからです。
まず、~/project/my-time-machine
ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
では、プロジェクト内に新しい空のディレクトリを作成しましょう。
mkdir empty-folder
ディレクトリを作成しました。次に、git status
を使用してリポジトリの状態を確認します。
git status
以下のような出力が表示されるはずです。
On branch master
nothing to commit, working tree clean
Git は empty-folder
を追跡されていないディレクトリとして報告していないことに注意してください。これは、Git がディレクトリ自体ではなくファイルの内容を追跡するためです。空のディレクトリには追跡する内容がありません。
これは Git における重要な概念です。リポジトリに空のディレクトリを含める必要がある場合、一般的な解決策は、その中にダミーファイルを配置することです。一般的な方法は、.gitkeep
という名前のファイルを作成することです(名前は重要ではなく、ただの慣習です)。
empty-folder
内に .gitkeep
ファイルを作成しましょう。
touch empty-folder/.gitkeep
では、再度 git status
を確認しましょう。
git status
今度は、以下のように表示されるはずです。
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
untracked files present (use "git add" to track)
Untracked files:
(use "git add <file>..." to include in what will be committed)
empty-folder/
これで、Git は empty-folder/
を認識します。なぜなら、その中に追跡可能なファイル(.gitkeep
)が含まれているからです。
これは、Git がディレクトリ自体ではなく、ディレクトリ内のファイルの存在を追跡することを示しています。ディレクトリをリポジトリの履歴に含めるには、少なくとも 1 つの追跡されたファイルが含まれている必要があります。
この実験では、ディレクトリとその内容が Git によって追跡されているかどうかを確認する方法を学びました。git ls-tree HEAD
コマンドを使用して最新のコミットの内容を調べ、このコマンドが追跡されているファイルとそれに関連するブロブオブジェクトおよびハッシュを表示することを理解しました。このコマンドは、特定のコミット時点でのリポジトリの状態のスナップショットを提供します。
また、git status
コマンドを利用して、リポジトリ内のファイルの現在の追跡状態を確認し、コミットされたファイルが実際に Git によって追跡されていることを確認しました。最後に、Git が空のディレクトリをどのように扱うかを調べ、Git は空のディレクトリを直接追跡せず、その中のファイルを追跡することを発見しました。