RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Git入門】git commitを取り消したい、元に戻す方法まとめ

git commit を取り消したい、元に戻す方法

はじめに

こんにちは、新卒2年目のtsudachantanです。
チーム開発にとっても便利なバージョン管理システムGit」……ですが、
「add して commit して pushして…」そこまではわかるけど、それ以外はいまいちわからない。
そんな状況の、Gitを使い始めたばかりの方が一番最初につまづくのは「commitの取り消し方」ではないでしょうか。

各コマンドがどのような動きをしているのか把握しないまま操作をすると
業務を行う上で、チームの開発ではなおさら支障をきたしかねません。
そこで、初心者の私が混乱しがちだった、「間違えてgit commitしてしまった場合」の対処法について、
自分自身の学習を兼ねて、Gitに慣れていない方に向けて簡単に説明していきたいと思います。
コミットの修正によく利用するGitコマンドをシーン別に分けて紹介し、それぞれのコマンドでできることをまとめました。
困ったときの参考になると幸いです。

git commitを元に戻すための複数の方法とそれぞれの取り消し方のメリット・デメリットを挙げていくので、
状況に応じて活用してみてください。

Git、git stash、git cloneのやり方を知りたい方は以下ブログもご一読ください。
【超入門】初心者のためのGitとGitHubの使い方 - RAKUS Developers Blog | ラクス エンジニアブログ
【Git入門】git stashで作業を便利に退避する - RAKUS Developers Blog | ラクス エンジニアブログ
【Git入門】git cloneで既存リポジトリをクローンしよう! - RAKUS Developers Blog | ラクス エンジニアブログ



目次



「reset」でコミットを取り消してなかったことする

$ git reset [打ち消したいコミットID]


git resetを使用すると、特定の時点までファイルを巻き戻すことができます。
※まだリモートリポジトリにpushしていない場合にのみ使用してください

git resetには3種類のオプションがあります。
どのオプションを選ぶかで結果が大きく変わるので、しっかり確認しておきましょう。

resetのオプション

  • git reset --soft
     commitのみ取り消し (HEADの位置のみ修正される)
     このコマンドを実行すると、まさに「コミットをする直前」の状態に戻ります。
     作業ディレクトリとステージングエリアはそのままです。
     まとめてコミットしたかったのに1つしかコミットしていなかった、
     まだ作業中なのにコミットしてしまった。といった場合に便利です。
     

  • git reset --mixedもしくはオプションなし
     commitaddの取り消し(HEADの位置・インデックスが修正される)
     HEADと一緒にステージが巻き戻ります。
     git addでステージしたけど、やっぱり戻したい。というときに便利です。
     作業ディレクトリのファイルは消えません。

  • git reset --hard
     全部を取り消し(HEADの位置・インデックス・ワーキングツリーが修正される)
     もっとも強力なオプションです。
     ステージングエリアにも作業ディレクトリにも残したくないといった場合に使用します。


メリット

git resetを使用すると、誤ったコミット自体を削除出来るのでコミットログが見やすくなります。
また、HEADの位置を大幅に移動することができます。

注意点

git resetは「commit を取り消した」というコミット履歴が残りません。
そのため、リモートリポジトリで公開されているコミットに対して行うと、不整合が発生してしまいます。
コミットそのものを削除してしまうので、既に他の誰かがコミットを重ねているときにresetしてしまうと、
存在するはずの親コミットがなくなってしまいます。
そのため、他のメンバーがpushできなくなります。

commitの実行後にpushした場合は使用せず、
ローカルな変更を取り消して元に戻したいときに限って、使用するようにしましょう。

「git reflog」で「reset」を取り消す

間違えてgit reset --hardして必要なコミットを消してしまった場合はgit reflogを使いましょう。

$ git reset --hard HEAD^ # 間違えてresetしてしまった!
$ git reflog
04f11b7 HEAD@{0}: reset: moving to 04f11b7
0208e28 HEAD@{1}: merge develop: Merge made by the 'recursive' strategy.
6908c20 HEAD@{2}: checkout: moving from develop to master

git reflogを使用すると過去の操作履歴(HEADの動き)を確認することができます。
具体的には

  • コミット関連(commitmergepullrevertなど)
  • ブランチの切り替え(check out
  • 履歴の書き換え(resetrebaseなど)

の3点です。

git reflogでミスした時点を数えたら、git resetで戻したい場所を指定して戻します。

$ git reset --hard HEAD@{1}

resetresetで元に戻すことができます。
手順をまとめると、

1.git reflogで操作履歴を見る
2.戻りたい地点の数字を指定してgit resetする

以上で間違えたresetを元に戻すことができます。

「revert」でコミットを打ち消す

おすすめの方法はgit revertを使って元に戻す方法です。

$git revert  [打ち消したいコミットID]

revertは指定したコミットと逆の内容をコミットしてくれます。
ちなみにrevertは「元に戻す」という意味です。

revertを使うには、打ち消したいコミットのハッシュ値を探す必要があります。
git logコマンドを使用して該当コミットのハッシュ値を調べましょう。

git revertで指定したコミット時点の状態まで作業ツリーを戻します。
また、git revertを使用してもコミットはなかったことにならず、「逆向きのコミット」の履歴が残ります。
つまり、歴史を改変することなく、新しく「revertしたコミット」が追加されるので、
pushした後でも安心して使用できます。
もし間違えてrevertしたとしても、もう一度revertし直せば問題ありません。


メリット

revertpush済みのコミットを打ち消したいときに便利です。
push済のコミットの上に、新しいコミットを乗せる形でコミットを元に戻すことができるからです。

コミット自体を削除するわけではないので、安全にコミットを元に戻すことができます。
また、誤った履歴も残っているので、revert自体の取り消しも簡単に行うことができます。
チーム開発をしている場合はresetよりもrevertの方が好ましいでしょう。

注意点

誤った履歴が残ってしまうので、コミットログが複雑になり見づらくなります。

「--amend」で直前のコミットを上書き修正する

git commit --amend
  • 「単に直近のコミットメッセージを変更したい」
  • 「コミット内容を後から追加したい」

上記の場合には--amendオプションが便利です。
 ※まだリモートリポジトリにpushしていない場合にのみ使用してください。

「直近のコミットメッセージを変更したい」

--amend オプションを追加してコミットします。
実行するとテキストエディタが開きます。
変更したい箇所を修正してエディタを終了すると、
直近のコミットメッセージをそれで置き換えることができます。

「コミットの内容を追加したい」

コミットしたあとで、そこにさらにファイルを追加したり変更したりしたくなった場合にも、
手順は基本的には同じです。
ファイルを編集してgit addしたりし、ステージングエリアをお好みの状態にしたら、
続いてgit commit --amendを実行します。

メリット

コミットを増やさず修正できるので、コミットログが複雑になりません。

注意点

コミットに追加することはできますが、削除することはできません。
直前のコミットではなく、さらに歴史をさかのぼったコミットを変更したい場合は
git rebaseを使用する必要があります。
pushしたコミットに対して使用すると、同じ変更が別のバージョンで見えてしまうことになり、
チームの混乱を招くので注意しましょう。

詳しくはこちらの記事をご覧ください。

現在の状態を確認しよう

間違ったコミットを防ぐためにも、自身の編集が完了したらコミットの前に現在の状態を確認しましょう。
コミット前だけでなく、コミットの修正後にも想定通りの修正が行えているか確認するとよいでしょう。

  • git status
     現在の状態を表示します。変更があったファイルを確認することができます。
  • git diff
     ソース内でどのような変更があったのか、差分を確認することができます。
  • git log
     コミット履歴を確認することができます。

困ったときには、現状を把握するためにまずログやステータスを確認しましょう。

おわりに

git commitの取り消し、元に戻す方法について紹介しました。
コミットに対するそれぞれのコマンドの働き方のイメージが掴めたでしょうか。
不慣れなうちは自分がどのような操作を行っているのかを、都度確認しながら利用していくのが良いと思います。
チーム開発をしている場合は、それぞれのコマンドの利用にいっそう注意が必要です。
もしコミットを間違えてしまっても、慌てずに状況に応じたコミットの取り消し方法を選んで、
後から見た人がわかりやすいcommitを意識して開発していきましょう。

今回紹介した基本的な内容から、より理解を深めていっていただければ幸いです。
それでは!


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.