履歴の書き換え

GitBeginner

はじめに

タイムトラベルを操る Git 探検家の皆さん、ようこそ!あなたには重要な任務が課せられました。それは、ある極秘プロジェクトの乱雑なコミット履歴を整理することです。あなたの目標は、新たに習得した Git の力、特に「インタラクティブ・リベース」という技術を駆使して、混沌としたタイムラインを明快で簡潔な履歴へと作り変えることです。

過去を書き換える能力を持つ歴史家になった自分を想像してみてください。あなたの仕事は、散らばった一連の出来事を取り込み、それらを一貫した物語へと再構成することです。これこそが、Git のインタラクティブ・リベース機能で行う作業そのものです。関連するコミットを統合し、不要なものを削除し、コミットメッセージを書き換えることで、プロジェクトの開発経緯をより明確に伝えることができます。

時の流れに飛び込み、洗練された Git 履歴を手に戻ってくる準備はできていますか?時間旅行のアドベンチャーを始めましょう!

タイムラインの整理

タスク

チャレンジ用のリポジトリが ~/project/time-travel-git に用意されています。以下のコマンドを実行して、初期のコミット履歴を確認してください。

cd ~/project/time-travel-git
git log --oneline

以下のような 4 つのコミットが表示されるはずです(コミットハッシュは環境によって異なります)。

886c6ad (HEAD -> master) Add project description
3a87b84 Add project codename
6b4cbb9 Fix typo in project name
0d71e5e Start secret project

あなたの任務は、以下のタスクを遂行することです。

  1. 最も古い 2 つのコミット("Start secret project" と "Fix typo in project name")を 1 つのコミットに統合し、メッセージを "Initialize secret project" に変更してください。
  2. "Add project codename" というコミットのメッセージを "Add project codename: Chronos" に書き換えてください。
  3. 最新のコミット("Add project description")はそのまま維持してください。

要件

この任務を成功させるために、以下の要件を遵守してください。

  • すべての操作は ~/project/time-travel-git ディレクトリ内で行うこと。
  • コミット履歴の整理には必ず git rebase -i(インタラクティブ・リベース)コマンドを使用すること。
  • 最終的な履歴は、元の 4 つではなく、正確に 3 つのコミットになっていること。
  • ファイルの内容自体は変更しないこと。変更するのはコミット履歴のみです。
  • チャレンジ完了後、git log --oneline を実行した際に、正しいメッセージを持つ 3 つのコミットが表示されること。

ヒント

チャレンジを進める上でのヒントをいくつか紹介します。

  1. インタラクティブ・リベースを使用すると、履歴内のコミットを操作できます。基本的なコマンド形式は以下の通りです。

    git rebase -i <commit>

    ここで <commit> は、修正したい最初のコミットの「一つ前」のコミットを指定します。最初のコミットから修正したい場合は、以下のフラグを使用できます。

    git rebase -i --root
  2. インタラクティブ・リベースの画面では、コミットの一覧とアクションが表示されます。主なアクションは以下の通りです。

    • pick - コミットをそのまま使用する
    • reword または r - コミットを使用するが、メッセージのみ変更する
    • squash または s - このコミットを前のコミットに統合する
    • fixup または f - squash と同様だが、このコミットのメッセージは破棄する
  3. コミットを統合するには、2 番目のコミットに対して squash または fixup を使用するとよいでしょう。

  4. コミットメッセージのみを変更したい場合は、reword アクションを使用します。

  5. リベースの計画(アクションの指定)を設定したら、エディタを保存して閉じます。Git が残りのプロセスを案内し、必要に応じてコミットメッセージ編集用の新しいエディタウィンドウを開きます。

  6. リベース中に間違いに気づいた場合は、いつでも以下のコマンドで中断してやり直すことができます。

    git rebase --abort

チャレンジ完了後、git log --oneline の結果は以下のようになるはずです(コミットハッシュは異なります)。

abc1234 Add project description
def5678 Add project codename: Chronos
ghi9101 Initialize secret project
✨ 解答を確認して練習

まとめ

このチャレンジでは、Git の履歴を遡る時間旅行を体験しました。過去を形作り、よりクリーンで論理的なコミット履歴を作成するための強力なツールである「インタラクティブ・リベース」の技術を習得しました。

コミットの統合、メッセージの書き換え、変更の再構成を行うことで、乱雑な出来事の羅列を一貫した物語へと変貌させました。このスキルは、クリーンで理解しやすい履歴を維持することがチームのコラボレーションやプロジェクト管理を大幅に向上させる実際の開発現場において、非常に価値のあるものです。

ただし、「大いなる力には大いなる責任が伴う」ことを忘れないでください。履歴の書き換えはローカルブランチや個人プロジェクトでは非常に有用ですが、共有ブランチで行う場合は注意が必要です。共有されている履歴を変更する前には、必ずチームと相談するようにしましょう。

これからも Git の冒険を続け、これらのスキルを磨いていってください。履歴を操作する能力は、単に整理整頓するためだけのものではなく、プロジェクトの進化という物語を鮮明に描き出すためのものなのです。あなたの今後の Git 履歴が常にクリーンで、マージが衝突せず、コミットが常に意味のあるものであることを願っています!