[小ネタ]git rebaseでコミットをまとめる

2020.08.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

gitは大切です。とっても大切です。でも難しいです。

今回は、terminal上でgit rebaseを使用してコミットをまとめようとした際にハマったのでまとめます。

git rebaseでコミットをまとめる手順

以下の手順でコミットをまとめます。

  1. git rebase -i HEAD~nコマンドの実施 (n個前のコミットから修正対象)
  2. viが立ち上がるので、まとめるコミットをpick -> fixupに修正する
  3. viを上書き保存して終了する(:wq)

コミットをまとめる

では実際にコミットをまとめてみます。

コミットログを確認

rebase_check.pyという足し算を行うpythonファイルを準備します。

rebase_check.py

a = 2
b = 3

result = a + b

print(result)

git logコマンドを使用しrebase_check.pyのローカルのコミット履歴を確認します。

$ git log --oneline -n 5
e675492 (HEAD -> feature/test1, origin/feature/test1, master, backup) print文を追加
3bf314b 計算式を追加
1235352 bを定義
53e2ebe aを定義
2680a78 rebase_checkファイルを作成

1行ずつコミットしているのがわかります。GitHub上のリモートのログも確認してみます。

リモートも1行ずつコミットした内容になっています。このコミット履歴を1行にしていきます。

git rebaseを使用する

コミットをまとめるため、まずはgit rebase -i HEAD~5を実行します。

$ git rebase -i HEAD~5
pick 2680a78 rebase_checkファイルを作成
pick 53e2ebe aを定義
pick 1235352 bを定義
pick 3bf314b 計算式を追加
pick e675492 print文を追加

# Rebase 22c3f59..e675492 onto 22c3f59 (5 commands)
#
・・・

viモードが起動し、5つ前のコミット履歴から確認できます。

pickをfixupに修正する

1つ目のコミットpick 2680a78 rebase_checkファイルを作成にまとめます。そのため、2~5つ目のコミットのpickをfixupに修正します。

pick 2680a78 rebase_checkファイルを作成
fixup 53e2ebe aを定義 # fixupに修正
fixup 1235352 bを定義 # fixupに修正
fixup 3bf314b 計算式を追加 # fixupに修正
fixup e675492 print文を追加 # fixupに修正

上書き保存をしてviを抜ける

修正が完了したら、:wqをします(上書き保存をしてviを抜ける)。そうするとこのように、Successfullyとでます。

Successfully rebased and updated refs/heads/feature/test1.

ログの確認

再度ログを確認すると、コミットが1つにまとまったことを確認できます!また先ほどとはコミット番号も変わっているのがわかります。

$ git log --oneline -n 5
8a8bc61 (HEAD -> feature/test1) rebase_checkファイルを作成
22c3f59 first commit

リモートのログを更新

ではこちらをpushしリモート履歴を整えます。

$ git push 
To https://github.com/***/test_rebase.git
 ! [rejected]        feature/test1 -> feature/test1 (non-fast-forward)
error: failed to push some refs to 'https://github.com/***/test_rebase.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

エラーになりました。原因としてリモートとローカルのcommitの番号が異なるためです。ローカルの履歴に強制的に合わせるため-fオプションを使用してpushします。

$ git push -f
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 369 bytes | 369.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/***/test_rebase.git
 + e675492...8a8bc61 feature/test1 -> feature/test1 (forced update)

push出来ました。リモートを確認します。

コミットがまとまっていることがわかります。

まとめ

コードを小さく作りすぎてコミットをまとめようとした際にrebaseの操作にハマったのでまとめました。コミットをまとめることは出来るようになったのですがチーム開発をしている際にリモートログを修正する場合は事前に確認しないと事故の元だなと実感しました。。

沖縄の下地がお届けしました。同じようにgitで困ってる方の助けになれば幸いです。

参考リンク