コンテンツにスキップ
GitTree

Git ガイド

git のリセット、リベース、コミットを元に戻す: Git 内の (ほぼ) あらゆるものを復元する方法

Git が作業を永久に破棄することはほとんどありません。ここでは、最後のコミット、修正、git restart --hard、リベース、削除されたブランチ、または git reflog による強制プッシュを元に戻す方法と、GitTree の Undo がそのほとんどをワンクリックで処理する方法を説明します。

作者 Kodmora更新されました 4 分で読みました
GitTree のコミット メニューには、チェリーピック、元に戻す、ブランチの作成、タグ付け、比較のアクションが含まれます

git リセット、リベース、またはコミットを元に戻すには、git reflog を実行し、間違いの直前のエントリを見つけて、たとえば git reset --hard HEAD@{1} を使用してブランチをそのエントリに戻します。 Git は、HEAD と各ブランチのすべての動きを reflog に記録し、デフォルトでは、失われたコミットのエントリも 30 日間 (ブランチ上に残っているコミットの場合は 90 日間) 保持するため、コミットされた作業が消えることはほとんどありません。唯一の例外は、コミットしたことのない仕事です。

以下は、よくある間違いごとのレシピです。すべてのコマンドはプレーンな Git であり、macOS、Windows、および Linux で同じように機能します。 Windows では、Git for Windows に付属する Git Bash で実行します。PowerShell には引用符で囲まれた HEAD@{1} などの reflog 名が必要ですが、grep はありません。最後に、デスクトップ Git クライアントである GitTree が 19 種類の操作の回復スナップショットを保持し、ほとんどの間違いがワンクリックで元に戻る方法を説明します。

Git undo チートシート: 各間違いに対するコマンド

状況を見つけて、何かを実行する前にそのセクションを読んでください。 HEAD@{1} は「HEAD が 1 手前にあった場所」を意味します。それ以降に他のコマンドを実行した場合は、まず git reflog で正しい番号を調べてください。

Git でよくある間違いを元に戻すコマンド
間違い指示気をつけてください
最後のコミット、変更を保存しますgit reset --soft HEAD~1プッシュしていないコミットのみ
最後のコミット、すでにプッシュされていますgit revert HEAD古いコミットをキャンセルするコミットを追加します
悪い git commit --amendgit reset --soft HEAD@{1}HEADが再び移動する前に実行してください
git reset --hardgit reset --hard HEAD@{1}コミットされていない変更はreflogにありません
完成したリベースgit reset --hard ORIG_HEAD次回のリセット、マージ、またはリベースにより ORIG_HEAD が上書きされます
ローカルマージgit reset --hard ORIG_HEADプッシュしたら、git revert -m 1 <merge> を使用します
削除されたブランチgit branch <name> <hash>ハッシュは削除メッセージまたはreflogにあります
落ちた隠し場所git stash apply <hash>ハッシュはドロップメッセージに含まれています
力押しgit push --force-with-lease origin <hash>:main間に割り込んだ人には警告する

Git reflog の説明: すべてのコマンドにおけるセーフティ ネット

reflog (参照ログ) は、HEAD とブランチ ヒントがどこを指しているのかを示す個人的な日記です。コミット、チェックアウト、リセット、マージ、リベース、修正、プルごとに行が追加され、origin/main などのリモート追跡ブランチも行を取得します。これはローカルの .git フォルダにのみ存在します。プッシュされることはなく、新しいクローンは空のクローンから開始されます。

git reflog
git reflog show main
git reflog --date=relative

リベース後の一般的な git reflog は次のようになります。最新のエントリが最初になります。

6c55495 HEAD@{0}: rebase (finish): returning to refs/heads/feature-login
6c55495 HEAD@{1}: rebase (pick): Validate the email field
cb6e15e HEAD@{2}: rebase (pick): Add the login form
2c44bc3 HEAD@{3}: rebase (start): checkout main
595b83d HEAD@{4}: commit: Validate the email field

間違いの前の最新行まで読みます。ここでは HEAD@{4}、rebase (start) より前に行われたコミットです。 Git がコミットを期待する場所ならどこでも、そのハッシュまたはその名前を使用します。 main@{2.hours.ago} も機能します。エントリは 90 日後、またはブランチが到達できないコミットの場合は 30 日後に期限切れになり、エントリが存在する間、git gc はそのコミットを保持します。

git reflog を使用して失われたコミットを 4 つのステップで復元する

  1. reflog をリストする

    1 つのブランチに対して git reflog または git reflog show <branch> を実行し、間違いの前の最新エントリをメモします。

  2. コミットを検査する

    git log --oneline -5 HEAD@{4} を実行して、これが元に戻したい状態であることを確認します。まだ何も変わりません。

  3. レスキューブランチに保存します

    git branch rescue HEAD@{4}を実行します。ファイルはそのまま残り、コミットの有効期限が切れることはありません。

  4. ブランチを元に戻す

    まだ必要なものをコミットまたはスタッシュし、壊れたブランチで git reset --hard rescue を実行してから、git branch -d rescue でヘルパーを削除します。

Git で最後のコミットを元に戻す: ソフト、ミックス、またはハード リセット

コミットがまだコンピューター上にのみある場合、git reset はブランチをコミット 1 つ前に戻します。モードは、その変更に何が起こるかを決定します。

git reset --soft HEAD~1
git reset HEAD~1
git reset --hard HEAD~1
  • --soft は、変更を段階的に維持し、再度コミットできるようにします。メッセージを修正したり、忘れたファイルを追加したりするのに最適です。
  • デフォルトの --mixed では、作業フォルダー内の変更がステージングされずに保持されるため、コミットを分割できます。
  • --hard は、コミットされていない編集とともに変更をコミットとともに破棄します。 reflog はコミットをしばらく保持しますが、よく考えてください。

すでにプッシュしている場合は、書き換えないでください。git revert HEAD は、それをキャンセルする新しいコミットを記録します。無料レッスン プッシュ後の間違いを回復する では、元に戻すことや他の安全な方法を取り上げています。

git commit --amend を元に戻す

修正すると、コミットが新しいものに置き換えられます。オリジナルはreflogに残ります。修正の直後、git reset --soft HEAD@{1} はブランチを元に戻し、修正によって追加されたものをステージングしたままにします。その後、git reflog で commit (amend) 行を見つけて、その下のエントリを使用します。

git reset --soft HEAD@{1}

git restart --hard を元に戻す方法

ハード リセットによりブランチが移動され、ファイルが上書きされますが、ドロップされたコミットは Git のオブジェクト データベースに残ります。 reflog には移動が reset: moving to HEAD~2 として表示され、その下の行が移動位置を示します。リセットが最後のコマンドだった場合、これによりすべてが元に戻ります。

git reflog
git reset --hard HEAD@{1}
git fsck --lost-found

git リベースを元に戻す方法

競合によりリベースが停止した場合、git rebase --abort はブランチ、インデックス、ファイルを元の場所に戻します。それが終わったら、戻る方法は 2 つあります。リベースが開始されると、Git は古いヒントで ORIG_HEAD をポイントするため、その直後に git reset --hard ORIG_HEAD がリベースを元に戻します。さらに強力なのは、ブランチ自身の reflog です。リベースはブランチを rebase (finish) で一度だけ移動するため、feature-login@{1} は元の状態とまったく同じブランチになります。リベースまたはチェリーピックが一時停止すると、レッスン アクティブな操作を続行、スキップ、または中止する でそれぞれの方法が説明されます。

git rebase --abort
git reset --hard ORIG_HEAD
git reset --hard feature-login@{1}

リベースされたブランチをプッシュしていた場合、それを復元するには強制プッシュが必要です (以下を参照)。履歴を意図的に書き換えるには、Git GUI での対話型リベース のガイドをお読みください。

git マージを元に戻す

マージでは古いヒントも ORIG_HEAD に残るため、git reset --hard ORIG_HEAD はプッシュしていないヒントを元に戻します。競合中は、git merge --abort で抜け出すか、Git マージ競合を解決する のガイドに従ってください。プッシュされたマージは git revert -m 1 <merge-commit> で元に戻されます。後でそのブランチを再度マージしても、取り消しを元に戻さない限り、それらの変更は元に戻りません。

git merge --abort
git reset --hard ORIG_HEAD
git revert -m 1 <merge-commit>

削除された Git ブランチ (およびドロップされたスタッシュ) を復元する

ブランチを削除すると、コミットではなく名前が削除されます。 git branch -D はブランチが指すヒントを出力し、そのハッシュからブランチを再度作成するとそれが復元されます。

git branch feature-login 1a2b3c4
git reflog | grep "moving from feature-login"

その出力が失われましたか? HEADのreflogは今でも覚えています。 2 番目のコマンドは checkout: moving from feature-login to main を見つけます。 1 つ上のエントリ (一致が HEAD@{5} の場合は HEAD@{6}) がブランチの最後のコミットです。ブランチがまだリモート上にある場合は、git branch feature-login origin/feature-login の方が高速です。ブランチ全体ではなく 1 つのコミットを戻すには、cherry-pick で適用 します。

落ちた隠し場所を回復する

git stash drop と git stash pop は削除した隠し場所のハッシュを出力し、git stash apply <hash> はそれを戻します。ハッシュを使用しない場合、Git のドキュメントでは、到達不能な stash コミットを検索することを推奨しています。デフォルトの「WIP on …」メッセージとともに保存されたスタッシュが見つかります。

git stash apply 9d668e5
git fsck --unreachable | grep commit | cut -d' ' -f3 | xargs git log --merges --no-walk --grep=WIP --oneline

強制プッシュを元に戻す方法

強制プッシュするとリモート ブランチが自分のブランチに置き換えられるため、リモート上にのみ存在したコミットはそこから削除されます。リモート追跡ブランチも reflog を保持します。origin/main@{1} は、最後に確認したプッシュ前のリモート ブランチの場所であり、プッシュ出力には old...new の前半と同じハッシュが出力されます。

git reflog show origin/main
git push --force-with-lease origin 1a2b3c4:main

前回のフェッチ以降にリモコンが移動した場合、--force-with-lease はプッシュを拒否するため、チームメイトの修正を誤って上書きすることはできません。フェッチしなかったコミットは、コンピューター上に存在しませんでした。押した人がもう一度押すことができます。それから、その間に手を引いた人に伝えてください。 プッシュされたミスの回復に関するビデオ には、修復全体が示されています。

GitTree でワンクリックで元に戻す: 19 種類の操作の回復スナップショット

上記のすべては GitTree でも動作します。インストールされた Git (2.39 以降) が実行され、その組み込みターミナルがコミット グラフの下で独自のシェルを開きます。追加内容: GitTree は 19 種類の操作に対して refs/ogt/trash の下に回復スナップショットを保持し、破壊的なステップで削除されるものはすべて実行前に保存し、ツールバーの [元に戻す] ボタンで最後のステップを元に戻します。

元に戻すには、コミットと修正、チェックアウト、リセット、リベース (インタラクティブなものも)、破棄されたファイル、ハンクと行、削除されたブランチとタグ、クリーンアップされた追跡されていないファイルなどが含まれます。 GitTree から実行されるハード リセットの場合、スナップショットにはコミットされていない変更も保持されますが、プレーンな git reset --hard は元に戻すことができません。

[元に戻す] と [やり直し] は GitTree ツールバーにあり、グラフのコミット メニューには、任意のコミットに対して [リセット]、[元に戻す]、および [インタラクティブ リベース] が表示されます。
[元に戻す] と [やり直し] は GitTree ツールバーにあり、グラフのコミット メニューには、任意のコミットに対して [リセット]、[元に戻す]、および [インタラクティブ リベース] が表示されます。

19 枚のうち 2 枚は逆転されずに維持されます。強制プッシュはリモコンを変更しますが、もう一度押すと元に戻すことができます。そのため、GitTree は交換したチップを保持し、そのプッシュをユーザーに任せます (常に --force-with-lease で強制プッシュします)。ドロップされたスタッシュはスナップショットを作成されますが、「元に戻す」ではまだ復元されません。 GitTree も、後の作業を上書きする元に戻すことを拒否し、その理由を述べています。通常のプッシュをアプリから元に戻すことはできません。代わりに元に戻します。

リセットは 3 つのモードに名前を付けます。ソフトはすべての変更をステージングしたままにし、混合は変更を作業フォルダーに保持し、ハードは元に戻すことで復元できるスナップショットの後に変更を破棄します。
リセットは 3 つのモードに名前を付けます。ソフトはすべての変更をステージングしたままにし、混合は変更を作業フォルダーに保持し、ハードは元に戻すことで復元できるスナップショットの後に変更を破棄します。

GitTree のリセット、リベース、または削除されたブランチを元に戻す方法

  1. いつも通りに仕事をする

    通常どおりにブランチをリセット、リベース、破棄、または削除します。 GitTree が最初にスナップショットを取得します。ハードリセットダイアログにはその旨が表示されます。

  2. 「元に戻す」をクリックします

    ツールバーの「元に戻す」をクリックするか、コマンド パレット (Ctrl/⌘+Shift+P) から実行します。ツールチップには、「元に戻す: ブランチ機能ログインの削除」などのステップ名が表示されます。元に戻すことのできないステップがその理由を示しています。

  3. reflog でさらに遡ります

    元に戻すには、GitTree 自体が実行した内容が含まれます。ターミナルに入力されたコマンドの場合は、パレットから View Reflog… を実行し、エントリを選択して、[ブランチとして復元] を選択します。

  4. 押す前にグラフを確認してください

    コミット グラフ には、ブランチが元の位置に戻って表示されるため、何かがコンピューターから離れる前に結果を確認できます。

Git のあらゆる間違いを元に戻せる習慣

  • たとえ乱雑でも、早めにコミットします。 コミットされた作業のみが reflog に到達します。後でインタラクティブなリベースを使用して整理します。
  • 危険な編集の前に分岐します。 git branch backup/before-rebase は費用がかからず、期限切れになりません。
  • プレーンな `--force` は決して使用しないでください。 --force-with-lease は、まだ見ていないコミットを上書きしません。
  • 共有履歴を元に戻し、プライベート履歴をリセットします。 他の人がコミットをプルしたら、それを元に戻します。
  • Git を最新の状態に保ってください。 GitTree には Git 2.39 以降が必要ですが、Ubuntu 22.04 には 2.34 が同梱されています。 Ubuntu で Git をアップグレードする方法 を参照してください。

まだ入力するかクリックするかを選択していますか? Git GUI とコマンド ライン を読むか、GUI を使用した初心者向けの Git から始めてください。

GitTree には、macOS 13 以降、Windows 10 および 11 (x64)、および 64 ビット Linux (x86_64: Ubuntu 22.04+、Debian 12+) で、プライベート リポジトリを含むすべての Git 機能をカバーする無料プランがあり、AI アシスタントの Nour には、GitTree Pro が付属しています (を参照) 価格設定)。サインインするには、Git 2.39 以降と GitTree アカウントが必要です。ダウンロード ページ から入手するか、Linux でどのように動作するかを確認してください。

よくある質問

git restart --hard を元に戻すにはどうすればよいですか?

git reflog を実行し、reset: moving to … のすぐ下の行を見つけます。そこがあなたの支店があった場所です。リセットが最後のコマンドの場合、git reset --hard HEAD@{1} は削除されたコミットを元に戻します。コミットしていない変更は reflog にないため、Git はそれらを復元できません。 GitTree でハード リセットを実行した場合、元に戻すと最初に作成されたスナップショットから復元されます。

最後のコミットを取り消して変更を維持するにはどうすればよいですか?

変更をステージングしたままにする場合は git reset --soft HEAD~1 を実行し、作業フォルダー内でステージングを解除したままにする場合は git reset HEAD~1 を実行します。どちらもローカル ブランチのみを書き換えるため、プッシュしていないコミットに使用します。プッシュされたコミットの場合は、git revert HEAD を実行します。これにより、コミットをキャンセルするコミットが追加されます。

git リベースが完了した後に元に戻すにはどうすればよいですか?

リベースの直後、git reset --hard ORIG_HEAD はブランチを古いチップに戻します。それ以降に他のコマンドを実行した場合は、git reset --hard <branch>@{1} を使用します。リベースは終了時にブランチを 1 回だけ移動します。リベースされたブランチをプッシュした場合は、--force-with-lease を使用して復元されたブランチをプッシュします。

git reflog は失われたコミットをどのくらいの期間保持しますか?

失われたコミット (ブランチが到達しなくなったコミット) は、デフォルトで reflog エントリを 30 日間保持します。ブランチ上に残っているコミットのエントリが過去 90 日間残っていること。エントリが存在する間、ガベージ コレクションはコミットを維持します。コミットを無期限に保持するには、ブランチまたはタグ (git branch rescue <hash> など) を付けます。これは、Git がブランチが指すコミットを削除することはありません。

git restart --hard 後にコミットされていない変更を復元できますか?

通常、Git だけを使用することはありません。 reflog は作業フォルダー内の編集ではなくコミットを記録するため、エディターのローカル履歴を確認してください。ステージングされたファイルは、ファイル名なしで git fsck --lost-found が .git/lost-found/other/ に書き込むダングリング オブジェクトとして存続する場合があります。 GitTree は、自身のハード リセットの前に、コミットされていない変更をスナップショットします。

強制プッシュを元に戻すにはどうすればよいですか?

交換したリモート チップを見つけます。git reflog show origin/main はそれを origin/main@{1} としてリストし、プッシュ出力には old...new の最初のハッシュとして表示されます。次に、git push --force-with-lease origin <hash>:main を実行します。プッシュによって取得したことのないコミットが上書きされた場合は、プッシュした人に再度プッシュするよう依頼してください。

GitTree は git プッシュを元に戻すことができますか?

いいえ。通常のプッシュは GitTree から元に戻すことはできません。代わりにコミットを元に戻します。強制プッシュの場合、GitTree は交換したリモート チップを回復スナップショットに保持するため、何も失われませんが、リモートを復元するにはもう一度プッシュする必要があります。元に戻すには、コミット、リセット、リベース、チェックアウト、ブランチの削除などのローカル操作が含まれます。

git reflog はチームと共有されていますか?

いいえ。reflog はローカルの .git フォルダにのみ存在します。プッシュされることはなく、フェッチしても他の人のクローンが取得されることはなく、新しいクローンは空のクローンから始まります。したがって、チームメイトの失われたコミットは、そのマシン上でのみ回復でき、誰かがリモート ブランチを上書きした場合でも、reflog はコミットを保持します。

情報源

他の製品に関する申し立ては、2026年10月23日 の公式ページと照合して確認されました。価格と機能は変更されます。ベンダーのページが真実の情報源です。