【Git】git reset --soft、--mixed、--hardの違い

前回、git resetを使って目的のcommitまで戻すという作業を行いました。

この際にgit resetにある3つのオプション「--soft」、「--mixed」、「--hard」について調べたのでまとめます。

まずは前提知識の確認 ~リモートリポジトリ変更までの流れ~

変更をリモートリポジトリへ反映させるまでの流れを簡単に確認します。

①working tree:作業中のスペース(今現在コードを編集している場所)
②index:コミットするためのファイルを登録しておくためのスペース
③local repository:ファイルの変更履歴を記録(自分のみ)
 →HEAD:最新のコミットの状態
④remote repository:ファイルの変更履歴を記録(みんなで共有)


上記の状態を変更するためのコマンドが以下になります。

 ①
 ↓
「git add」
 ↓
 ②
 ↓
「git commit」(ここでHEADが移動)
 ↓
 ③
 ↓
「git push」
 ↓
 ④


git add:working tree→ index
git commit:index → local repository(git commitコマンドでHEADが移動する)
git push:local repository → remote repository


git addは良く分からないまま使用していましたがこのように整理してみることで理解できました。

SourceTreeでいうところの「インデックスに追加する」という役割だったのですね。

f:id:hnm-n-1029:20200811151125p:plain

では本題。そもそもgit resetの動きとは?

git reset:HEADの位置を変更する

git resetは、前述した「HEAD」の位置を変更するコマンドです。
言い換えると、現在時点よりも古い特定のコミットまで戻ることができるコマンドです。

ただ、HEADを戻した場合、working treeやindexに残っている変更内容はどうように扱われるのでしょうか?

この扱いを指定するのが、オプションになります。

git resetのオプションは何が違う?どう動く?

git resetにはいくつかオプションがありますが、以下の3つで事足りるようです。
それぞれ次のような働きをします。

●--hard:HEAD、index、working tree全てが元に戻る      
●--mixed:HEAD、indexが元に戻る
●--soft:HEADのみが元に戻る

どういう時に使い分けるの?

①--hard:ファイルの変更自体をなかったことにしたい場合
working treeの変更内容も破棄されてしまうので注意しましょう。
例えば、猫ちゃんがPC上を横切りファイルを変更、add、commitまでしてしまった時に有効です。
猫ちゃんの編集内容は全て残念ながら必要ないので。

②--mixed:不要なファイルをindexしてしまい、それを除外したい場合
※オプションを付けない場合のデフォルト。
working treeはそのままなので、作業はそのまま続行でき再度必要なファイルだけindexすることができます。

③--soft:再度コミットする際の変更点が少なそうな場合
ファイル中のコメントを消すのを忘れていた!というような
小さい変更を以前のコミットに含めてしまいたい場合に有効です。

戻りたいcommitの指定方法

git reset --hard ○○

オプションの後ろ(○○の部分)に戻りたいcommitを指定することができます。

・HEAD:現在のHEAD
・HEAD^:直前のcommit(@^、HEAD~も同義)
ハッシュ値:各commitが持つ固有の値(git logで確認)


git resetについてはこちらの記事がとても分かりやすくお勧めです
git reset についてもまとめてみる - murankの日記

今回は以上になります!


↓↓私の師匠、もりけんさんの武骨日記。問題集、要チェック

kenjimorita.jp