Git

git rebaseでコミットを並べ替える

コミットの順番をあとから並べ替える実験。「ファイルA,B,Cを追加したが、A,C,Bの順でコミットしてしまった。 A,B,Cの順にしてコミットとファイルの整合性をとりたい」というシナリオ。

mkdir X
cd X
git init
touch A
git add A
git commit -m "A"
touch C
git add C
git commit -m "C"
touch B
git add B
git commit -m "B"

logを確認する。

$ git log -l HEAD~2
commit 8fde7ad6837d3fd69eff0284cdf57d95ae58ba16
Author: Nunocky <nunocky@example.com>
Date:   Wed Apr 11 13:38:56 2018 +0900

    B

commit 73b9b66d4adf3e56ea2a45a5b4be0086cfd4be88
Author: Nunocky <nunocky@example.com>
Date:   Wed Apr 11 13:38:48 2018 +0900

    C

commit a89a9a0d4ba0c70d500a6da48eb872d04284a40b
Author: Nunocky <nunocky@example.com>
Date:   Wed Apr 11 13:38:39 2018 +0900

    A

この履歴を A,B,Cの順に並べ替えたい。そのために git rebaseを用いる。

git rebase -i HEAD~2

pick 73b9b66 C
pick 8fde7ad B

# Rebase a89a9a0..8fde7ad onto a89a9a0
#
# 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の行を書き換える。B,Cを入れ替えてエディタを終了する。

pick 8fde7ad B
pick 73b9b66 C

もう一度ログを確認

$ git log -l HEAD~2
commit 9c0c8762922977b0ea5996b27b3845433e9cdd3e
Author: Nunocky <nunocky@example.com>
Date:   Wed Apr 11 13:38:48 2018 +0900

    C

commit 2f583be0b740fc5e02a8e54a3489bbe0fca9ad99
Author: Nunocky <nunocky@example.com>
Date:   Wed Apr 11 13:38:56 2018 +0900

    B

commit a89a9a0d4ba0c70d500a6da48eb872d04284a40b
Author: Nunocky <nunocky@example.com>
Date:   Wed Apr 11 13:38:39 2018 +0900

    A

good