LoginSignup
21
22

More than 5 years have passed since last update.

コミット履歴の改善に役立つ git rebase -i 5つの使い方

Last updated at Posted at 2016-03-22

今まで rebase は、基本的にgit rebase origin/masterしか使ってきませんでした。
リモートに push されていると何かと悪さをするやつだと思って、あまり関心がありませんでした。

しかしローカルで作業している限り便利なものだと知ったので、git rebase -i の機能の一部分をまとめました。

  • git version 2.6.4

1.コミット名の編集

pickr に変更します

$ 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.コミットの編集

picke に変更します

6. rebase -i でコミットを修正する【チュートリアル3 コミットを書き換えよう!】 _ サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 _ どこでもプロジェクト管理バックログ

補足

git commit --amend実行時にコミット名も変更することが出来ます。

3.コミットをまとめる

picks に変更します

$ 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のpicksに変更し

AB'---C---D

のようにします。

合わせ技

以下の様なコミットがあって、

A---B---C---D  master

以下のようにしたい時は、

AC'---B---D  master 

「コミットの順番を変更する」を組み合わせることでできます。

4.コミットの削除

pickd に変更します

$ 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)

とやると、作業ブランチのコミットだけを表示できるので便利。

21
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
22