はじめに
この実験では、Git ブランチが孤立しているかどうかを確認する方法を学びます。リポジトリの最初のコミットの特徴である、親コミットのないコミットを理解するために、git log
コマンドを調べます。
さらに、git branch --no-merged
コマンドを使用して、変更が現在のブランチに統合されていないブランチを特定します。最後に、新しい孤立ブランチを作成して調べることで、これらの概念をテストします。
この実験では、Git ブランチが孤立しているかどうかを確認する方法を学びます。リポジトリの最初のコミットの特徴である、親コミットのないコミットを理解するために、git log
コマンドを調べます。
さらに、git branch --no-merged
コマンドを使用して、変更が現在のブランチに統合されていないブランチを特定します。最後に、新しい孤立ブランチを作成して調べることで、これらの概念をテストします。
このステップでは、git log
コマンドをさらに調べ、特に親コミットのないリポジトリでの動作を見ていきます。これはリポジトリの最初のコミットの場合です。
まず、my-time-machine
ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
では、--pretty=oneline
オプションを指定して git log
コマンドを使用しましょう。このオプションは各コミットを 1 行で表示するため、履歴を簡潔に見るのに便利です。また、--max-count=1
オプションを追加して、最新のコミットのみを表示します。
git log --pretty=oneline --max-count=1
以下のような出力が表示されるはずです。
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master) Send a message to the future
この出力には、コミットハッシュ(長い文字列)、コミットが属するブランチ (HEAD -> master
)、およびコミットメッセージが表示されています。
では、このコミットの親コミットを見てみましょう。これが最初のコミットであるため、親コミットはありません。git log
で --no-walk=parent
オプションを使用して、親コミットを表示しようとします。
git log --no-walk=parent --pretty=oneline --max-count=1
このコマンドは、おそらく何も出力されないか、表示する親コミットがないことを示すエラーメッセージが表示されます。これは最初のコミットにおける期待される動作です。
最初のコミットには親コミットがないことを理解することは、Git が履歴を構築する仕組みを理解するための基本です。それ以降の各コミットには 1 つ以上の親コミットがあり、変更の連鎖を形成します。
このステップでは、git branch
コマンド、特に --no-merged
オプションについて学びます。このオプションは、現在のブランチにまだ統合されていない変更を含むブランチを特定するのに役立ちます。
まず、新しいブランチを作成しましょう。ブランチは、新しい機能や実験をメインのタイムライン (master
) に影響を与えずに作業できる別のタイムラインと考えてください。
~/project/my-time-machine
ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
では、experiment
という名前の新しいブランチを作成します。
git branch experiment
このコマンドは新しいブランチを作成しますが、そのブランチに切り替えることはありません。あなたはまだ master
ブランチにいます。
git branch
コマンドを使用して、リポジトリ内のすべてのブランチをリストアップしましょう。
git branch
以下のような出力が表示されるはずです。
experiment
* master
アスタリスク (*
) は、現在いるブランチを示しており、この場合は master
です。
では、git branch --no-merged
コマンドを使用しましょう。このコマンドは、現在のブランチ (master
) にマージされていないブランチをリストアップします。
git branch --no-merged
以下のように表示されるはずです。
experiment
この出力は、experiment
ブランチには master
ブランチに存在しない変更が含まれていることを示しています。この場合、experiment
ブランチを master
から作成したばかりで、まだ何も変更を加えていないので、これは直感に反するように思えるかもしれません。しかし、--no-merged
オプションは、その「先端」のコミットが現在のブランチの「先端」から到達できないブランチを表示するように設計されています。現在、experiment
は master
と同じコミットを指していますが、master
が experiment
を「マージ」していない(この文脈では意味がない)ため、依然として experiment
がリストされます。
実際のシナリオでは、通常、新しいブランチを作成し、その上でいくつかのコミットを行い、その後、メインブランチ(master
など)から git branch --no-merged
を使用して、マージする準備ができている機能ブランチを確認します。
このステップでは、新しい「孤立ブランチ (orphan branch)」を作成します。孤立ブランチとは、以前のブランチの履歴を持たないブランチです。タイムマシンでまったく新しいタイムラインを始めるようなものです。これは、ドキュメント用のブランチやウェブサイトの gh-pages ブランチなど、メインコードの履歴を含めたくない場合に便利です。
~/project/my-time-machine
ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
では、new-start
という名前の新しい孤立ブランチを作成しましょう。
git checkout --orphan new-start
以下のような出力が表示されるはずです。
Switched to a new branch 'new-start'
これで new-start
ブランチに切り替わりました。master
ブランチのファイルが作業ディレクトリにまだ存在することに注意してください。これは、git checkout --orphan
が新しいルートコミット用に作業ディレクトリとインデックスを準備するが、既存のファイルを削除しないためです。
ステータスを確認しましょう。
git status
以下のような表示がされるはずです。
On branch new-start
Untracked files:
(use "git add <file>..." to include in what will be committed)
message.txt
nothing added to commit but untracked files present (use "git add" to track)
new-start
ブランチの履歴は master
と完全に分離されているため、Git は message.txt
を追跡されていないファイルとして認識しています。
この孤立ブランチで本当に新しく始めるには、通常、古いファイルを削除してから、このブランチ用の新しいコンテンツを追加します。message.txt
ファイルを削除しましょう。
rm message.txt
では、もう一度ステータスを確認しましょう。
git status
以下のように表示されるはずです。
On branch new-start
No commits yet
nothing to commit (create/copy files and use "git add" to track)
作業ディレクトリは現在クリーンで、新しい独立したタイムラインの最初のコミットを作成する準備ができました。
このブランチに固有の新しいファイルを作成しましょう。
echo "This is a fresh start!" > readme.md
新しいファイルをステージングエリアに追加します。
git add readme.md
そして、最後に new-start
ブランチの最初のコミットを作成します。
git commit -m "Initial commit for new-start branch"
以下のような出力が表示されるはずです。
[new-start (root-commit) a1b2c3d] Initial commit for new-start branch
1 file changed, 1 insertion(+)
create mode 100644 readme.md
このコミットも master
ブランチの最初のコミットと同じように "(root-commit)" であることに注意してください。これは、親コミットがなく、新しい履歴の始まりであることを確認しています。
では、このブランチのログを見てみましょう。
git log --pretty=oneline
直前に作成したコミットのみが表示されるはずです。
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> new-start) Initial commit for new-start branch
これは、new-start
ブランチが master
ブランチとは別の独立した履歴を持っていることを示しています。
この実験 (Lab) では、Git ブランチが孤立しているかどうかを確認する方法を学びました。まず、git log
コマンドを調べ、特に --no-walk=parent
を使用してリポジトリ内の最初のコミットに親コミットがないことを識別する方法を学びました。これにより、最初のコミットには親がないという Git 履歴の基本概念が示されました。
次に、git branch --no-merged
コマンドを紹介しました。このコマンドは、現在のブランチにマージされていないブランチをリストするために使用され、孤立している可能性があるブランチや統合されていない変更を含むブランチを識別するための重要な手法です。この実験では、新しい孤立ブランチを作成して調べることで、これらの概念をテストするステップも含まれていました。