このブログをご覧のみなさん、こんにちは。
Pull Request を送った後の指摘に対応していたところ「 squash してコミットを 1 個にまとめて」と言われたので、手順を調べたのでメモとして残しておきます。
squash には 2 種類ある
squash
はすべてのコミットを 1 つにまとめるもので以下の 2 種類があります。
git merge --squash [branch or commit]
git rebase -i [commit]
git merge –squash [branch or commit]
前者は git merge
コマンドで実行している通り、[branch or commit]
で指定した内容を 1 つにまとめて merge
します。今回 Pull Request を送った自分に対して「 squash して」と言っているので、これとは別になります。
git rebase -i [commit]
後者は git rebase
コマンドで実行している通り、[branch or commit]
で指定した内容を 1 つにまとめて rebase
します。今回 Pull Request を送った自分に対して「 squash して」と言っているので、こちらが必要な対応になります。
実行例
事前準備(何度かコミットしているファイルの準備)
$ echo add file >> test_file
$ git add test_file
$ git commit -m "Add test_file"
[master (root-commit) xxxxxxx] Add test_file
1 file changed, 1 insertion(+)
create mode 100644 test_file
$ echo edit one >> test_file
$ git add test_file
$ git commit -m "Modify 1"
[master yyyyyyy] Modify 1
1 file changed, 1 insertion(+)
$ echo edit two >> test_file
$ git add test_file
$ git commit -m "Modify 2"
[master zzzzzzz] Modify 2
1 file changed, 1 insertion(+)
$ echo edit two >> test_file
$ git add test_file
$ git commit -m "Modify 3"
[master 1111111] Modify 3
1 file changed, 1 insertion(+)
$ cat test_file
add file
edit one
edit two
edit three
これらのコミットを 1 つにまとめるために squash
します。
$ git rebase -i HEAD~3
pick yyyyyyy Modify 1
squash zzzzzzz Modify 2 <--これを squash するので pick から変更する
squash 1111111 Modify 3 <--これを squash するので pick から変更する
# Rebase xxxxxxx..xxxxxxx onto xxxxxxx
#
# 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
から squash
に変更後保存すると以下のコミットメッセージを編集する画面に切り替わります。
# This is a combination of 3 commits.
# The first commit's message is:
Modify 1
# This is the 2nd commit message:
Modify 2
# This is the 3rd commit message:
Modify 3
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: xxxxxxxx
#
# rebase in progress; onto xxxxxxxx
# You are currently editing a commit while rebasing branch 'master' on 'xxxxxxxx'.
#
# Changes to be committed:
# modified: test_file
保存すると以下のようにコミットを 1 つにまとめることができます。 add にまとめることはできません。
$ git log
commit yyyyyyy
Author: xyz <xyz@>
Date: yyyyyyy
Modify 1
Modify 2
Modify 3
commit xxxxxxx
Author: xyz <xyz@>
Date: xxxxxxx
Add test_file