Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。
前回の 第5話 では、特定のコミットを打ち消すコマンド「リバート」を学びました。
・特定のコミットを打ち消す
今回の第6話では、特定の時点までファイルを巻き戻す「リセット」を学びます。このリセットには3種類方法があります。git reset --soft、--mixed、--hardです。「これらは何が違うのか?どのように使い分ければいいのか?」初心者の方は困ってしまいますよね。このマンガを通して、わかばちゃんと一緒に理解していきましょう!
リセットには3種類ある
--mixed:HEADの位置・ステージ
--hard:HEADの位置・ステージ・作業ディレクトリ
git reset --soft
「直前のコミット内容を修正したい」「コミットし直したい」というときに便利なのがこのコマンドです。
例えば「まだ作業をしようと思っていたのに間違えてコミットしてしまった」「2つのファイルをまとめてコミットするべきだったのに、間違えて1つしかコミットしていなかった」などです。このコマンドを実行すると、まさに「コミットをする直前」の状態に戻ります。
上のコマンドの中にあった「HEAD^」というのは、「1つ前のコミット」という意味だ。では「2つ前のコミット」を表すにはどう打つか分かるかな?
答えは簡単「HEAD^^」だ。
では、8個前のコミットまで巻き戻すときはどうする?もちろん「HEAD^^^^^^^^」と書くこともできるが、指が疲れるし間違えそうだ。そこで「HEAD~8」のように書くこともできる。
え?8個前だと数えるのも面倒だって?もちろんコミットIDで指定することもできるぞ。たとえば次のように打てる。
git reset --mixed
「いくつかgit addでステージしたけど、やっぱやめた」というときに使えるコマンドです。作業ディレクトリのファイルは消えないので安心です。
ちなみに、オプション無しでも--mixedを実行したときと同じ結果が得られます。よって、次のように短く書くこともできます。
git reset --hard
「ステージングエリアにも作業ディレクトリにも残らなくていいから、コミットをまるごと消したい」というときに使えるコマンドです。
もちろんコミットIDを指定することもできます。指定した時点まで「HEAD・ステージングエリア・作業ディレクトリ」のすべてが巻き戻されます。
例として、極端ですが、この練習用リポジトリのmasterブランチのチェックアウトした状態で「はじめてのコミット」に戻ってみるとしましょう。
実行すると、
masterブランチが「はじめてのコミット」に巻き戻りました。newsブランチとdevelopブランチは巻き戻らず、そのままですね。なぜだかわかりますか?
あくまでもHEADは「今自分がいるブランチの先頭」を指すものですから、masterブランチだけが巻き戻り、newsブランチとdevelopブランチはリセットの影響を受けなかったというわけです。
ここからさらに新しいコミットを乗せることもできますが、それをリモートリポジトリにプッシュすると他の人のmasterブランチにも影響が出てしまいます。「リセットは危ない」と言われるのはこのためです。git reset --hardを使う場合は、プッシュ前のコミットに対してのみ、使うようにしましょう。
まとめ
ここまでで3種類のリセットの特徴がわかりました。
Gitにはまだまだたくさんのコマンドがあります。
次回、第7話では、いざというときに便利な git reflog(リフログ)について学んでいきましょう。