コミット修正時に使う操作まとめ

かなり久しぶりの投稿となりました、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コマンドには次のオプションがあり、巻き戻す内容が異なります。

次のファイルを例に、それぞれのオプションの実行結果をみていきます。

Image from Gyazo

  • --soft

HEADだけを動かし、コミットだけが消えます。ファイルはステージ上に残ります。

Image from Gyazo

git reset --soft HEAD^ でコミット取り消し → ファイルを修正 → コミットする」という流れをよくやります。

  • --mixed

HEADとステージを巻き戻します。ファイルの変更差分はそのまま残ります。

Image from Gyazo

  • --hard

HEAD、ステージ、ファイルの変更差分全てを元に戻します。

Image from Gyazo

コミットの順番を変更する

% git rebase -i commit_hash

次のコミット履歴を例に、順番を並び替えてみたいと思います。

Image from Gyazo

「add name」と「add age」のコミットを入れ替えてみましょう。

この場合、git rebase -iで指定するコミットハッシュは、「add name」のひとつ前のコミットを指定することに注意して下さい。

% git rebase -i 3fd37fd

すると、次のようなコミット編集画面が表示されます。

Image from Gyazo

この画面で、「add name」と「add age」のコミットの順番を入れ替えて、保存します。

Image from Gyazo

もしコミットを入れ替えてコンフリクトが発生した場合は、次のことを実行します。

  1. コンフリクトが発生した箇所を修正する
  2. git add git commitでコミットする
  3. git rebase --continueでリベースを続ける

Successfully rebased and updated refs/heads/main.と表示されれば完了です。

コミットの順番を確認してみると、入れ替わっていることが分かります。

Image from Gyazo

コミットをまとめる

% git rebase -i commit_hash

コミットをまとめるには、コミット入れ替えと同じくgit rebase -iを使います。

先ほどの例で、今度は「add age」と「add name」のコミットを1つにまとめてみましょう。

次のコマンドを実行して、コミット編集画面を開きます。

% git rebase -i 3fd37fd

コミット編集画面で、「add name」のコミットのpicksに変更します。

s(quash)を指定すると、指定したコミットとそのひとつ前のコミットを結合することができます。

Image from Gyazo

編集画面を保存すると、結合したコミットのコミットメッセージを編集する画面が開きます。

適当なコミットメッセージを作成して保存すれば、コミットの結合は完了です。

ログと変更差分を確認してみると、うまくいっていることが分かります。

Image from Gyazo

コミットの内容を分割する

% 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」コミットのpickeに変更します。

Image from Gyazo

e(dit)を指定すると、指定したコミットで rebase が一時停止します。

Image from Gyazo

「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を選択します。

Image from Gyazo

どの変更差分をステージングするか、編集画面が起動します。

Image from Gyazo

編集画面では、次のことを行います。

  • 追加差分をステージングしたくない場合は、行を削除する
  • 削除差分をステージングしたくない場合は、-を削除する

名前の追加だけをステージングしたいので、次のように編集して保存します。

Image from Gyazo

これで、指定した箇所だけをステージングすることが出来ました。

git diff --cachedで確認すると、先ほど指定した箇所がステージングされていることが分かります。 この内容で、git commitを行います。

Image from Gyazo

残りの変更差分もコミットすれば、コミットの分割は完了です。

最後に、まだ rebase の途中なのでgit rebase --continueして rebase を完了させます。

コミットログと変更差分を確認すると、うまくいっていることが分かります。

Image from Gyazo

Image from Gyazo

おわりに

FBCで勉強を始めた頃は git に対する苦手意識があったのですが、課題の提出時に何度もコミットの修正を行うことで、コミットに対する操作に慣れることができました。

これからの目標として、普段からきれいなコミットを積み上げることを大切にしつつ、問題が起きた時はすぐ修正できるようになっていきたいです。

参考

第6話 git reset 3種類をどこよりもわかりやすい図解で解説!【連載】マンガでわかるGit ~コマンド編~ - itstaffing エンジニアスタイル

コミットを整理してみよう|おだいり|note

[レポート] 『きれいなcommit, pull requestを知りたい/作りたい方のためのgit勉強会』に参加してきました | DevelopersIO