
チームで Git を使って開発を進めているとどうしてもコミットの競合が発生します。競合の対処は Git の仕様を理解していないとなかなか面倒で、うっかり対処をミスすると復旧にもてこずったりします。そうならないためにもベストと言わないまでも、ベターなプラクティスを確認してみました。
どんなシチュエーション?
- master ブランチから分岐した feature/mybranch で作業をし、実装完了したのでプッシュ、プルリクエスト
- だが、同じファイルを theirbranch 君が feature/theirbranch で編集し、プルリクエスト
- リポジトリ管理者は先にプルリクエストのあった feature/theirbranch を master ブランチにマージ
で、feature/mybranch のプルリクエストをマージしようとしたら・・・・・・
競合の警告が出て、feature/mybranch のプルリクエストがマージできない!
競合発生)
B''---C'' theirbranch
/ \
A---B--------------D-----★マージできないよ(怒)!! master
\ /
B'------------C' mybranch
こんな時どうしましょう、って話です。
mybranch 君がやる手順
では mybranch 君がサクッと競合を解決していきます。
まず、プルリクエストを見て競合の状態を見てみます。なるほど、単純な競合ですね。今回は設定系のファイルに mybranch 君、theirbranch 君、二人ともが自分たちの設定を書き加えた。これが競合の原因ですね。ありがちなケースです。
master の最新化
①ということでローカルで作業を進めます。まず master ブランチに移ります(git checkout master)
②リモートリポジトリの master ブランチの最新状態を取り込みます(git pull origin/master)
mybranch をマージ
③次に feature/mybranch に移ります(git checkout feature/mybranch)
④master ブランチをマージします(git merge master)。マージするには master ブランチのコミットを右クリックして「マージ」を選択
⑤予想通り競合の警告が出ますので OK, OK わかったよ、と
競合部分のマージ
⑥作業コピーを見ると競合が起きているファイルに警告マークが出てるので、競合ファイルをダブルクリック
⑦ファイルを開いたら、処理内容を見て、theirbranch と mybranch 、両方の変更を取り込みます
⑧処理の前後の順番、取り込み漏れがないかに注意して修正を完了させます
⑨競合を解決するとファイルの警告マークも消えているので、インデックスに追加してコミットメッセージを入力しコミット
プッシュ・プルリクエスト
⑩コミットできたら mybranch をプッシュ(git push feature/mybranch origin/feature/mybranch)
⑪プッシュが終わったらプルリクエストを送ります
結果確認
⑫ということで、リモートリポジトリのプルリクエストを確認すると今度は警告マークなく master にマージできます
すべての変更がリモートに反映されてます。
ブランチごとのマージ履歴も分かりやすいですね!
ざっとまとめるとブランチフローはこんな感じです。
競合解消のブランチフロー)
B''---C'' theirbranch
/ \
A---B--------------D----o------G master
\ \ /
B'------------C'--E---F mybranch