プルリクエストでコンフリクトが発生
Gitでソース管理を行っていると厄介なのがコンフリクトです。プルリクエストでコンフリクトが発生してしまった場合の、rebaseを使った対処法をまとめます。
発生原因
例えば master ブランチから、hogeブランチを切って作業している場合を考えます。
作業が完了したあなたは、hogeブランチをマージしてもらうためにプルリクエストを作成します。
このマージの段階でコンフリクトが発生してしまうことがままあります。原因は作業中に親元のmasterブランチが更新された、などが考えられます。
以下のようなイメージです。
master o-o-o-o-o-o-×
\ / !confrict
hoge o-o-o
git pull –rebase を使った対処法
操作手順
先に手順だけまとめておきます。masterとhogeブランチを例にします。
- masterブランチを最新にして、作業ブランチをチェックアウト
$ git checkout master $ git fetch origin $ git pull origin master $ git checkout hoge
- 作業ブランチに対してmasterブランチをrebaseする
$ git pull --rebase origin master
- コンフリクトがあれば直す
error: Failed to merge in the changes.
みたいなエラーが発生したらコンフリクトなので対象ファイルを修正する。その後rebaseを続行する。
$ git add . $ git rebase --continue
コンフリクトが発生しなくなるまで上記手順を繰り返す。
- -fでプッシュする(hogeブランチを強制的に上書き)
$ git push origin hoge -f
操作手順の内容
git pull --rebase
は、ブランチの付け替えを行います。hoge
ブランチがdeveolop
ブランチの最新のコミットから派生していたことにしてしまします。
以下のように、masterからhogeブランチを作成している場合があったとします。
master o-o-o-o-o-o
\
hoge o-o-o
git pull --rebase
で付け替えると以下のようになります。
master o-o-o-o-o-o
\
hoge o-o-o
これがgit pull --rebse
のやっていることです。
見てわかる通り、masterの最新コミットからブランチが派生しています。歴史が完全に書き換わっています。この状態であれば、マージ時にコンフリクトが発生しづらくなります。
もちろんrebaseでコミットを書き換える際にコンフリクトが発生するとマージを行う必要があります。
マージをしてしまえばプルリクエストでコンフリクトが発生することは、だいたいなくなるはずです。
注意点
hogeブランチが付け替わっているということは、全く別のコミットが作成されていることを意味します。もとのhogeブランチの3つのコミットは、新しいコミットで置き換えられてたということです。
これを反映させるために、手順4.では-f
(forceコマンド)をつけて強制的にプッシュしています。もしhogeブランチを複数人で同時に更新している場合、--rebase
でコミットが書き換わると大変なことになるらしいです。
利用には注意が必要です。
以上。
コメントを書く