はじめに
不十分な知識のままgitコマンドを入力したことにより、ミスしてしまった経験が最近ありました。日常的に触るコマンドならまだしも、機会が少ないコマンドは特に不十分な知識になりやすいなーと痛感しました。そこで今回は、自分にとってまだ曖昧なgit revert
とgit reset
の違いを手を動かして理解してみようと思いました。ともに変更を打ち消すものですが、内容は大きく異なりました。
※メールアドレスなど個人情報が含まれている箇所はグレーで塗りつぶしています。
コミット番号は関係ないと思うのですが、ここも塗りつぶしています。
サンプル
今回の記事作成にあたり、コミットを4つ作成しました。
コミット名:Initial commit
=> qiita.txtのファイル作成
コミット名:1st commit
=> qiita.txtの1行目にHello GaneHaru
と記述
コミット名:2nd commit
=> qiita.txtの2行目にHello Qiita
と記述
コミット名:3rd commit
=> qiita.txtの3行目にHello Git
と記述
ここまでのコミットの内容は以下になります。
git reset の使い方
git reset
は変更を打ち消すものの、変更を打ち消した履歴を残さないときに使います。
resetのあとに、--soft、--mixed、--hardのどれを入力するかで結果が大きく変わります。
HEAD~1
としていますが、コミット番号でも同様の再現が可能です。
git reset --soft
git reset --soft HEAD~1
git reset
はコミットを取り消しますが、取り消したという履歴は残しません。
git log
で確認してみると、3rd commitが削除されているものの、3rd commitが削除されたという履歴は残っていないことがわかります。また、resetの後に --softと入力すると、取り消したコミットの内容がステージングエリアに残されていることも確認できます。
【こういうときに使うのかな】
・コミットメッセージを間違えてしまい、すぐに修正したい場合
git reset --mixed
git reset --mixed HEAD~1
git reset
なので--softのときと同様、履歴は残しません。
--mixedを指定した場合、--softとは異なり取り消した内容がステージングエリアに残らず、ワーキングディレクトリに残ります。そのため、再度コミットするにはgit add
してステージングエリアに戻す必要があります。
【こういうときに使うのかな】
・コミットしたが、修正点に気が付きすぐ直したい。
(こういう場合もコミット履歴は残したほうが良い時もある)
git reset --hard
git reset --hard HEAD~1
--hardを指定した場合も、履歴は残しません。
一方で--soft、--mixedのときとは異なり、取り消した内容がどこにも残りません。git status
と入力してもnothing to commit, working tree clean
と表示されます。またキャプチャのqiita.txtを確認すると3rd commitで入力したHello Git
も削除されています。--hardを指定した場合は、自分がどのような変更内容を打ち消したのか確認できないので、入力には注意が必要です。そのため、安易に実行すべきコマンドではありません。
【こういうときに使うのかな】
・特定のコミットに強制的に戻りたい。
(こういう場合もコミット履歴は残したほうが良い時もある)
・以前に取り消したコミットへ復帰したい。
(記事作成するためサンプルへ戻る際に何回も利用しました。)
git revert の使い方
git revert
は変更を打ち消すと同時に、その操作自体の履歴も残します。
resetとは違い、--soft、--mixed、--hardは使いません。
git revert {コミット番号}
git revert
なので変更を打ち消した履歴を残します。
3rd commitを打ち消すrevertコマンドを入力してみると、コミットとしてRevert "3rd commit"が追加されます。またキャプチャのqiita.txtには3rd commitとして追加したHello Git
が削除されていることがわかります。コミット履歴として残ることでどの変更を打ち消したのかが分かるので、後から見直しやすい利点があります。
まとめ
自分の手で実際に試した結果、チーム開発をする場合は履歴が残るgit revert
のほうが有用というのが分かりました。しかし状況に応じてgit reset
したほうが良いケースもあると思うので、今回git reset
も合わせて学ぶことができてよかったと思っています。Gitはまだ理解が不十分な部分もあるので、今後も必要に応じて調べながら、適切なコマンドを選べるようにしていきたいと思います。
記事が良かった・参考になったと思ったらいいね!を付けてくれると嬉しいです!