参考にさせて頂いたページ
はじめに
commitをまとめる方法について書いています。
vimの操作方法についてはこのページでは細かくは触れません。
gitのコミットidはご自身の環境として読み替えてください。
準備
以前の記事「gitその0001-01 git rebase入門 indexと準備 - Motomichi Works Blog」のとおりrebase_tutorialリポジトリを準備して、masterブランチとhogeブランチを作成しましたので、それを使います。
hogeブランチで作業してみます。
git checkout hoge
4行目、5行目、6行目のコミットをまとめる
例として、HEADから3回分のコミットをまとめるので以下のようにコマンドを実行します。
git rebase -i HEAD~3
以下のような感じで、対象となるコミット一覧と、操作の説明が表示されます。
このとき表示されるコミット一覧は一番下が一番新しいコミットです。
pick 356d95e 4行目を追加 pick e3e9b30 5行目を追加 pick fabb554 6行目を追加 # Rebase 97029ec..fabb554 onto 97029ec (3 command(s)) # # 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 # d, drop = remove commit # # 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
操作の説明が表示されていますが、今回使用するのはsquashです。
コミット一覧のpickと書いてあるところをINSERTモードで、sにして以下のようにします。
sにしたものは、ひとつ古いコミットとまとめられます。
pickになっているものは、変更を加えず使用されます。
pick 356d95e 4行目を追加 s e3e9b30 5行目を追加 s fabb554 6行目を追加
コマンドモードに戻して:wqです。
しばらく待つと自動的に以下のような表示になりますので、コミットメッセージを編集します。
# This is a combination of 3 commits. # The first commit's message is: 4行目を追加 # This is the 2nd commit message: 5行目を追加 # This is the 3rd commit message: 6行目を追加 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Fri Aug 4 19:14:05 2017 +0900 # # interactive rebase in progress; onto 97029ec # Last commands done (3 commands done): # s e3e9b30 5行目を追加 # s fabb554 6行目を追加 # No commands remaining. # You are currently editing a commit while rebasing branch 'hoge' on '97029ec'. # # Changes to be committed: # modified: sample.txt #
INSERTモードにして、例えば以下のような感じで、コミットメッセージを変更します。
# This is a combination of 3 commits. # The first commit's message is: 4行目、5行目、6行目を追加 # This is the 2nd commit message: # This is the 3rd commit message: # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Fri Aug 4 19:14:05 2017 +0900 # # interactive rebase in progress; onto 97029ec # Last commands done (3 commands done): # s e3e9b30 5行目を追加 # s fabb554 6行目を追加 # No commands remaining. # You are currently editing a commit while rebasing branch 'hoge' on '97029ec'. # # Changes to be committed: # modified: sample.txt #
コマンドモードに戻って:wqです。
しばらく待って、以下のように表示されれば成功です。
[detached HEAD 2865e19] 4行目、5行目、6行目を追加 Date: Fri Aug 4 19:14:05 2017 +0900 1 file changed, 3 insertions(+) Successfully rebased and updated refs/heads/hoge.
logとdiffを確認してみる
以下のコマンドを実行して、ログを確認してみます。
git log --oneline
以下のような感じで表示されたと思います。
2865e19 4行目、5行目、6行目を追加 97029ec 3行目を追加 407e6f9 2行目を追加 30596dc 1行目を追加 d5d7400 Initial commit
以下のコマンドを実行して、HEADのひとつ前とHEADのdiffを確認してみます。
git diff HEAD^ HEAD
コミットがまとめられて、4行目、5行目、6行目が追加されたのがわかります。
まとめる前の状態に戻す
次の練習のためにrebaseする前の状態に戻してみます。
以下のコマンドで自分が操作した履歴を見ます。
git reflog
おおよそ以下のような感じで表示されたと思います。
2865e19 HEAD@{0}: rebase -i (finish): returning to refs/heads/hoge 2865e19 HEAD@{1}: rebase -i (squash): 4行目、5行目、6行目を追加 f090b18 HEAD@{2}: rebase -i (squash): # This is a combination of 2 commits. 356d95e HEAD@{3}: rebase -i (start): checkout HEAD~3 fabb554 HEAD@{4}: commit: 6行目を追加
“6行目を追加"のコミットをした直後の状態に戻すので、以下のコマンドを実行します。
git reset --hard HEAD@{4}
以下のように表示されて、コミットをまとめる前の状態に戻ったと思います。
HEAD is now at fabb554 6行目を追加
一応以下のコマンドでログを確認してみます。
git log --oneline
まとめる前の状態にもどりましたので以下のように表示されました。
fabb554 6行目を追加 e3e9b30 5行目を追加 356d95e 4行目を追加 97029ec 3行目を追加 407e6f9 2行目を追加 30596dc 1行目を追加 d5d7400 Initial commit
いくつか前のコミットだけをまとめる
最新の6行目を追加のコミットはそのままにして、4行目を追加と5行目を追加のコミットだけをまとめる方法をやってみます。
例として、今回もHEADから3回分のコミットが対象になるので以下のようにコマンドを実行します。
git rebase -i HEAD~3
さきほどと同じように以下のように表示されます。
pick 356d95e 4行目を追加 pick e3e9b30 5行目を追加 pick fabb554 6行目を追加
“4行目を追加"と"5行目を追加"をまとめたいので、以下のようにpickをsに変更します。
sにしたものは、ひとつ古いコミットとまとめられます。
pick 356d95e 4行目を追加 s e3e9b30 5行目を追加 pick fabb554 6行目を追加
編集が済んだら、コマンドモードに戻って:wqです。
しばらく待つと自動的に以下のような表示になりますので、コミットメッセージを編集します。
# This is a combination of 2 commits. # The first commit's message is: 4行目を追加 # This is the 2nd commit message: 5行目を追加 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Fri Aug 4 19:14:05 2017 +0900 # # interactive rebase in progress; onto 97029ec # Last commands done (2 commands done): # pick 356d95e 4行目を追加 # s e3e9b30 5行目を追加 # Next command to do (1 remaining command): # pick fabb554 6行目を追加 # You are currently editing a commit while rebasing branch 'hoge' on '97029ec'. # # Changes to be committed: # modified: sample.txt #
INSERTモードにして、例えば以下のような感じで、コミットメッセージを変更します。
# This is a combination of 2 commits. # The first commit's message is: 4行目、5行目を追加 # This is the 2nd commit message: # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Fri Aug 4 19:14:05 2017 +0900 # # interactive rebase in progress; onto 97029ec # Last commands done (2 commands done): # pick 356d95e 4行目を追加 # s e3e9b30 5行目を追加 # Next command to do (1 remaining command): # pick fabb554 6行目を追加 # You are currently editing a commit while rebasing branch 'hoge' on '97029ec'. # # Changes to be committed: # modified: sample.txt #
コマンドモードに戻って:wqです。
しばらく待って、以下のように表示されれば成功です。
[detached HEAD 7ef5ac4] 4行目、5行目を追加 Date: Fri Aug 4 19:14:05 2017 +0900 1 file changed, 2 insertions(+) Successfully rebased and updated refs/heads/hoge.
logとdiffを確認してみる
以下のコマンドを実行して、ログを確認してみます。
git log --oneline
以下のような感じで表示されたと思います。
97dedd8 6行目を追加 7ef5ac4 4行目、5行目を追加 97029ec 3行目を追加 407e6f9 2行目を追加 30596dc 1行目を追加 d5d7400 Initial commit
“6行目を追加"のコミットはそのままに、"4行目を追加"と"5行目を追加"のコミットをまとめることができました。