はじめに
プルリクエストでコンフリクトが発生した場合にどうするかというのが初心者が混乱する最初のポイントになるかと思います。どれが良いのかわからないが、困らないようにやってみる。
準備
master
からfeature
を分岐してそれぞれいくつかコミット。
githubのpull-request
で、master
にfeature
を取り込む際にコンフリクトが発生した場合。
【option1】featureにmasterをmergeする
- masterを最新にする
- featureにmasterをmerge
- コンフリクトを解決
- featureをリモートにpush
- github上でpull-requestをマージ
git checkout feature
git merge master
(resolove conflicts)
git push origin feature
Benefits
- コンフリクトの解決が1回で済む
- 履歴を書き換えない
- 強制pushせずに済む
Drawbacks
- 一回の統合操作で、ローカルでのマージログ、githubでのマージログの2つが残り、あまり意味のないコミットが発生する
【option2】featureにorigin/masterをmergeする
- featureをcheckout
- pullでfeatureに
origin/master
をmerge - コンフリクトを解決(SourceTreeだとメッセージ出ないので注意)
- featureをリモートにpush
- github上でpull-requestをマージ
git checkout feature
git pull origin master
(resolove conflicts)
git push origin feature
Benefits
- option1と全く同じ結果、仕組みになるが、最新取得+マージが一発で早い
【option3】masterをfeatureにrebaseする
- masterを最新にする
- featureをcheckout
- masterをfeatureにrebase
- コンフリクトを解決
- featureをリモートに
強制push
- github上でpull-requestをマージ
git checkout feature
git rebase master
(resolove conflicts)
git push -f origin feature
Benefits
- ブランチの履歴が別になってわかりやすい
Drawbacks
- コンフリクトの解決が複数回発生して面倒
- リモートを強制的に書き換えてしまう
【option4】origin/masterをfeatureにrebaseする
- featureをcheckout
-
origin/master
をfeatureにrebase - コンフリクトを解決(SourceTreeだとメッセージ出ないので注意)
- featureをリモートに
強制push
- github上でpull-requestをマージ
git checkout feature
git pull --rebase origin master
(resolove conflicts)
git push -f origin feature
Benefits
- option3と全く同じ結果、仕組みになるが、最新取得+リベースが一発で早い
まとめ
githubでマージコミットが残ることを考えると、ローカルでマージコミットを残さないリベースをしたほうが無駄がない感じがする。ただマージ作業が複数回発生してしまうのは危険な香りがする。
この対応で混乱すると、Gitよくわかんね、という評価になってしまうので、事前に考え方を整理しておきたい。