[小ネタ]git rebaseでコミットをまとめる
gitは大切です。とっても大切です。でも難しいです。
今回は、terminal上でgit rebase
を使用してコミットをまとめようとした際にハマったのでまとめます。
git rebaseでコミットをまとめる手順
以下の手順でコミットをまとめます。
git rebase -i HEAD~n
コマンドの実施 (n個前のコミットから修正対象)- viが立ち上がるので、まとめるコミットを
pick -> fixup
に修正する - viを上書き保存して終了する(
:wq
)
コミットをまとめる
では実際にコミットをまとめてみます。
コミットログを確認
rebase_check.py
という足し算を行うpythonファイルを準備します。
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で困ってる方の助けになれば幸いです。