Git rebase 覚書 と Atom エディタを使った操作
Git rebase 覚書 と Atom エディタを使った操作
新しく製品開発のプロジェクトがスタートし、開発体制や開発規約などチーム全体で標準化を進めています。 その中で、GitHub へプルリクエストする時は、rebase するルールがあります。 今までの開発で rebase は使ったことがなかったので、何が良いのか?また、その手順などまとめたいと思います。
チームの運用方針
- トピックブランチに統合ブランチの最新のコードを取り込むには rebase を使う
- 統合ブランチにトピックブランチを取り込むには、rebase してから non fast-forward で marge
rebase せずにマージすると履歴が複雑になる
GitHub を使って開発を進めると、本流(以下 master)のブランチからバグフィックスや機能追加などのブランチを作成します。そのブランチを使って開発を進めていると、他のブランチのマージによって master の履歴が更新されていきます。そうすると、以下の図のように現在開発中のブランチは master の最新の更新内容が適用されていない状況になります。
通常これを master にマージすると、最新の履歴も反映しつつ新しくマージされます。
履歴をグラフィカルに表すと以下の図のように複雑になってしまいます。
rebase してマージすると履歴が単純になる
topic ブランチを 最新の master ブランチに rebase すると、以下の図のようになります。 (最新の master をベースに topic ブランチを作成してコードを更新した状態)
rebase した topic ブランチを master ブランチに marge (non fast-forward) すると、以下の図のようになります。
rebase & 統合ブランチへの marge を運用していくことで、履歴は以下の図のように単純化されます。
ちなみに、fast-forward marge すると履歴は一本化されます。チームの運用方針は non fast-forward なので、上の図の履歴になります。(GitHub の Web 画面からプルリクエストを marge すると、non 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 log の可視化に便利な、Git Log の紹介
Git Log
は、git の履歴をグラフィカルに表示してくれる便利なプラグインです。
コマンドパレットを表示して、Git Log: Show
を実行すると、更新履歴ををグラフィカルに表示してくれます。
Git Plus で rebase 操作
以下の手順は、ローカルにチェックアウトしてあるトピックブランチで実行します。
- Git Plus: Pull Using Rebase 実行
- 分岐元のリモートブランチを指定 (e.g., origin/master)
- コンフリクトがある場合
- エディタでコンフリクトを修正
- Git Plus: Add 実行
- Git Plus: Run (rebase --continue) 実行
- (コンフリクトがなくなるまで繰り返す)
- (もし、途中で中止したい場合は Git Plus: Run (rebase --abort))
- Git Plus: Run (push --force) 実行
rebase 後、リモートのトピックブランチに反映させるには、強制的に push する (push --force) 必要があります。 そのため、トピックブランチの修正は自分のみ変更しているという前提条件のもと行ってください。
もし、他人の変更を上書きしてしまわないようにしたい時は --force の代わりに --force-with-lease を使うと良いそうです。
まとめ
今回チームの運用方針で、rebase を初めて使いました。 少し手順は増えますが、master にマージされる履歴は重なりがなく、単純になり気持ちが良いです。