失敗前提で“怖くない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に“日付付きファイル”として保存されます。ゴミ箱を空にするまで復元可能。
- 最短復元手順:
- OSのゴミ箱/Trashを開く
- 「Discarded changes …」等のファイルを探す
- 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本)
- 未Pushの取り消し:わざとコミット → Undo → 編集 → 再コミット
- Push済みの取り消し:Push → Revert Changes in Commit → History確認
- Discard復元:編集 → Discard → OSのゴミ箱から元に戻す
- 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回
ディスカッション
コメント一覧
まだ、コメントがありません