git rebaseって結局なんなの(1)
初心者の壁rebase
git add, commiit, checkout, mergeは怖くない! でも rebaseは怖い。
rebaseを理解するために必要なもの
rebaseを理解する前にcommitとbranch、HEADの関係性についてきちんと理解できているか再確認しましょう。
詳細な説明は公式ページ等を参照するのが良いと思うので、ここでは簡潔な説明に留めます。
誤解を恐れず、それぞれについて一言で表現するならば以下のようなイメージでしょうか。
commit リポジトリの履歴(スナップショット)
branch 枝分かれしたcommit
HEAD 現在のcommit位置
で結局rebaseとは
私はcommitを付け替える操作のことだと理解しています。
以下のようなリポジトリがあったとします。
Branch A 1 → 2 → 3 → 4 ↘ Branch B 3' → 4'
BをAにrebaseすると次のようになります。
Branch A 1 → 2 → 3 → 4 → 3' → 4'
Aの先頭にBのcommitが上乗せされた状態ですね。
一方、merge(non fast-forward)では
Branch A 1 → 2 → 3 → 4 → 5 ↘ ↗ Branch B 3' → 4'
merge commitが発生するためこのようなcommitになります。 実際にはmerge後にはBranch Bが削除されてmerge commitだけが残ることが多いでしょう。
もう一つのrebase
rebaseにはもう一つ大きな役割があります。 それはcommitの改変です。
詳細は割愛しますが、複数のcommitをまとめて一つにするなどの操作ができます。 試行錯誤した跡をそのままpushするとcommit logを汚してしまうため、 自分だけが作業しているbranchでcommitの整理を行ってからpushするといったことができます。
注意点としては、他の人が作業しているbranchで安易な改変を行うと大変なことになるので絶対やめてください。(特にmaster) どうしても実施する必要のある場合は、必ずメンバーに合意を取ってから作業するようにしましょう。
これであなたもrebaseマスター
commit logをきれいに保つために便利なrebase。 不安な場合はローカルブランチで色々と練習してはいかがでしょうか。