git rebaseってなによ?
git rebaseってなに?
前回, 前々回に続いて
今回は, git rebase
について書く.
git rebase
は コミットログを綺麗にする 機能である.
git rebase
を使えば,
- 複数のコミットを1つにまとめる
- コミットのノードを変える
ことができる.
なにも考えずにgit commit
しまくって,
後からgit rebase
でログを綺麗にまとめる使い方が主流みたい.
どうやって使うの?
このサイトがとってもわかりやすい.
わかりやすすぎて正直書くことがない...
今後, 使いそうなものを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
についてまとめた.