GitHub Desktopで間違ってコミットしても、まだリモートリポジトリへプッシュしていない最新コミットなら、編集したファイルを消さずにやり直せます。
GitHub Desktopの「Undo」を実行すると、コミットだけが取り消され、そのコミットに含まれていた変更はPC上の作業ディレクトリへ戻ります。ブランチは1つ前のコミットを指す状態になるため、内容を修正してから改めてコミットできます。([GitHub Docs][1])
ただし、すでにGitHubへプッシュしたコミットは扱いが異なります。共有済みの履歴を壊さないため、基本的にはUndoではなく、履歴を残したまま変更を打ち消す「Revert」を検討します。
GitHub Desktopでプッシュ前のコミットだけを取り消し、変更を残す方法
今回使うのは、GitHub Desktopの「Undo」機能です。
Undoは、次の条件に当てはまる場合に適しています。
- 取り消したいのが最新のコミットである
- そのコミットをまだプッシュしていない
- コミットした変更内容は消さずに残したい
- 内容を修正してから再コミットしたい
Undoを実行しても、コミットに含まれていた編集内容が破棄されるわけではありません。コミット前の「変更中」の状態へ戻るため、誤字の修正、不要なファイルの除外、コミット内容の分割などを行えます。([GitHub Docs][1])
状況ごとの判断は、次のように整理できます。
| 状況 | 適した操作 | 結果 |
|---|---|---|
| 最新コミットが未プッシュ | Undo | コミットを取り消し、変更を作業中の状態へ戻す |
| コミットをプッシュ済み | Revertを検討 | 履歴を残したまま、変更を打ち消すコミットを作る |
| 最新コミットのメッセージだけ直したい | Amendを検討 | 最新コミットを修正する |
| 複数の未プッシュコミットをまとめて戻したい | Reset to commitを検討 | 指定したコミットまでブランチを戻す |
Undoは、すべてのコミット取り消しに使う万能機能ではありません。特に、プッシュ済みかどうかで対応を分けることが重要です。([GitHub Docs][1])
Undoを実行する前に確認すること
操作する前に、リポジトリ、ブランチ、プッシュ状況の3点を確認します。
対象のリポジトリが正しいか確認する
GitHub Desktopの画面上部で、現在開いているリポジトリを確認します。
名前が似たリポジトリを複数管理している場合、別のリポジトリで操作しないよう注意してください。特に、検証用と本番用、個人用と組織用のリポジトリを分けている場合は間違えやすくなります。
対象のブランチが正しいか確認する
続いて、現在選択されているブランチを確認します。
たとえば、修正作業をfeature/loginブランチで行ったつもりでも、実際にはmainブランチへコミットしている可能性があります。Undoを実行する前に、取り消したいコミットが現在のブランチの最新コミットであることを確認してください。
コミットが未プッシュか確認する
Undoの対象は、リモートブランチへプッシュする前のコミットです。GitHub公式ドキュメントでも、Undoはリモートブランチへプッシュする前に使用する操作として案内されています。([GitHub Docs][1])
判断に迷う場合は、次の点を確認します。
- GitHub Desktopに未送信のコミットがあること
- GitHub上のリポジトリ履歴に対象コミットが表示されていないこと
- 他のメンバーが対象コミットを取得していないこと
すでにGitHub上で対象コミットを確認できる場合は、未プッシュとはいえません。Undoを無理に適用するのではなく、後述するRevertを検討します。
GitHub DesktopでコミットをUndoする手順
Changesタブを開く
GitHub Desktopの左側にあるサイドバーで、「Changes」タブを開きます。
「History」タブを開いている場合は、Changesへ切り替えてください。公式手順でも、最初にChangesタブを選択するよう案内されています。([GitHub Docs][1])
サイドバー下部のUndoを選ぶ
Changesタブを開いた状態で、サイドバー下部に表示される「Undo」を選択します。
GitHub公式ドキュメントが示している基本操作は、次の2段階です。
- Changesタブが選択されていることを確認する
- サイドバー下部のUndoをクリックする
([GitHub Docs][1])
似た名前の操作や、ファイル単位の変更破棄を選ばないよう注意してください。今回使用するのは、最新コミットを取り消すためのUndoです。
変更内容がChangesへ戻ったことを確認する
Undoを実行すると、取り消したコミットに含まれていた変更が、未コミットの変更として作業ディレクトリへ戻ります。
Changesタブに、編集したファイルや差分が表示されていることを確認してください。GitHub公式ドキュメントでは、Undoによって変更が作業ディレクトリへ復元され、ブランチが1つ前のコミットへ戻ると説明されています。([GitHub Docs][1])
この時点では、変更内容はまだ新しいコミットとして記録されていません。
必要な修正をして再コミットする
Changesへ戻ったファイルを修正します。
たとえば、次のようなやり直しができます。
- 誤字やコードの間違いを修正する
- コミットに含めたくないファイルのチェックを外す
- デバッグ用のログ出力を削除する
- 設定ファイルや一時ファイルをコミット対象から除外する
- 変更を複数のコミットに分割する
- コミットメッセージを考え直す
修正が終わったら、コミット対象のファイルを確認し、新しいコミットメッセージを入力して再コミットします。
Undoするとコミットとファイルはどうなるのか
Undo後の状態を理解しておくと、「編集内容まで消えるのではないか」という不安を減らせます。
| 対象 | Undo後の状態 |
|---|---|
| 最新コミット | 現在のブランチから取り消される |
| ブランチ | 1つ前のコミットを指す |
| コミット内の変更 | 作業ディレクトリへ戻る |
| 編集したファイル | 未コミットの変更として残る |
| リモートリポジトリ | 未プッシュなので変更されない |
たとえば、次のような履歴があるとします。
コミットA
└─ コミットB「ログイン画面を修正」← 未プッシュ
コミットBをUndoすると、ブランチはコミットAを指す状態へ戻ります。一方、コミットBに含まれていた修正内容は、未コミットの変更として残ります。
コミットA ← 現在のブランチ
+ ログイン画面の変更がChangesに戻る
その後、内容を修正してコミットし直せます。
コミットA
└─ コミットC「ログイン画面の入力チェックを修正」
ここで示したコミット名は説明用の例です。実際のファイル名、ブランチ名、コミットメッセージは、利用しているリポジトリによって異なります。
「Discard Changes」とUndoを混同しない
編集したファイルを残したい場合、最も注意したいのが「変更の破棄」と「コミットの取り消し」の違いです。
Undoは、コミットを取り消しながら変更を作業ディレクトリへ戻す操作です。一方、ファイルに対する「Discard Changes」は、作業中の変更を破棄する目的で使われます。
| 操作 | 対象 | 編集内容 |
|---|---|---|
| Undo | 最新の未プッシュコミット | 作業中の変更として残る |
| Discard Changes | 未コミットのファイル変更 | 破棄される可能性がある |
| Revert | プッシュ済みを含むコミット | 打ち消す新しいコミットを作る |
「ファイルを消さずにコミットだけやり直したい」という目的なら、Changesに戻すUndoを使用します。
操作前に、ボタン名と対象を必ず確認してください。重要な変更がある場合は、別フォルダへのコピーや別ブランチへの退避など、復元できる状態を用意しておくと安全です。
すでにプッシュ済みならRevertを検討する
対象コミットをすでにGitHubへプッシュしている場合は、Undoと同じ考え方で履歴を戻さないようにします。
プッシュ済みのコミットは、他のメンバーが取得している可能性があります。履歴そのものを書き換えると、他のメンバーのローカル履歴と整合しなくなることがあります。
この場合は、元のコミットを履歴に残したまま、変更内容を打ち消す新しいコミットを作るRevertが適しています。GitHub公式ドキュメントでも、他の共同作業者のコミット履歴を乱さずにプッシュ済みコミットを取り消す方法として、Revertが案内されています。([GitHub Docs][1])
考え方は次のとおりです。
コミットA
└─ コミットB「誤った変更」← プッシュ済み
└─ コミットC「コミットBを打ち消す変更」
コミットBを履歴から消すのではなく、コミットCによって変更を相殺します。誰が何を変更し、どの操作で取り消したのかが履歴に残るため、共同開発では状況を追跡しやすくなります。
Undoが表示されないときに確認するポイント
Changesタブを開いてもUndoが見つからない場合は、次の点を確認します。
Historyタブを開いていないか
Undoの公式手順は、Changesタブから実行します。Historyを表示している場合は、Changesへ切り替えてください。([GitHub Docs][1])
操作するリポジトリやブランチを間違えていないか
取り消したいコミットが別のブランチにある場合、現在のブランチではUndoできません。リポジトリ名とブランチ名を見直します。
対象コミットをすでにプッシュしていないか
プッシュ済みの場合は、未プッシュコミット向けのUndoではなく、Revertを検討します。
取り消したいのが最新コミットではない可能性がないか
サイドバー下部のUndoは、直前の未プッシュコミットをやり直す用途に向いています。
複数の連続したコミットを戻したい場合や、過去の特定地点までブランチを戻したい場合は、「Reset to commit」という別の操作が必要になることがあります。GitHub公式ドキュメントでも、複数の連続したコミットを戻す方法として、過去のコミットを選択するリセット操作が案内されています。([GitHub Docs][1])
ただし、複数コミットのリセットは影響範囲が大きくなります。現在の記事で扱う「直前のコミットを、ファイルを残してやり直す操作」とは分けて考えてください。
コミットメッセージだけ直すならAmendも候補になる
コミット内容に問題がなく、最新コミットのメッセージだけを修正したい場合は、Undoして最初からコミットし直す必要がないこともあります。
GitHub Desktopでは、最新コミットのメッセージを変更したり、新しい変更を最新コミットへ追加したりする目的で、コミットのAmendを利用できます。([GitHub Docs][1])
目的に応じて使い分けます。
| やりたいこと | 検討する操作 |
|---|---|
| 編集内容を作業中の状態へ戻して修正したい | Undo |
| 最新コミットのメッセージを修正したい | Amend |
| 新しい修正を最新コミットへまとめたい | Amend |
| プッシュ済みコミットを安全に打ち消したい | Revert |
| 複数コミットを過去の地点まで戻したい | Reset to commit |
単にメッセージを修正したいだけなら、UndoよりAmendのほうが目的に合う可能性があります。
コマンド操作や強制プッシュを安易に使わない
Gitの解説記事では、コミットを戻す方法としてgit resetや強制プッシュが紹介されることがあります。
しかし、編集内容を残したい場面でgit reset --hardを安易に使うと、作業中の変更を失う危険があります。また、プッシュ済みの共有ブランチを強制プッシュで書き換えると、他のメンバーの作業へ影響する可能性があります。
GitHub Desktopで直前の未プッシュコミットをやり直すだけなら、まずはアプリに用意されているUndoを使うのが分かりやすい方法です。
特に初心者は、次の順序で判断すると操作を誤りにくくなります。
- 対象コミットが未プッシュか確認する
- 最新コミットならChangesタブのUndoを使う
- 変更がChangesへ戻ったことを確認する
- 内容を修正して再コミットする
- プッシュ済みならUndoではなくRevertを検討する
GitHub DesktopのUndoで安全にコミットをやり直そう
GitHub Desktopで間違ってコミットしても、未プッシュの最新コミットなら、Changesタブ下部のUndoで取り消せます。
Undo後は、コミット内の変更が未コミットの状態へ戻るため、編集したファイルを消さずに修正できます。内容を確認し、不要なファイルを除外したり、誤りを直したりしてから再コミットしてください。
一方、すでにプッシュしたコミットは共有履歴として扱い、Revertを検討します。まずリポジトリ、ブランチ、プッシュ状況を確認し、「未プッシュならUndo、プッシュ済みならRevert」という基準で判断することが重要です。
[1]: https://docs.github.com/en/desktop/managing-commits/undoing-a-commit-in-github-desktop “Undoing a commit in GitHub Desktop – GitHub Docs”

コメント