See the Elephant

1992生まれのプログラマが書くエンジニアブログ

git rebaseってなによ?

git rebaseってなに?

前回, 前々回に続いて
今回は, git rebaseについて書く.

git rebase コミットログを綺麗にする 機能である.
git rebaseを使えば,

  • 複数のコミットを1つにまとめる
  • コミットのノードを変える

ことができる.

なにも考えずにgit commitしまくって,
後からgit rebaseでログを綺麗にまとめる使い方が主流みたい.

どうやって使うの?

liginc.co.jp

このサイトがとってもわかりやすい.
わかりやすすぎて正直書くことがない...

今後, 使いそうなものをpickupして書こう.

複数コミットをまとめる方法

基本的には, HEADからの距離対象コミットのhash値 を使う.

# -i はinteractiveモード
$ git rebase -i <hash値> or <HEAD~n>

例えば, 2つのコミットを1つにまとめる場合.

$ git log --oneline
...  
fl32k49 commit C
r43ng9c commit B
2Ofncfb commit A

$ git rebase -i HEAD~1
         or 
$ git rebase -i r43ng9c

rebase すると, editorが開く.
ここで, 各コミットの扱いを設定する.

# rebase すると開くファイル  

pick r43ng9c commit B
pick fl32k49 commit C

ちなみに, rebaseファイルで使うコマンドは以下の通り.

  • pick(コミットを採用)
  • reword(コミットを採用するが、コミットメッセージを変更)
  • edit(コミットを採用するが、ファイルを修正する)
  • squash(一個前のコミットと合体させる)
  • fixup(コミットメッセージを変更しない点以外、squashと同じ)
  • exec(shellでコマンドを実行する)

ここで, コミットBにコミットCを結合する場合を考える.

pick   r43ng9c commit B
squash fl32k49 commit C   # squashは s だけでもいい

このファイルを上書き保存すると, コメント編集用のファイルが開く. コメントを書き換えて保存するとrebase完了.

コンフリクト発生!!!

コミット同士を無理やり結合しているので, 衝突する場合がある.
その時, rebaseは一時中断されるのだが, その時に使うコマンドを記す.

  • git rebase --continue(衝突などを解決した後に実行して、rebaseを続行する)
  • git rebase --skip(エラーを無視する)
  • git rebase --abort(rebaseをやめる)

注意すべきこと

rebaseはコミットを書き換えるわけではなく, 新しくコミット を行う

このため, リモートリポジトリのコミットを
git rebaseで書き換えてしまうと大量のconflictを引き起こす.
だから, リモートリポジトリに対しgit rebaseによる編集は控えた方が良い.

リモートリポジトリが関係する場合は, git revertでノードの編集を行うことが慣習になってる.

簡単ながら, git rebaseについてまとめた.