失敗前提で“怖くないGit”——GitHub Desktopでやり直す実践ガイド(Discard復元まで)

バージョン管理は「人はミスをする」を前提に、やり直し・分岐・合意形成で安全に前へ進むための仕組みです。本稿ではその理念を、GitHub Desktopの具体操作とCLIの対応コマンドを並記して、実務・授業の両方で使える形にまとめます。

1. Gitは“失敗前提で可逆”という考え方

  • 可逆性:commit / branch / tag / reflog により、いつでも“戻れる”
  • 小さく頻繁にコミット:意味の塊で刻み、やり直しを容易に
  • チーム安全装置:PR・レビュー・保護ブランチ・CIで“壊れた変更”を未然にブロック
  • 脱出ハッチ:stash で退避、rebase 中断・継続(–abort / –continue)を知る

2. 代表操作の全体像(Desktop手順 × CLI)

A. 直前コミットをやり直す(未Push)

  • Desktop:Changes 下の Undo
  • CLI:
git reset --soft HEAD~1

B. 2〜3コミット前からやり直す(未Push)

  • Desktop:History で対象コミットを右クリック → Reset to commit
  • CLI:
git reset --mixed <hash>

C. Push済みの誤りを安全に取り消す

  • Desktop:History 右クリック → Revert Changes in Commit
  • CLI:
git revert <hash>

D. 直前コミットのメッセージ修正/入れ忘れ追加入れ(Amend)

  • Desktop:History の最新を右クリック → Amend commit → Begin Amend → 追加して Amend last commit※Push済みをAmendした場合は後続で Force push が必要
  • CLI:
git commit --amend

E. 必要な変更だけ別ブランチへ移植(Cherry-pick)

  • Desktop:History 右クリック → Cherry-pick commit
  • CLI:
git cherry-pick <hash>

F. 作業をいったんどかす(Stash)

  • Desktop:Changes のヘッダを右クリック → Stash All Changes(後で適用/破棄を選択)
  • CLI:
git stash push -u
git stash list
git stash apply

G. main を取り込んで最新化(Merge / Rebase)

  • Desktop:
    • Merge:Current Branch → Choose a branch to merge into… → main → Merge
    • Rebase:Branch > Rebase Current Branch… → main → 完了後 Force push origin
  • CLI:
git pull --rebase origin main
# または
git rebase main

3. Discard(変更の破棄)はゴミ箱に退避される

  • 仕様:GitHub Desktopで Discard した変更は、OSのゴミ箱/Trashに“日付付きファイル”として保存されます。ゴミ箱を空にするまで復元可能。
  • 最短復元手順
    1. OSのゴミ箱/Trashを開く
    2. 「Discarded changes …」等のファイルを探す
    3. Put Back(元に戻す)、または内容をコピーして元の場所に戻す
  • 補足:エディタ側が直前編集のUndo履歴を保持していれば、Discard直後に Ctrl/Cmd+Z でも戻せる場合があります

注意:Windowsで「ゴミ箱に送らず直ちに削除」の設定や、ネットワークドライブなど特殊環境では退避が失敗することがあります。重要作業の前は Stash や一時ブランチでの退避を推奨します。


4. Rebase で詰まったとき

  • 中止:git rebase –abort
  • 継続:git rebase –continue
  • 1コミット飛ばす:git rebase –skip

Desktopで解決が難しいコンフリクトに遭遇したら、いったんCLIで上記コマンドを使うと安全確実です。

git rebase --abort
git rebase --continue
git rebase --skip

5. “最後の砦”:reflog で「あの時点」へ戻る

Gitは参照(HEADやブランチ)の移動履歴を reflog に残します。

消えたと思ったコミットも、たいていここから救出できます。

手順例:

git reflog                   # 失う前の位置(ハッシュ)を探す
git switch -c rescue <hash>  # 救出用ブランチを切って内容確認
# または覚悟があれば
git reset --hard <hash>      # その地点へ強制巻き戻し

補助探索:

git fsck --lost-found        # dangling commit を探す

6. 現場で効く“事故を小さくする”チェックリスト

  • 今いるブランチは正しいか(Current Branch で確認)
  • 変更は意味単位で小さくコミットしているか
  • Push前に不要コミットを Undo / Reset to commit で整理したか
  • 基盤取り込みは Rebase か Merge をチームで統一しているか
  • 破壊的操作(reset / rebase)前に Stash または一時ブランチで退避したか
  • Discard の救済=OSのゴミ箱を理解し、空にする前に確認したか

7. 授業・オンボーディングで使えるミニドリル(10分×4本)

  1. 未Pushの取り消し:わざとコミット → Undo → 編集 → 再コミット
  2. Push済みの取り消し:Push → Revert Changes in Commit → History確認
  3. Discard復元:編集 → Discard → OSのゴミ箱から元に戻す
  4. Rebase更新:トピックブランチ作成 → mainにコミット → トピック側で Rebase Current Branch → コンフリクト解消 → Force push origin

付録:CLI早見表(コピー用)

# 直前コミットを取り消し(内容は作業ツリーに戻す)
git reset --soft HEAD~1

# 任意地点まで戻し(以降の変更を作業ツリーへ戻す)
git reset --mixed <hash>

# Push済みを安全に取り消し
git revert <hash>

# 最新コミットの書き換え
git commit --amend

# 必要コミットだけ移植
git cherry-pick <hash>

# 一時退避(未追跡も含める)
git stash push -u
git stash list
git stash apply

# Rebase:中止/継続/スキップ
git rebase --abort
git rebase --continue
git rebase --skip

# 失った参照の探索と救出
git reflog
git fsck --lost-found

まとめ

  • 未Pushは Undo/Reset、Push済みは Revert を基本線に
  • Discard は OSのゴミ箱から復元(環境例外に注意)
  • 最終手段は reflogこの三段構えで、Gitは“怖くない”道具になります。
訪問数 13 回, 今日の訪問数 13回