nologyance.net

日々のアウトプット

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。 不安な場合はローカルブランチで色々と練習してはいかがでしょうか。