はじめに
こんにちは、新卒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
もしくはオプションなし
commit
とadd
の取り消し(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の動き)を確認することができます。
具体的には
- コミット関連(
commit
、merge
、pull
、revert
など) - ブランチの切り替え(
check out
) - 履歴の書き換え(
reset
、rebase
など)
の3点です。
git reflog
でミスした時点を数えたら、git reset
で戻したい場所を指定して戻します。
$ git reset --hard HEAD@{1}
reset
をreset
で元に戻すことができます。
手順をまとめると、
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
し直せば問題ありません。
メリット
revert
はpush
済みのコミットを打ち消したいときに便利です。
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
を意識して開発していきましょう。
今回紹介した基本的な内容から、より理解を深めていっていただければ幸いです。
それでは!
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
https://rakus.hubspotpagebuilder.com/visit_engineer/rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com