Fun Done Run

yazawa's tech blog

複数コミットをgit rebaseでまとめる方法

f:id:yazawa_tech:20190821161637p:plain

はじめに

今回はチーム開発でモダンな現場であればどこでも使われているGitrebase コマンドを使ったケーススタディを紹介する。

こんな時に使いたい

  • pushする前に自分のローカルでコミット履歴を綺麗にしたい
  • コミットする単位を間違えた

使用するコマンド

  • git log --oneline
  • git rebase -i [commit]

実行手順

1.コミットログを確認する

git log --oneline

# e4bcc8a (HEAD -> feature/branch_name) commit-3
# 530f8a2 commit-2
# ed44043 commit-1
# 702080b (develop) xxxxx

2.コミットログのうち、まとめたい履歴のひとつ前のコミットIDを指定して以下のコマンドを実行

git rebase -i

3.まとめる対象のコミットログを選択

vimの編集画面が開く

pick ed44043 commit-1
pick 530f8a2 commit-2
pick e4bcc8a commit-3

# Rebase 702080b..e4bcc8a onto 702080b (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log messag
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to b
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.

まとめたいコミットを選択し、'pick'を's'に変える

pick ed44043 commit-1    # このコミットログにまとめられる
s 530f8a2 commit-2       # ↑のコミットログにまとめられる
s e4bcc8a commit-3       # ↑のコミットログにまとめられる

# この状態で :wq

コミットコメントをまとめる

before
# This is a combination of 3 commits.
# This is the 1st commit message:

commit-1

# This is the commit message #2:

commit-2

# This is the commit message #3:

commit-3

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Tue Feb 26 12:47:39 2019 +0900
#
# interactive rebase in progress; onto 702080b
# Last commands done (3 commands done):
after
# This is a combination of 3 commits.
# This is the 1st commit message:

Three commits

# This is the commit message #2:

# commit-2

# This is the commit message #3:

# commit-3

上記の状態で :wq を実行すると、以下のメッセージが出現

$ git rebase -i 702080b
    :
Successfully rebased and updated refs/heads/feature/branch_name.

5.ログを確認

$ git log --oneline
# 058cabb (HEAD -> feature/branch_name) Three commits
# 702080b (develop) xxxxx

### before
# e4bcc8a (HEAD -> feature/branch_name) commit-3
# 530f8a2 commit-2
# ed44043 commit-1
# 702080b (develop) xxxxx

これで複数コミットを綺麗にまとめることができた。

まとめ

  • Git のコミットログを綺麗に保つための rebase -i コマンドを紹介した
  • ローカルホストではこまめにコミットしていたけど、レビューを出すときなどにコミットが大量にあると、レビュアーが見にくくなる場合がある
  • レビュアーとしてもコミットがまとまっているとやりやすいシーンがあるが、コミットを適切にまとめることでコミットツリーでも履歴が追いやすくなるので、積極的に使っていきたい

参考サイト