今まで rebase は、基本的にgit rebase origin/master
しか使ってきませんでした。
リモートに push されていると何かと悪さをするやつだと思って、あまり関心がありませんでした。
しかしローカルで作業している限り便利なものだと知ったので、git rebase -i
の機能の一部分をまとめました。
- git version 2.6.4
1.コミット名の編集
pick
を r
に変更します
$ git rebase -i HEAD~~
テキストエディタが開いて、HEADからHEAD~~までのコミット表示されるので、以下のように変更します。
# 変更前
pick 26ef747 A
# 変更後
r 26ef747 A
テキストエディタを終了するとすぐに、コミットの編集画面が表示されるので、コミット名を変更します。
A
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Tue Mar 22 22:49:23 2016 +0900
#
# interactive rebase in progress; onto f98d1ca
# Last command done (1 command done):
# r 2f4e52f A
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'f98d1ca'.
#
2.コミットの編集
pick
を e
に変更します
6. rebase -i でコミットを修正する【チュートリアル3 コミットを書き換えよう!】 _ サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 _ どこでもプロジェクト管理バックログ
補足
git commit --amend
実行時にコミット名も変更することが出来ます。
3.コミットをまとめる
pick
を s
に変更します
$ git rebase -i HEAD~~
テキストエディタが開いて、HEAD から HEAD~~ までのコミット表示されるので、以下のように変更します。
# 変更前
pick 195172f A
pick c064177 B
pick 0a1df4a C
pick 36d169f D
# 変更後
pick 195172f A
s c064177 B
pick 0a1df4a C
pick 36d169f D
コンフリクトが起きた場合、コンフリクト部分を修正後に下記を実行
$ git add path/to/dir path/to/file
$ git rebase --continue
補足
squash は直前のコミットにまとめます。
上記の rebase では、以下のようなコミットを
A---B---C---D
コミットBのpick
を s
に変更し
AB'---C---D
のようにします。
###合わせ技
以下の様なコミットがあって、
A---B---C---D master
以下のようにしたい時は、
AC'---B---D master
「コミットの順番を変更する」を組み合わせることでできます。
4.コミットの削除
pick
を d
に変更します
$ git rebase -i HEAD~~
テキストエディタが開いて、HEADからHEAD~~までのコミット表示されるので、以下のように変更します。
# 変更前
pick a42f9e0 B
# 変更後
d a42f9e0 B
コンフリクトが起きた場合、コンフリクト部分を修正後に下記を実行
$ git add path/to/dir path/to/file
$ git rebase --continue
5.コミットの順番の変更
文字通りコミットの順番を変更します。
$ git rebase -i HEAD~~
テキストエディタが開いて、HEADからHEAD~~までのコミット表示されるので、以下のように変更します。
# 変更前
pick 26ef747 A
pick a42f9e0 B
# 変更後
pick a42f9e0 B
pick 26ef747 A
コンフリクトが起きた場合、コンフリクト部分を修正後に下記を実行
$ git add path/to/dir path/to/file
$ git rebase --continue
#rebase で行った修正を取り消したい場合
rebaseを行った直後であれば以下のコマンドで戻せます。
$ git reset --hard ORIG_HEAD
もっと前に戻したければreflogから、戻したいコミットIDを取得します。
$ git reflog
$ git reset --hard commit_id
Tips
下記のコマンドはmasterとカレントブランチの分岐点のコミットIDを表示します。
$ git show-branch --merge-base master HEAD
このコマンドと git rebase -i
を組み合わせて
$ git rebase -i $(git show-branch --merge-base master HEAD)
とやると、作業ブランチのコミットだけを表示できるので便利。