コミット修正時に使う操作まとめ
かなり久しぶりの投稿となりました、cassy0220です。
前回の投稿から今までの間に、FBCで様々なプラクティスに取り組み、課題を提出してきました。
課題を提出する際、コミットを整理してから提出するようにしているのですが、コミットの修正を行う時に「この操作はこれで大丈夫かな?」と何度も調べてしまいます。
そこで、備忘録も兼ねて私がコミットを修正する際によく使う操作をまとめることにしました。
確認する操作
ファイルの変更差分を確認する
% git diff
コミットする前に変更差分を確認して、セルフレビューする癖をつけましょう(戒め)。
もし、ステージングに上げた変更差分を確認したい場合は、git diff --cached
で確認することが出来ます。
コミット履歴を確認する
% git log --oneline
git log --oneline
で、コミット履歴を分かりやすく表示することが出来ます。
コミットのハッシュ値を確認したい時や、rebase 中にコミット履歴を確認したい時などによく使います。
特定のコミットの内容を確認する
% git show commit_hash
最後にファイル名を指定すると、指定したコミット内で指定したファイルのコミット内容が表示されます。
% git show commit_hash filename
コミットの指定はHEADで行うことも可能です。
% git show HEAD^
コミットを修正する操作
コミットを取り消す
% git reset
git reset
コマンドを使うと、現在のHEADを指定された状態にリセットします。
※ HEADとは、一般的にそのブランチで最後のコミットを指します。
git reset
コマンドには次のオプションがあり、巻き戻す内容が異なります。
次のファイルを例に、それぞれのオプションの実行結果をみていきます。
--soft
HEADだけを動かし、コミットだけが消えます。ファイルはステージ上に残ります。
「git reset --soft HEAD^
でコミット取り消し → ファイルを修正 → コミットする」という流れをよくやります。
--mixed
HEADとステージを巻き戻します。ファイルの変更差分はそのまま残ります。
--hard
HEAD、ステージ、ファイルの変更差分全てを元に戻します。
コミットの順番を変更する
% git rebase -i commit_hash
次のコミット履歴を例に、順番を並び替えてみたいと思います。
「add name」と「add age」のコミットを入れ替えてみましょう。
この場合、git rebase -i
で指定するコミットハッシュは、「add name」のひとつ前のコミットを指定することに注意して下さい。
% git rebase -i 3fd37fd
すると、次のようなコミット編集画面が表示されます。
この画面で、「add name」と「add age」のコミットの順番を入れ替えて、保存します。
もしコミットを入れ替えてコンフリクトが発生した場合は、次のことを実行します。
- コンフリクトが発生した箇所を修正する
git add
git commit
でコミットするgit rebase --continue
でリベースを続ける
Successfully rebased and updated refs/heads/main.
と表示されれば完了です。
コミットの順番を確認してみると、入れ替わっていることが分かります。
コミットをまとめる
% git rebase -i commit_hash
コミットをまとめるには、コミット入れ替えと同じくgit rebase -i
を使います。
先ほどの例で、今度は「add age」と「add name」のコミットを1つにまとめてみましょう。
次のコマンドを実行して、コミット編集画面を開きます。
% git rebase -i 3fd37fd
コミット編集画面で、「add name」のコミットのpick
をs
に変更します。
s(quash)
を指定すると、指定したコミットとそのひとつ前のコミットを結合することができます。
編集画面を保存すると、結合したコミットのコミットメッセージを編集する画面が開きます。
適当なコミットメッセージを作成して保存すれば、コミットの結合は完了です。
ログと変更差分を確認してみると、うまくいっていることが分かります。
コミットの内容を分割する
% git rebase -i commit_hash
% git add -p
コミットの内容を分割する場合も、おなじみのgit rebase -i
を利用します。
また、git add -p
を使うと、変更差分の一部を指定してステージングすることが出来ます。
「コミットをまとめる」で「add age」と「add name」を1つのコミットにまとめましたが、今回はまとめたコミットをもとの別々のコミットに戻してみましょう。
次のコマンドを実行して、コミット編集画面を開きます。
% g rebase -i 3fd37fd
コミット編集画面で、「add age and name」コミットのpick
をe
に変更します。
e(dit)
を指定すると、指定したコミットで rebase が一時停止します。
「add age and name」コミットを修正したいので、まずコミットを巻き戻し、ステージング前の状態に戻します。
% git reset --mixed HEAD^
次に、変更差分を指定してステージングを行いたいので、git add -p
を実行します。
% git add -p sample.rb
すると、Stage this hunk [y,n,q,a,d,e,?]?
(hunk(変更差分の塊のこと)をステージングする?)と聞かれるので、e
を選択します。
どの変更差分をステージングするか、編集画面が起動します。
編集画面では、次のことを行います。
- 追加差分をステージングしたくない場合は、行を削除する
- 削除差分をステージングしたくない場合は、
-
を削除する
名前の追加だけをステージングしたいので、次のように編集して保存します。
これで、指定した箇所だけをステージングすることが出来ました。
git diff --cached
で確認すると、先ほど指定した箇所がステージングされていることが分かります。
この内容で、git commit
を行います。
残りの変更差分もコミットすれば、コミットの分割は完了です。
最後に、まだ rebase の途中なのでgit rebase --continue
して rebase を完了させます。
コミットログと変更差分を確認すると、うまくいっていることが分かります。
おわりに
FBCで勉強を始めた頃は git に対する苦手意識があったのですが、課題の提出時に何度もコミットの修正を行うことで、コミットに対する操作に慣れることができました。
これからの目標として、普段からきれいなコミットを積み上げることを大切にしつつ、問題が起きた時はすぐ修正できるようになっていきたいです。
参考
第6話 git reset 3種類をどこよりもわかりやすい図解で解説!【連載】マンガでわかるGit ~コマンド編~ - itstaffing エンジニアスタイル
[レポート] 『きれいなcommit, pull requestを知りたい/作りたい方のためのgit勉強会』に参加してきました | DevelopersIO