コンテンツにスキップ
GitTree

レッスン 29 · 回復

reflog で失われたコミットを見つける

ハード リセットによってローカル reflog に残されたコミットを見つけて、そのファイルを信頼する前にチェックし、現在のチェックアウトを移動せずにそのファイルにブランチを置きます。

このブラウザに進行状況が保存されました。

再生すると、YouTube からビデオが読み込まれます (プライバシー強化モード)。

英語ナレーション · English and Arabic 件のキャプション

動画ページを開くYouTubeで見る

何を学ぶか

  • HEAD とブランチがどこにあったかについてのこのリポジトリの記録として reflog を読み取ります。
  • コミット候補を救出する前に、その内容を確認してください。
  • 測定されたコミットをチェックアウトせずにブランチを作成します。
  • reflog では戻せないもの、つまりコミットされていない作業や期限切れのエントリについて説明します。

始める前に

あなたはレッスン 18 の結果 M からの分岐である private/lost-signup にいます。「ドキュメント: サインアップ回復メモを保持する」というメモをコミットして、docs/signup-recovery.md を追加し、1 コミット前にハード リセットを実行しました。メモはブランチ、グラフ、ファイルから消えています。まだレスキュー ブランチがなく、他には何も変更していません。

すべてがローカルであり、無料プランです (GitTree はサインインを要求します)。ホスティング アカウント、プロバイダー、インターネットはありません。すべてのアイデンティティは架空のものです (example.com)。このレッスンを実際のプロジェクトで実行しないでください。準備におけるハードリセットは、使い捨てコピーでのリハーサルです。

変更は、GitTree 内で行うか、ネイティブ Git コマンドを使用して行います。同じコピー内で両方を行うことはできません。結果の読み取りは常に安全です。メニュー ラベルは GitTree 2.0 独自の文字列から取得され、ネイティブ コマンドは使い捨てコピーの Git 2.43 で実行されました。 GitTree ステップは macOS、Windows、または Linux で実行されませんでした。

概念と状態の効果

reflog は、ref の動きのローカル日記です。 HEAD には 1 つがあり、各ブランチにも 1 つあります。 「コミット」、「チェックアウト」、「リセット」などを記録し、それぞれが到達したコミットを記録します。別のクローンにはあなたの日記がありません。ブランチ名が存在しないコミットはまだ存在する可能性があり、それを見つける方法は reflog です。

HEAD@{1} などのセレクターはエントリを今から遡ってカウントするため、後の操作ごとに変更されます。使用する前に候補のアクション、時刻、ID、ファイルを読んでください。オフセットをレシピとして記憶しないでください。

reflog は保存されたコミットを検索します。レッスン 27 で示したように、コミットされていない編集は見つかりません。エントリの有効期限: デフォルトでは、Git はブランチが到達しないコミットのエントリを約 30 日間保持します。リポジトリはこれを変更できます。回復中にクリーンアップまたは期限切れコマンドを実行しないでください。

コミット時にブランチを作成すると、参照が 1 つ追加されるだけで、他には何も追加されません。現在のブランチ、インデックス、ファイルはそのまま残ります。

正確なプロジェクトの状態を準備する

レッスン 18 の結果 M の別の通常のコピーから開始し、オリジナルはそのままにしておきます。ブランチを作成し、DOC_LOST を保存してコミットし、1 つのコミットをハードリセットして戻します。この破壊的準備は、使い捨てコピーのみを対象としています。

完全なファイル入力

以下のフェーズでのみ保存します。これらは、最後に改行を含む完全な UTF-8/LF 本文です。 Markdown フェンスは決して貼り付けないでください。変更されていない実行可能ファイルは、名前付き入力を継承します。別のバリアントのバージョンでオリジナルを上書きしてはなりません。

docs/signup-recovery.md — DOC_LOST

出力
# Recovered signup work

Keep a branch name before leaving useful experimental work.

GitTreeで

Command+Shift+P (Ubuntu では Ctrl+Shift+P) でパレットを開きます。

  1. 次のセクションに示すようにリハーサルを構築し、失われたコミットの主題に注意してください。
  2. パレットを開いて View Reflog… を実行します。ダイアログ「Reflog」が開き、Reflog of が HEAD に設定されます。エントリは新しいものから順にリストされます。
  3. 上位のエントリを読んでください。最新のものには「リセット」と表示され、その下のものには「ドキュメント: サインアップ回復メモを保持する」という件名で「コミット」と表示されています。リストが長い場合は、Show Older Entries を使用します。 2 行目が常に正しいとは考えないでください。
  4. コミットエントリを選択します。ダイアログには Show in Graph と New branch name が表示されます。 Show in Graph はブランチが到達するコミットのみを配置できるため、この失われたコミットについてはダイアログが閉じられ、グラフは M: 次のステップのために reflog を再度開きます。コミットのファイルを復元した後に読み取ります。
  5. ダイアログに戻り、同じエントリを選択し、New branch name に rescue/signup と入力して、Restore as Branch を選択します。通知には「ブランチレスキュー/サインアップが作成されました。元に戻すと再度削除されます。」と表示されます。
  6. 結果を確認してください: rescue/signup は失われたコミットを指しており、現在のブランチはまだ M 上の private/lost-signup であり、ファイルは変更されていません。復元されたコミットを選択し、そのファイル docs/signup-recovery.md を開きます。これは DOC_LOST です。
  7. レスキューブランチはそのままにしておきます。グラフを整理するためにクリーンアップを実行しないでください。

コース内のすべての通常のコミット: Summary は指定された件名、Description は空、オプション Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit、および Allow Empty Commit はオフのままです。

ターミナル内

レッスン 18 の結果の別のクリーン コピーのみ:

Command · bash
git switch --create private/lost-signup

DOC_LOST を docs/signup-recovery.md として保存し、次のようにします。

Command · bash
git add -- docs/signup-recovery.md
git commit --quiet -m "docs: keep the signup recovery note"
git reset --hard HEAD~1
git reflog show --format=%gs -2 HEAD
出力
reset: moving to HEAD~1
commit: docs: keep the signup recovery note

候補者を ID とともにリストし、紛失したと思われる候補者を確認します。

Command · bash
git reflog show --format='%H %gs' HEAD
git show "<lost-sha>:docs/signup-recovery.md"

<lost-sha> を「commit: docs: keep the Signup Recovery Note」行の ID に置き換えます。この直接の例では、HEAD@{1} は同じコミットですが、そのオフセットはルールではありません。チェックアウトせずにレスキュー ブランチを作成します。

Command · bash
git branch rescue/signup "<lost-sha>"
git show rescue/signup:docs/signup-recovery.md
git symbolic-ref --short HEAD
git status --short

ファイルは DOC_LOST、出力されたブランチは private/lost-signup、ステータスは空です。 HEAD が M のままであるため、ファイルにはメモが表示されません。有効期限やクリーンアップ コマンドはこれに含まれません。

結果

Where you end: rescue/signup は失われたコミットを指しており、そのファイルは DOC_LOST です。現在のブランチ、インデックス、ファイルはリセット後の状態のままであり、何もプッシュされていません。

よくある間違い

  • エントリを読み取る代わりに、固定レシピとして HEAD@{1} を使用します。
  • ブランチを保存する前に再度リセットまたはチェックアウトすると、エントリが追加され、必要なエントリが埋められます。
  • コミットされていない編集が reflog に保持されることが期待されます。
  • 何かを探しているときにクリーンアップ コマンドを実行します。

何か問題が発生した場合

コミットがリストにない場合は、間違った参照が表示されている可能性があります。HEAD とブランチの間で Reflog of を切り替え、Show Older Entries を使用してください。本当になくなっている場合は、有効期限が切れているか、まったくコミットされていません。アプリでは、Restore as Branch の後の通知に、「元に戻す」でブランチが再度削除されると記載されています。

理解度を確認してください

各質問に答えてから、その理由を読みましょう。 「必須」とマークされた質問は、レッスンの完了にカウントされます。

  1. 質問 1 / 6

    リフロッグとは何ですか?

    答えを 1 つ選択してください。

  2. 質問 2 / 6

    reflog について正しいのはどれですか?

    当てはまるものをすべて選択してください。

  3. 質問 3 / 6
    必須

    reflog で失われたコミットを見つけ、rescue/signup という名前のブランチとして復元を使用しました。何が見えますか?

    答えを 1 つ選択してください。

  4. 質問 4 / 6

    入力を変更します。メモをコミットしたことがないのに、ハード リセットを実行しました。 reflog はそれを取り戻すことができるでしょうか?

    答えを 1 つ選択してください。

  5. 質問 5 / 6
    必須

    さらにいくつかの操作を行った後、git branch rescue HEAD@{1} を実行しましたが、ファイルは必要なものではありませんでした。どうしたの?

    答えを 1 つ選択してください。

  6. 質問 6 / 6
    必須

    レスキュー ブランチを作成した後、レッスンどおりに機能したことを示すリードバックはどれですか?

    当てはまるものをすべて選択してください。

6 個中 0 個が正解です

必須の質問に正しく答えると、レッスンを完了できます。

このブラウザで確認しました。

練習する

最新の reflog の 2 行、失われたコミットの ID、回復されたファイルの最初の行、チェックアウトしているブランチを報告します。次に、コミットしていない編集について reflog に何が表示されるかを言います。

あなた自身の確認: サイトはあなたのコンピュータを認識できません。

レッスンを完了するには、必須の質問に正しく答え、実践的な演習を確認してください。

要約

  • reflog は、ref の移動に関するローカル日記です。
  • 候補を確認し、そこから分岐します。
  • 未保存の編集ではなく、コミットを検索します。

用語集の用語の紹介

Reflog — フォローする;救助ブランチ — فرع حفظ;セレクター — محدِّد。

ビデオトランスクリプト

ビデオのナレーションが次々と流れます。

トランスクリプトを表示する
  1. コミットがなくなったようです。 Git はまだ覚えています どこにあったか。
  2. reflog は、HEAD のローカル日記です。 そして枝ができました。
  3. コミットにブランチ名を付けることはできません その中に記載されています。
  4. 使い捨てコピーの場合: メモをコミットし、 それからハードリセットしてください。
  5. グラフではMのみを示しています。注記は、 どこにも見当たりません。
  6. 今はリセットしたりクリーンアップしたりしないでください。まずは見てください。
  7. パレットを開き、View Reflog を実行します。
  8. HEAD でダイアログが開きます。最新の動き が最初です。
  9. 最新の行はリセットです。そのすぐ下に 失われたコミットです。
  10. リストが長い場合は、古いエントリを表示します。
  11. HEAD と 枝。
  12. HEADを一度に覚えてはいけません。エントリーを読む 代わりに。
  13. コミットエントリを選択します。新しい選択肢 現れる。
  14. Show in Graph では配置できません: このコミットに到達するブランチはありません。
  15. したがって、まずブランチとして復元します。 次に、そのファイルを読み取ります。
  16. 戻って、同じエントリを選択します。
  17. ブランチ レスキュー スラッシュ サインアップに名前を付けます。
  18. ブランチとして復元します。通知にはこう書かれています 元に戻すと再度削除されます。
  19. レスキュー ブランチは失われたコミット上にあります。 あなたはまだMにいます。
  20. ファイルは変更されませんでした。
  21. ターミナルの最新の 2 行は次のとおりです。 リセットとコミット。
  22. ID を使用すると、その行ごとにコミットを選択します。
  23. パスを指定した git show はファイルを読み取ります そのコミット。
  24. git ブランチはレスキュー ブランチを作成します。私たちの チェックアウトはそのままです。
  25. ステータスは空で、ファイルは安全です 枝の上で。
  26. コミットされていない編集は含まれていません レフログ。
  27. エントリーの有効期限は切れます。その間クリーンアップを実行しないでください あなたは回復します。
  28. ローカルです。他のクローンにはあなたのものはありません 日記。
  29. 練習: 行、ID、 最初の行と分岐。
  30. 次に、GitTree 自身の元に戻すとやり直しです。