環境
Ubuntu20.4
はじめに
コミットの取り消しの実演を行います。個人で開発している分には、コミットを取り消したい場面に遭遇することは滅多にありません。「しまった、やってしまった。急いで取り消さなくては!」という事態に遭遇したとき、恐らく、気持ちの面では、相当程度焦っていると思われるため、こういった作業は、サクッと行えるようにしておいた方がいいだろうと思います。
やったこと
gitのログを確認すると、現在このようになっています。
$git log --oneline
e6f6bc1 (HEAD) aaaccc
0619520 aa
8786091 ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
直前のコミットを1つ取り消します。
$git reset --hard HEAD^
確かに、直前のコミット(aaaccc)が取り消されて、次の履歴であるaaがHEADに繰り上がりました。
$git log --oneline
0619520 (HEAD) aa
8786091 ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
もう一度、同じコマンドを実行すると、次は、現在HEADになっているaaが取り消されて、その次の履歴であるadがHEADに繰り上がりました。
$ git reset --hard HEAD^
$ git log --oneline
8786091 (HEAD) ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
オプションでHEAD^を指定すると、直前のコミット1つが取り消されますが、HEAD^の代わりに、IDを指定して取り消すこともできます。
現在、HEADになっているIDを指定して取り消しを行いました。当然、何も起こりません。
$git reset --hard 8786091
$ git log --oneline
8786091 (HEAD) ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
HEADの次の履歴のIDを指定して取り消しを行います。すると、現在HEADになっているadが取り消されて、次の履歴であるaaaがHEADに繰り上がりました。
$git reset --hard 1ff8c28
$ git log --oneline
1ff8c28 (HEAD) aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
IDを指定すると、複数のコミットをまとめてごそっと取り消すこともできます。次の例では、2つのコミットを一気に取り消しています。
$git reset --hard b3aa690
$ git log --oneline
b3aa690 (HEAD) add file
8b66d30 ggg
3a68b15 ddd