git squash – 複数のコミットログを1つにまとめる


正確には、git squashというコマンドはありません。interactive rebaseをするのに必要なコマンドの1つです。
時折、以下のように1つの作業を何回もコミットすることがあります。

$ git log --pretty=oneline
d442427eae836f15e94f5df0445c70081df79a3e Task 3/3
26395437be53e4e6e68f83aa98560ef93838aaa0 Task 2/3
7c6535580a038e9dcfaa72a98e04848812da9aee Task 1/3
2260a88777c247c31170ff6074d95569ac557afb Initial commit
$

Task 1/3〜3/3を1つのcommitにまとめてしまいたいですね。
このような時に使用するのが、interactive rebaseです。

$ git rebase -i HEAD~3

(直近の3つのコミットをinteractive rebaseするという意味です)

環境によって異なりますが、通常はviエディタを開いて、次のようなメッセージを表示します。

pick 7c65355 Task 1/3
pick 2639543 Task 2/3
pick d442427 Task 3/3

# Rebase 2260a88..d442427 onto 2260a88
#
# 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

上の3行を次のように変更した後、保存(:wq)を押すと、

pick 7c65355 Task 1/3
squash 2639543 Task 2/3
squash d442427 Task 3/3

他のviウィンドウが表示され、コミットメッセージをリライトできます。

pick 7c65355 Task 1/3
Rebasing (3/3)
# This is a combination of 3 commits.
# The first commit's message is:
Task 1/3

# This is the 2nd commit message:

Task 2/3

# This is the 3rd commit message:

Task 3/3

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# rebase in progress; onto 2260a88
# You are currently editing a commit while rebasing branch 'master' on '2260a88'.
#
# Changes to be committed:
#       modified:   README.md
#
~

そして再び確認すると、このようになります。

$ git log --pretty=oneline
9833ca676c5a24361c1cc36fb173746328dfac3a Task 1/3 ~ 3/3
2260a88777c247c31170ff6074d95569ac557afb Initial commit

参考:

  • 可能であれば、すでにpushしていないジョブだけをsquashすることをお勧めします。pushとpull作業が少し複雑になります。
    — git push -f / git fetch && git merge –squash

TOAST Meetup 編集部

TOASTの技術ナレッジやお得なイベント情報を発信していきます
pagetop