はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

Git masterブランチにmergeする前にコミットログを綺麗にする

f:id:secret_hamuhamu:20150405195300p:plain
ローカルのトピックブランチで作業後にmasterブランチにmergeしたい時に、コミットログが汚いとmasterのコミットログも汚してしまいます。
冗長なコミットログは、混乱を招くのでローカルでコミットログを綺麗にしてからmergeします。
コミットログの歴史を改変し綺麗にするのは、git rebaseを使います。

トピックブランチの作業ログの状態

[y-ohhashi@y-ohhashi-mac2] % git log --oneline
d95e87e Aの修正
825daa0 Bの修正
919b3b0 Aの修正

このトピックブランチでは、Aの修正とBの修正する作業スペースでしたが、Bの修正のあとにAの修正が完了していないと気づきもう一度修正を加えてコミットしています。
やりたい事としては、Aの修正のログを1つに統合すること。
このままmasterにmergeしてしまうと重複したAの修正のログがmergeされてしまいます。
なのでAの修正のコミットログはまとめたいです。

git rebaseを使い歴史を改変する

git rebaseを使うことで、歴史を改変することが出来ます。
HEADから3つ分を修正対象とします。

git rebase -i HEAD~3

このようになっているコミットログを変更し歴史を改変します。

pick 919b3b0 Aの修正
pick 825daa0 Bの修正
pick d95e87e Aの修正

3行目のAの修正を2行目に移動し、pickからfixupに変更します。

pick 919b3b0 Aの修正
fixup d95e87e Aの修正
pick 825daa0 Bの修正

# Rebase c6c0437..d95e87e onto c6c0437
#
# 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 message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

pickなどのコマンドの意味は以下のとおり。

コマンド 意味
pick コミットの変更をしない
reword コミットメッセージのみ変更する
edit コミット内容を変更する
squash ひとつ前のコミットと統合し、コミットコメントを変更する
fixup ひとつ前のコミットと統合し、コミットコメントは変更しない

これで歴史の改変が出来ました。
確認してみます。

[y-ohhashi@y-ohhashi-mac2] % git log --oneline
acb37e5 Bの修正
a647b9d Aの修正

狙い通りのコミットログになっています。
あとは、masterにmergeするだけ!

最近読んだ本

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

実用Git

実用Git

実践Vim 思考のスピードで編集しよう!

実践Vim 思考のスピードで編集しよう!