ノートPCのキーボード

Gitでワーキングツリー, add, commitを取り消すコマンド集【checkout, reset, revert】

こんにちは、渋木です。
今日はGitの便利コマンド備忘録、その2です。ちなみにその1はこちらです↓

個人的に覚えておくと便利だなーと思ったコマンドをつらつらと並べているだけですが、私のようにGitを勉強中の方は是非ご参照ください。

「git add」でステージングする前であれば、「git checkout .」で変更したファイル内容を最新のコミットの状態に戻せます。

個人的によく使うコマンドなんですが、私は普段Gulpというビルドシステムを使って、sassやjsファイルのコンパイル、ベンダープレフィックスの自動追加、画像ファイルの圧縮といった処理を一括で実行しています。

ここで一つ注意点!
Gulpを起動している最中にローカルの作業ブランチを切り替えてしまうと、Gulpが「あ!今ファイルの内容が変わった!コンパイルを実行して保存しなきゃ!」と判断して、自動的に上記のコンパイルや圧縮作業を行ってしまうんです(実際には作業ブランチそのものが変わっただけなのであって、先ほどまでの編集内容は変更後のブランチには反映してほしくないのに・・・)。

業務中にGitとGulpを同時に使用することが多いので、普段から「作業ブランチ切り替えの前に、Gulpを停止しておく(ブランチ切り替え後に再度Gulpを起動する)」というフローを自分の中で心掛けているんですが、やっぱりヒューマンエラーを完全に防ぐことは不可能ですね。よくやらかしてしまいます。

そんな時は「git checkout .」コマンドを使ってみてください。切り替え後の作業ブランチでの変更内容は破棄され、最後に作業した時の状態に戻っているはずです(ただし新規追加ファイルは削除されたりしません。その場合は別途ブランチ上からファイルの削除を行う必要があります。「git clean [オプション]」で削除可能のようです。よくわからない場合はエディター上でファイルごと削除しちゃえば変更扱いでGitに認識してもらえると思います)。

「git add」でステージングが完了していて、まだコミットする前であれば「git reset HEAD [ファイル名](指定したファイルをステージから取り除く)」もしくは「git reset HEAD(すべてのファイルをステージから取り除く)」で「git add」の処理を取り消すことができます。

ちなみに”HEAD”とは、”ブランチの最新状態に移動する”という意味らしいです。ブランチの一番頭の部分(時系列的に最も新しい部分)という意味のようですね。

安全なのは「git revert」です!「git reset」を使ってcommit内容を削除することは、特に複数人で共同作業中のプロジェクトの場合非推奨です。

ブランチ最新(HEAD)の直前コミットを抹消したい場合(履歴からも消える)は、「git reset –hard HEAD^」でOKです。「HEAD^」が直前コミットを表しています。

ちょっとわかりにくいですが、ここで言う直前コミットとはつまり”最後のコミット”ということで、その最後のコミットの実行によりブランチの最新状態(HEAD)が生まれた、ということですね。

ちなみに「–hard」オプションを付けていると、コミット及びファイルの変更内容もすべて削除されます。ファイル内容だけはそのままで、コミットのみを無かったことにしたい場合は「–soft」オプションに置き換えてください。

コミットを無かったことにはせず、履歴は残しつつも逆向きにコミットをかける、これが「git revert [commit ○○]」です。「[commit ○○]」は「git log」を使うと表示されるので、○○部分の長い英数字の羅列(ハッシュ値)をコピーしてください。最後のコミットを取り消したい場合は、そのコミットの一つ前のコミットのハッシュ値を指定すればOKです。

いかがでしたか?ちょっと説明が小難しくなってしまいましたが、実際に使ってみて慣れていくのが一番だと思います。次回は「git push」の取り消しについても書いていこう思います。ではまた次回!