Git rebase 覚書 と Atom エディタを使った操作

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Git rebase 覚書 と Atom エディタを使った操作

新しく製品開発のプロジェクトがスタートし、開発体制や開発規約などチーム全体で標準化を進めています。 その中で、GitHub へプルリクエストする時は、rebase するルールがあります。 今までの開発で rebase は使ったことがなかったので、何が良いのか?また、その手順などまとめたいと思います。

チームの運用方針

  • トピックブランチに統合ブランチの最新のコードを取り込むには rebase を使う
  • 統合ブランチにトピックブランチを取り込むには、rebase してから non fast-forward で marge

rebase せずにマージすると履歴が複雑になる

GitHub を使って開発を進めると、本流(以下 master)のブランチからバグフィックスや機能追加などのブランチを作成します。そのブランチを使って開発を進めていると、他のブランチのマージによって master の履歴が更新されていきます。そうすると、以下の図のように現在開発中のブランチは master の最新の更新内容が適用されていない状況になります。 branch

通常これを master にマージすると、最新の履歴も反映しつつ新しくマージされます。 marge

履歴をグラフィカルに表すと以下の図のように複雑になってしまいます。 non rebase marge log history

rebase してマージすると履歴が単純になる

topic ブランチを 最新の master ブランチに rebase すると、以下の図のようになります。 (最新の master をベースに topic ブランチを作成してコードを更新した状態) rebase

rebase した topic ブランチを master ブランチに marge (non fast-forward) すると、以下の図のようになります。 non fast-forward marge

rebase & 統合ブランチへの marge を運用していくことで、履歴は以下の図のように単純化されます。 rebase & non fast-forward log history

ちなみに、fast-forward marge すると履歴は一本化されます。チームの運用方針は non fast-forward なので、上の図の履歴になります。(GitHub の Web 画面からプルリクエストを marge すると、non fast-forward marge になるそうです。) fast-forward marge

Atom エディタで rebase してみる

git コマンドを使って、rebase する手順は色々なサイトで解説されているので、Atom エディタの Git Plus プラグインを使って Rebase する手順を紹介します。(あまり、terminal の説明と変わらないかも)

Git の操作に便利な Git Plus の紹介

Git Plus は、cmd+shift+H でコマンドパレットを表示して、git の操作を選択して実行する機能を提供してくれるシンプルなプラグインです。 Git Plus のコマンドパレットに用意されていない、Git のコマンドは、コマンドパレットにある Run コマンドを実行すると、任意の Git コマンドを実行できます。 terminal に移動しないで操作できるので助かります。

Git Plus

Git log の可視化に便利な、Git Log の紹介

Git Log は、git の履歴をグラフィカルに表示してくれる便利なプラグインです。 コマンドパレットを表示して、Git Log: Show を実行すると、更新履歴ををグラフィカルに表示してくれます。

Git Log

Git Plus で rebase 操作

以下の手順は、ローカルにチェックアウトしてあるトピックブランチで実行します。

  1. Git Plus: Pull Using Rebase 実行
    • 分岐元のリモートブランチを指定 (e.g., origin/master)
  2. コンフリクトがある場合
    1. エディタでコンフリクトを修正
    2. Git Plus: Add 実行
    3. Git Plus: Run (rebase --continue) 実行
    4. (コンフリクトがなくなるまで繰り返す)
    5. (もし、途中で中止したい場合は Git Plus: Run (rebase --abort))
  3. Git Plus: Run (push --force) 実行

rebase 後、リモートのトピックブランチに反映させるには、強制的に push する (push --force) 必要があります。 そのため、トピックブランチの修正は自分のみ変更しているという前提条件のもと行ってください。

もし、他人の変更を上書きしてしまわないようにしたい時は --force の代わりに --force-with-lease を使うと良いそうです。

まとめ

今回チームの運用方針で、rebase を初めて使いました。 少し手順は増えますが、master にマージされる履歴は重なりがなく、単純になり気持ちが良いです。