Git開発でmasterの内容を開発ブランチに反映させる方法
Mar 19 2015
Git開発を行っていると、こんなことありませんか。
origin/master
ブランチからhoge
ブランチを切るhoge
の実装をゴリゴリ行ってる間にorigin/master
ブランチがどんどん更新されていく自分が編集してたファイルが
master
で更新されてた\(^o^)/origin/master
を一回merge、コンフリクトを直してPull Requestを送る
あるあるですよね。
そしてrebaseを知らない頃の僕は以下の方法で解決していました。
% git checkout master
% git pull origin master
% git checkout hoge
% git merge master
(ここでコンフリクトが出て怒られる)
(bot modifiedステータスのファイルを修正、コミット)
% git push origin hoge
ここでやっとPull Requestを送ることができます
下の図で言うと
CからGへmergeコミット(この際、コンフリクトを解消)
GからFへmergeコミット(プルリクエスト)
となります。
しかしrebaseコマンドを使うことでこの2回のコミットを1回に減らすことができます
rebaseコマンド
rebase
コマンドを使うことで、現在のブランチが生えているポイントをmasterの最新のコミットに変更することができます。
図で言うならば下図の状態が
こうなります。
この際、コミットは1回も増えていません。
ここからプルリクを出し、mergeされると下図のようになります。
mergeコミットはこの1回で済み、履歴を綺麗に残すことができました!YATTA!
使い方
1 ローカルのmasterを最新の状態にする
まずはrebaseするmasterブランチを最新の状態にします。
この際、ブランチがmasterに切り替わっていないと開発ブランチにmergeしようとしてしまうので注意してください。
% git checkout master
% git pull origin master
2 rebaseコマンドを叩く
開発ブランチに戻り、rebaseコマンドを叩きます。
この際、コンフリクトが発生しなければ手順は終了です。git log
あたりで履歴を見て見てください!
当然、コンフリクトが起こることもあるので、その場合を次で説明します。
% git checkout hoge
% git rebase master
3 コンフリクトを解消する
コンフリクトが発生した場合は、ファイルを修正、add
してrebase --continue
します。これをコンフリクトが消えるまで繰り返します。
ここでcommit
してしまうとやり直しになってしまうので気をつけてください。
rebaseを途中でやめて、rebase直前の状態に戻す場合はgit rebase --abort
を叩けばオッケーです。
% vi conflictFile1.txt
% git add conflictFile1.txt
% git rebase --continue
(ここでまたコンフリクトが出たら同じことを繰り返す)
※rebase直前の状態に戻す場合は
% git rebase --abort
注意点
もし、すでに開発ブランチをリモートにpushしている場合、rebaseを行った後にpushすると怒られてしまうのでforce
オプションをつけてください
※ リモートの開発ブランチが変更される処理なので慎重に行ってください
% git push -f origin hoge
何が嬉しいか
コミット2回が1回で済むので履歴が綺麗
作業途中で一旦
master
を反映したいとき、commitを増やすことなくmergeすることができる
その他
ここ間違ってるよーとか読みづれーよーとかあったらコメントなり編集なりしてくださいm(_ _)m