2014年3月18日火曜日

Git 複数のコミットを1つにまとめる

Gitでコミットをまとめる

Gitで複数のコミットを1つにまとめるにはrebaseを使用します。rebaseコマンドの-iオプションを指定することで、複数に渡るコミットを1つのコミットとしてまとめることができます。ちなみにオプションの-iは--interactiveと同意です。

書式
$ git rebase -i[--interactive] HEAD~~
rebase -i 以降にまとめるコミットを指定します。一般的にはHEADを使用し、最新コミットから数えて何番目までのコミットをまとめるか指定します。

使用例
以下のようなコミット履歴があったとします。
$ git log 
commit 65535f1703e3e22142aba7f86c5db95e6904e41c 
Author: nishizaki <nishizaki.com> 
Date: Tue Mar 18 18:31:16 2014 +0900 

コミット3回目 

commit 2ed1bc4e69d0d981788930149852eecdadd35397 
Author: nishizaki <nishizaki.com> 
Date: Tue Mar 18 18:31:03 2014 +0900 

コミット2回目 

commit 0d06bd425f662bef9e13585f5de1dc58cf87fea8 
Author: nishizaki <nishizaki.com> 
Date: Tue Mar 18 18:03:29 2014 +0900 

コミット 

上記の3つのコミットを1つにまとめる場合は以下のコマンドを入力します。
$ git rebase -i HEAD~2

するとテキストエディタが開きます。
pick b3e712e コミット 
pick a3fd259 コミット2回目 
pick 287611c コミット3回目 

# Rebase 524ead8..287611c onto 524ead8 

# 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 

開いたエディタから以下のようにコミット履歴の2行目と3行目のpickをfixupに変更して保存します。
pick b3e712e コミット 
fixup a3fd259 コミット2回目 
fixup 287611c コミット3回目 

# Rebase 524ead8..287611c onto 524ead8 

# 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 


編集後保存終了すると再度エディタが開かれますが、統合したメッセージが表示されるだけなので再度保存して終了します。

すると元の画面に戻り、以下のようなメッセージが表示されれば成功です。
$ git rebase -i HEAD~2
[detached HEAD b000001] Add a neat feature X into the library 
3 files changed, 3 insertions(+), 0 deletions(-) 
Successfully rebased and updated refs/heads/topic-x.

最後に本当に統合されているか確認してみます。
$ git log 
commit 0d06bd425f662bef9e13585f5de1dc58cf87fea8 
Author: nishizaki <nishizaki.com> 
Date: Tue Mar 18 18:03:29 2014 +0900 

コミット 

2つのコミットが消え、統合されていることが分かります。
以上で複数のコミットを1つにまとめることができました。


  • この記事をシェアする

  • このエントリーをはてなブックマークに追加
  • このブログの更新をチェックする

  • follow us in feedly