6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

git revertとgit resetの違いを手を動かして学ぶ

Posted at

はじめに

 不十分な知識のままgitコマンドを入力したことにより、ミスしてしまった経験が最近ありました。日常的に触るコマンドならまだしも、機会が少ないコマンドは特に不十分な知識になりやすいなーと痛感しました。そこで今回は、自分にとってまだ曖昧なgit revertgit 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と記述

ここまでのコミットの内容は以下になります。

image.png

git reset の使い方

 git resetは変更を打ち消すものの、変更を打ち消した履歴を残さないときに使います。
 resetのあとに、--soft、--mixed、--hardのどれを入力するかで結果が大きく変わります。
 HEAD~1としていますが、コミット番号でも同様の再現が可能です。

git reset --soft

書き方(例)
git reset --soft HEAD~1

2.png

 git resetはコミットを取り消しますが、取り消したという履歴は残しません。
 git logで確認してみると、3rd commitが削除されているものの、3rd commitが削除されたという履歴は残っていないことがわかります。また、resetの後に --softと入力すると、取り消したコミットの内容がステージングエリアに残されていることも確認できます。

【こういうときに使うのかな】
・コミットメッセージを間違えてしまい、すぐに修正したい場合

git reset --mixed

書き方(例)
git reset --mixed HEAD~1

3.png

 git resetなので--softのときと同様、履歴は残しません。
 --mixedを指定した場合、--softとは異なり取り消した内容がステージングエリアに残らず、ワーキングディレクトリに残ります。そのため、再度コミットするにはgit addしてステージングエリアに戻す必要があります。

【こういうときに使うのかな】
・コミットしたが、修正点に気が付きすぐ直したい。
(こういう場合もコミット履歴は残したほうが良い時もある)

git reset --hard

書き方(例)
git reset --hard HEAD~1

4.png

 --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 {コミット番号}

10.png

 git revertなので変更を打ち消した履歴を残します。
 3rd commitを打ち消すrevertコマンドを入力してみると、コミットとしてRevert "3rd commit"が追加されます。またキャプチャのqiita.txtには3rd commitとして追加したHello Gitが削除されていることがわかります。コミット履歴として残ることでどの変更を打ち消したのかが分かるので、後から見直しやすい利点があります。

まとめ

 自分の手で実際に試した結果、チーム開発をする場合は履歴が残るgit revertのほうが有用というのが分かりました。しかし状況に応じてgit resetしたほうが良いケースもあると思うので、今回git resetも合わせて学ぶことができてよかったと思っています。Gitはまだ理解が不十分な部分もあるので、今後も必要に応じて調べながら、適切なコマンドを選べるようにしていきたいと思います。

 記事が良かった・参考になったと思ったらいいね!を付けてくれると嬉しいです! 

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?