rebaseを使ってgitのツリーをシンプルにする

複数人で同一のリポジトリを使って開発していると、以下のようなツリーの状態になることが多いかと思います。

f:id:hapoon:20171102132305p:plain

ラインが入り乱れており、かなり見づらくなってしまってます。

上記の例だと、5人がそれぞれ同時期に1ブランチしか使わない想定のツリーですが、実際には開発メンバーが5人以上いたり、1人が複数案件抱えていて2ブランチ以上同時に使ったりすると、さらにツリーが見づらくなってしまいます。

rebaseを使うことによりシンプルなツリーにすることができるようになります。

細かいコミットをrebaseでまとめる

細かいコミットは git rebase -i を使って意味のある単位でコミットをまとめてしまうと良いです。
問題があったときにrevertし易い単位にしておくと楽です。

git rebase -i HEAD~2

f:id:hapoon:20171102162547p:plain
の赤枠で囲まれた部分をまとめることができます。

ブランチにmasterをマージする際にrebaseを使用する

Pull Requestを作成した際にmasterとconflictが生じてしまった際に一度masterを取り込んでからconflictを解消しますが、その際にgit mergeではなくgit rebaseを使ってmasterを取り込みます。

git rebase master

f:id:hapoon:20171102162703p:plain
の赤枠で囲まれた部分をなくすことができます。

注意点

ブランチにmasterをrebaseでマージする際、既に一度プッシュ済みのブランチだと通常のプッシュだと失敗するので git push --force-with-lease でプッシュしてください。
--force,-fだと複数人で同一ブランチを使って開発していた際に他の人が直近にプッシュした内容を消失させてしまう可能性があるので--force-with-leaseを使いましょう。

結果

上記の2点を心がけて、上記のツリーを整理すると
f:id:hapoon:20171102175037p:plain
ここまでシンプルなツリーとなる。

まとめ

  1. 細かいコミットをrebaseでまとめる
  2. ブランチにmasterをマージする際にrebaseを使用する


今回使用したサンプルは以下の手順で作成しました。

  1. [Aさん] masterからbranch-aを作成、実装をプッシュ。
  2. [Bさん] masterからbranch-bを作成、実装をプッシュ。
  3. [Cさん] branch-aからbranch-cを作成、実装をプッシュ。
  4. [Dさん] masterからbranch-dを作成、実装をプッシュ。
  5. [Cさん] branch-cをbranch-aにマージ。
  6. [Aさん] branch-aをmasterにマージ。
  7. [Eさん] masterからbranch-eを作成、実装をプッシュ。
  8. [Cさん] masterからbranch-c2を作成、実装をプッシュ。
  9. [Bさん] branch-bに追加実装をプッシュ。
  10. [Bさん] コンフリクトが発生した為、branch-bにmasterをマージしてコンフリクトを解決してプッシュ。
  11. [Dさん] コンフリクトが発生した為、branch-dにmasterをマージしてコンフリクトを解決してプッシュ。
  12. [Bさん] branch-bをmasterにマージ。
  13. [Dさん] コンフリクトが発生した為、branch-dにmasterをマージしてコンフリクトを解決してプッシュ。
  14. [Eさん] branch-eに追加実装をプッシュ。
  15. [Eさん] branch-eに追加実装をプッシュ。
  16. [Eさん] コンフリクトが発生した為、branch-eにmasterをマージしてコンフリクトを解決してプッシュ。
  17. [Eさん] branch-eをmasterにマージ。
  18. [Dさん] branch-dに追加実装をプッシュ。
  19. [Cさん] branch-c2に追加実装をプッシュ。
  20. [Cさん] コンフリクトが発生した為、branch-c2にmasterをマージしてコンフリクトを解決してプッシュ。
  21. [Cさん] ローカルのmasterが古く、再度コンフリクトが発生した為、branch-c2にmasterをマージしてコンフリクトを解決してプッシュ。
  22. [Cさん] branch-c2をmasterにマージ。
  23. [Dさん] コンフリクトが発生した為、branch-dにmasterをマージしてコンフリクトを解決してプッシュ。
  24. [Dさん] branch-dをmasterにマージ。