gitを使っていると、 コミット(commit)をまとめたいということがよくあります。
「あ、間違ってコミットしちゃったけど、この内容さっきのコミットとまとめておかないとなー」みたいなときですね。
そんなふうにコミットをまとめたいときに必見!コミットをまとめるための方法と、間違ってまとめてしまったコミットを元に戻したいときの方法を今回はブログにしたいと思います!
git rebaseを使ってコミットをまとめる
まずは、git rebaseを使ってコミットをまとめる方法です。
最新のコミット履歴が以下のようになっているとします。(1番上が最新)
commit ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●1
commit ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 2
commit ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 3
commit ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 4
1と2は本来同じ目的のコミットのはずがうっかり別コミットにしてしまった場合のことを想定して、この2つのコミットをまとめる方法を見ていきましょう!
2コミット分まとめたいので、以下のようなコマンドを実行します。
$ git rebase -i HEAD~~
// あるいは、以下のようにしてもOK
$ git rebase -i HEAD~2
するとテキストエディタ(vim)が開かれ、最新の2コミットの情報が表示されます。
pick 411ff5f9 [modify]● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●2
pick aa237d46 [modify]● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●1
今回は● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 2に集約してまとめることにしましょう。
以下のように修正してください。
pick 411ff5f9 [modify]● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●2
s aa237d46 [modify]● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●1
pickと書かれた部分をs(あるいはsquash)に変更すると、そのコミットが、その直前のpickに対応したコミットにまとめられるという意味になります。
変更したら、escキー→:wq!と入力→エンターキーを押すと、コミットメッセージをまとめるための表示に切り替わります。
# This is a combination of 2 commits.
# This is the 1st commit message:
[modify]● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●2
# This is the commit message #2:
[modify]● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●1
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
このままだと2つのコミットメッセージが両方残ったままになるので、変更しましょう。
# This is a combination of 2 commits.
# This is the 1st commit message:
[modify]● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●2
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
コミットメッセージをまとめることができたら、escキー→:wq!と入力→エンターキーを押して、内容の保存をしましょう!
git logで確認して、以下のようにコミット履歴がまとまっていればOKです!
commit ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 2
commit ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 3
commit ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 4
git reflogを使って間違ってrebaseしたものを元に戻す
先ほどgit rebaseを使ってコミットをまとめることができましたが、間違ってrebaseしちゃった場合に元の状態に戻したいときの方保についても見ておきましょう!
git reflogというコマンドを使います。
git reflowは、rebaseやresetも含めてgitの操作履歴を確認するコマンドです。
早速実行してみましょう!
git reflog
すると、以下のような感じの表示になります。
c571316f (HEAD -> feature/test HEAD@{0}: rebase (finish): returning to refs/feature/test
c571316f (HEAD -> feature/test) HEAD@{1}: rebase (squash): ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 2
4ba5739f HEAD@{2}: rebase (start): checkout HEAD~~
56760823 HEAD@{3}: commit: ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 1
[数字]と書かれた部分を見るとわかるように、変更履歴がずらっと並んでいます。
今回の場合、先ほどrebase操作をしましたが、rebaseをする前の状態はHEAD@{3}になりますので、以下のようなコマンドを実行してみましょう!
git reset --hard HEAD@{3}
これで、rebase前の状態に戻すことができるようになります!
まとめ
ということで、今回はgitのコミットをまとめるためのrebaseの基本と、間違ってrebaseしたものをgit reflogを使って元に戻す方法についてブログにしてみました!