はじめに
Fieldnotes では、小規模なワークショップと庭園散策を開催しています。公開された更新によって、誤って Clay & Coffee の予約受付が停止してしまいました。その後の正しい更新では Sunset Walk が追加されています。チームは、新しいイベントと既存の予約をすべて残したまま、予約受付を復旧したいと考えています。
まず正常なワークショップを使い、通常の予約とチケットの受け取りを確認します。その後、実際の Git 履歴を調べ、新しい修正コミットで過去の不具合を取り消し、公開して、実際に予約を試します。サイト全体を巻き戻すと、有用な作業が失われてしまいます。
ターミナルでの基本的な移動、コミット、ブランチ、簡単な log/diff を理解していることが前提です。前のチームでのマージのコースを推奨します。入口として必要なのは、用意された Workspace と Event Desk のタブだけです。これは、1台の学習用マシン上の実際の Git リポジトリと HTTP アプリケーションです。この環境では、サイトは共有側の main を直接読み取ります。ホスティングされたデプロイパイプラインを学ぶものではありません。登場する人物とイベントはすべて架空です。所要時間の45分は、著者による見積もりです。
予約窓口を試し、不具合のある更新を特定する
このステップでは、正常な予約を体験し、不具合のあるワークショップを確認して、履歴のどの項目が不具合を表し、どの項目が残す価値のある後続の作業なのかを特定します。
Event Desk タブを開きます。ワークショップ一覧で Postcard Studio を見つけ、View workshop リンクをクリックします。この正常なワークショップには、Save your seat、Full name フィールド、Reserve a place が表示されます。Alex Morgan または別の例示用の名前を入力し、Reserve a place を1回クリックします。
確認画面には You're on the list. と表示され、Postcard Studio、Studio Two、EUR 10.00 が示されるはずです。Download ticket をクリックします。ブラウザーのダウンロード一覧から .txt ファイルを開きます。同じワークショップ、名前、集合場所、合計金額が含まれていなければなりません。予約番号は、実際の予約に対して生成されるため、実行ごとに異なります。これが、不具合のあるワークショップでも提供できるべき、通常の実用的な成果です。
ページヘッダーの All workshops をクリックします。Clay & Coffee を View workshop リンクから開きます。初期状態で想定される問題は、Registration is paused と表示され、予約フォームがないことです。既存の予約は引き続き有効です。予約設定を修復するために、それらを削除しないでください。
ヘッダーの All workshops をもう一度使い、Sunset Walk を開きます。15 Nov 2026、16:00、East Gate、EUR 6.00 の内容で、引き続き利用できなければなりません。この後から追加されたページは、不具合の一部ではなく、保持するべき正しい作業です。
Workspace タブに切り替えます。編集用リポジトリに移動して始めます。
cd /home/labex/project/event-desk/editor
cd は、このターミナルのディレクトリを変更します。パスを打ち間違えた場合は、pwd で現在のディレクトリを表示し、ls でその内容を一覧表示してから、上の完全な cd コマンドをもう一度実行してください。通常の移動ミスに、VM のリセットは必要ありません。
このリポジトリ内だけで使う作成者情報を設定します。--local は設定をローカルに限定し、引用符は空白を含む名前を1つにまとめます。以下は架空の例示用の値です。自分で値を選んでも構いません。
git config --local user.name "Event Editor"
git config --local user.email "events@example.com"
アプリは予約を編集用リポジトリの外に保存しています。その JSON ファイルでは、引用符で囲まれたフィールド名の後にコロンと値が続きます。名前やワークショップの識別子はテキストで、価格は整数のセント単位で保存されています。.. は親ディレクトリを意味します。そのため、次の読み取り専用コマンドは、編集用ディレクトリを離れずに、同じ親ディレクトリ内の予約ファイルを表示します。
cat ../bookings.json
元からある Casey Lane と Sam Rivera のレコード、および新しい Postcard Studio の予約を見つけてください。これらのレコードは変更せずに保持します。Git で修正するのはバージョン管理されたイベント設定であり、予約データ全体を巻き戻すわけではありません。
コミット履歴を読みます。--no-pager はスクロールするビューアーを開かずに直接出力し、--oneline はコミットごとに短い1行を表示し、--decorate はブランチポインターとタグにラベルを付けます。
git --no-pager log --oneline --decorate
最新の項目は Add the Sunset Walk event で、続いて Pause Clay and Coffee registrations、Open the Fieldnotes event desk があります。具体的なコミット ID は実行ごとに異なります。用意されたタグ incident-start は、引き継いだバージョンを指す固定の目印です。main とは異なり、新しいコミットを作成しても移動しません。この目印は変更せずに残してください。
目印が指す最新のコミットで何が変更されたかを読みます。show は、選択したコミットのメッセージとパッチを表示します。
git --no-pager show incident-start
events/sunset-walk.json が追加されています。これが保持するべき新しいイベントです。取り消す必要があるのは、この追加ではなく、その前の受付停止です。チェックポイントでは、既存のサンプル予約を新しい成果として扱わず、実際に行った新しい確認用の予約とチケットを確認します。
後続の作業を失わずに修正を追加する
このステップでは、不具合を生んだ差分を特定し、引き継いだ履歴の先端の後に新しいコミットを追加して、その差分だけを逆に適用します。
引き続き Workspace の /home/labex/project/event-desk/editor で作業します。リビジョンを表す式を使うと、チェックアウトしたりブランチを動かしたりせずに、祖先を指定できます。incident-start~1 は固定の目印から親を1つ前へたどったコミット、incident-start~2 は親を2つ前へたどったコミットを意味します。途中のコミットを読みます。
git --no-pager show incident-start~1
そのパッチは、registration_open を true から false に変更しており、対象は events/clay-and-coffee.json です。この真偽値の設定で、新規の予約受付を許可または停止します。capacity はワークショップの正の定員であり、こちらも利用できる状態を維持する必要があります。変更されていない price_cents の値 1800 は、EUR 18.00 を意味します。
元のイベントのスナップショットを読みます。コロンはリビジョンとファイルパスを結び付けます。したがって、次の式は、目印から親を2つ前へたどったコミットにあるファイルを選びます。
git --no-pager show incident-start~2:events/clay-and-coffee.json
元の設定では、予約受付は開いており、定員は12です。サイト全体をその古いバージョンに戻すと、Sunset Walk も消えてしまいます。一方、revert は、選んだ1つのコミットの変更を逆に適用する内容を計算し、現在のブランチに新しい修正として記録します。元の不具合のあるコミットは履歴に残り、後続の有用なコミットも残ります。
修正前に作業状態を確認します。--short は変更されたファイルを簡潔な一覧で表示します。用意されたリポジトリでは、何も出力されないはずです。
git status --short
ここで、特定した不具合のあるコミットを revert します。--no-edit は、Git が生成した修正メッセージをそのまま使い、エディターを開かないようにします。固定の目印を使うことで、ブランチが先へ進んだ後も対象が変わりません。
git revert --no-edit incident-start~1
Revert "Pause Clay and Coffee registrations" で始まる新しいコミットと、1ファイルの変更が表示されるはずです。作成者情報とコミット ID は異なる場合があります。
同じ固定の目印を使うコマンドをもう1回実行し、完了済みの操作を見分ける練習をします。この繰り返しでは、nothing to commit, working tree clean と表示され、非ゼロのステータスを返すことを想定しています。 単独で実行し、その後も先へ進んでください。
git revert --no-edit incident-start~1
この準備済みの適用済みケースでは、解決する必要がある未完了の revert はありません。空の修正コミットを作ろうとせず、履歴とステータスを確認します。
git --no-pager log --oneline --decorate
git status --short
元の Sunset Walk、受付停止、開始のコミットの上には、新しい修正がちょうど1つあり、作業中の変更はないはずです。incident-start の目印は、引き続き引き継いだバージョンを指しています。これによって、移動する HEAD と、障害時点を示す固定参照との混同も避けられます。
修正の正確な内容を確認します。diff は、指定した2つのスナップショットを比較します。HEAD は現在チェックアウトしているコミットで、-- はリビジョンと後続のファイルパスを区切ります。
git --no-pager diff incident-start HEAD -- events/clay-and-coffee.json
逆向きの変更である、false から true への変更だけが表示されるはずです。新しいイベントには、引き継いだバージョンとの差分がないことを確認します。
git --no-pager diff incident-start HEAD -- events/sunset-walk.json
Sunset Walk では、何も出力されないはずです。後続の作業を保持したまま、目的を絞ったローカルの修正ができました。
Event Desk に切り替え、ヘッダーの All workshops をクリックし、Clay & Coffee をもう一度開きます。まだ Registration is paused と表示されます。これは想定どおりです。編集用リポジトリのコミットはローカルにありますが、サイトは共有リポジトリを読み取るためです。次のステップで公開します。ここのチェックポイントでは、ローカルの修正コミットと保持されたファイルを確認します。
修復した予約受付を公開して試す
このステップでは、共有側の main に修正を届け、復旧したワークショップで実際に予約を作成し、新しいイベントと既存の予約がそのまま残っていることを確認します。
Workspace に切り替えます。引き続き /home/labex/project/event-desk/editor で作業します。origin は、用意されたリモートの名前で、接続先は /home/labex/project/event-desk/shared.git です。これは、編集可能な作業コピーを持たずに共有の履歴を保持する、ローカルのベアリポジトリです。push origin main は、手元の main をその宛先に送ります。
git push origin main
拒否されずに main -> main と表示されるはずです。新しいコミットは引き継いだ履歴の先端に続いているため、この通常のプッシュで、公開済みのすべてのコミットが保持されます。この環境にはバックグラウンドで変更するメンバーはいません。試行中に拒否された場合は、実際の履歴を調べてください。元の作業を失うような強制的な置き換えでは、タスクの条件を満たしません。
届けられた状態のポインターを確認します。
git --no-pager log --oneline --decorate
手元の main と origin/main は、新しい修正コミットを指すようになりました。元の障害時点の目印と、それ以前のすべてのメッセージは、その下に残っています。
Event Desk に切り替えます。ページヘッダーの All workshops をクリックし、Clay & Coffee を開きます。今度は Save your seat、Full name、Reserve a place が表示されます。名前を入力する前に、日付、集合場所、EUR 18.00 の価格が変わっていないことを確認します。

ワークショップのタイトルと右側のフォームを探してください。狭い画面では、フォームはイベント詳細の下にあります。残席数は実際の予約を反映するため、例とは異なることがあります。
Jamie Chen または別の例示用の氏名を入力し、Reserve a place を1回クリックします。確認画面には You're on the list. とともに、Clay & Coffee、14 Nov 2026、14:00、The Pottery Room、1名分、EUR 18.00 が表示されるはずです。

Download ticket をクリックし、ブラウザーのダウンロード一覧から生成された .txt ファイルを開きます。予約番号、ワークショップ、日付、時刻、集合場所、名前、人数、合計金額を確認画面と比較します。予約番号はあなたの予約に対して生成されるもので、スクリーンショットからコピーする値ではありません。
ヘッダーの All workshops を使い、Sunset Walk をもう一度開きます。完全なページには引き続き 15 Nov 2026、16:00、East Gate、EUR 6.00 が表示されなければなりません。Postcard Studio も、実際の残り定員の範囲で利用できる必要があります。
Workspace に切り替え、予約データ全体をもう一度読みます。
cat ../bookings.json
元の両方のレコードと、先ほどの Postcard Studio の予約が残り、新しい Clay & Coffee の予約が追加されています。予約データを巻き戻すことなく、バージョン管理されたイベントを修正できました。
最後に、作業状態を確認します。
git status --short
追跡済みファイルの変更は残っていないはずです。個人用の未追跡メモを作成していた場合は、そのままでも構いません。サイトに余分な追跡済みファイルを含めないでください。チェックポイントでは、実際の履歴、共有側への公開、完全なライブページ、保持されたレコード、実際のチケット内容を確認します。
まとめ
通常の予約で期待する業務上の結果を確認し、予約受付の不具合を過去のコミットまでたどり、git revert で目的を絞った修正を追加しました。新しいイベント、元の履歴、既存の予約はそのまま残りました。
通常のプッシュの後、共有側を読むサイトは新しい予約を受け付け、正しいイベントと価格の実際のチケットを提供しました。独立したチャレンジでは、不具合のある設定が変わり、後続の正しいコミットが2つ含まれます。修正対象を選ぶ前に、引き継いだ履歴を調べてください。



