【Git】コミットした内容を取り消す方法をわかりやすく解説!

スポンサーリンク

Gitを使っていると、「間違えてコミットしてしまった!」という経験は誰しもあるのではないでしょうか?
例えば、

  • commitメッセージを間違えた
  • 必要なファイルを追加し忘れた

などといった状況はよくあるかと思います。

しかし、Gitには状況に応じたさまざまなcommitの取り消し方法が用意されているため、適切な方法を選べば簡単に修正できます。

本記事では、状況別に適切なcommitの取り消し方法をわかりやすく解説します。
もし誤ってcommitしてしまった場合でも、この記事を読めば安心して対応できるようになるかと思います!

コミットを取り消す方法(状況別)

Gitでは、commitの取り消し方がいくつかあります。状況に応じて適切な方法を選びましょう。

直前のコミットを修正したい(–amed)

状況

  • commitした直後に、メッセージを変更したい
  • commitに追加し忘れたファイルを含めたい

解決方法

--amendオプションを使えば、直前のcommitを修正できます。

git commit --amend

実行後

  • 既存のcommitメッセージを編集
  • ステージングされた新しい変更を既存のcommitに追加

注意点

  • push前なら安全に修正可能
  • push後にamendすると履歴が書き換わるため、git push --forceが必要

直前のコミットを取り消したい(reset –soft)

状況

  • まだpushしていないが、直前のcommitをやり直したい

解決方法

reset --softを使うと、commitを取り消して変更を保持できます。

git reset --soft HEAD~1

HEAD~1 は、ひとつ前のコミット内容を指します。HEAD~3 にすると3つ前のコミット内容が対象になります。

実行後

  • commitは取り消されるが、変更はステージングエリアに残る

注意点

  • commitをやり直したいときに便利
  • push後に使うとリモートと履歴がズレるので注意

コミットを完全に取り消したい(reset –hard)

状況

  • commitだけでなく、変更そのものも取り消したい

解決方法

reset --hardを使うと、commitだけでなく、変更も完全に消去できます。

git reset --hard HEAD~1

ポイント

  • commitと変更がすべて削除される

注意点

  • この操作は元に戻せないため、慎重に実行すること!
  • push済みのcommitを削除すると、リモートとの差異が発生する

コミットを取り消して過去の状態に戻したい(revert)

状況

  • commitをすでにpushしてしまったが、取り消したい

解決方法

revertを使うと、対象のcommitを打ち消す新しいcommitを作成できます。

git revert <コミットID>

ポイント

  • commitを取り消すが、履歴は残る

注意点

  • resetと違い、履歴を改変せずに取り消せるため、安全
  • push済みのcommitも問題なく取り消し可能

コミットを取り消して履歴を書き換えたい(rebase)

状況

  • 何個か前のcommitをまとめて変更・削除したい
  • 履歴をきれいに整理したい

解決方法

rebase -i(インタラクティブrebase)を使うと、複数のcommitを編集できます。

git rebase -i HEAD~3

ポイント

  • 直近3つのcommitを編集
  • 不要なcommitを削除、メッセージ変更、複数のcommitをまとめる

注意点

  • push後に使うと履歴が書き換わるため、git push --forceが必要
  • チーム開発では慎重に使用すること

まとめ

Gitのcommitを取り消す方法はいくつかありますが、状況に応じて適切なコマンドを選ぶことが重要です。

適切な方法を選ぼう!

  • resetはローカルの履歴を変更するため、push前なら自由に使える
  • revertcommitを打ち消す新しいcommitを作成するため、安全に履歴を維持できる
  • reset --hardは取り返しがつかないため、本当に必要な場合のみ使う

間違えてcommitしても、Gitを正しく理解していれば安心して対応できます。
状況に応じた最適な方法を選び、効率よくGitを活用しましょう!

Git
スポンサーリンク
なんくるをフォローする

コメント

タイトルとURLをコピーしました