概要
いつの日か訪れるコンフリクト解消の日のための備忘録。
(つまりコンフリクト解消手順)
状況
作業ブランチで編集したのち、プルリクを出したらコンフリクトが!
ツール
- gitlab
- netbeans
登場ブランチ
- develop(マージ先)
- a_branch(すでにdevelopにマージ済み)
- b_branch(作業ブランチ)
前提条件
作業ブランチ(b_branch)からdevelopにプルリク出している。
先にa_branchがマージされてて、そのブランチで編集されたものと競合したらしい。
プルリク出した時にコンフリクト起こしてると、こう表示されるはず
手順
developを最新の状態に
# ブランチをdevelopに切り替えて
git checkout develop
# pullする(リモートの状態を反映させて最新に)(fetch + mergeでもOK)
git pull origin develop
作業ブランチにdevelopをマージする
# 作業ブランチに切り替えて
# git checkout <作業ブランチ>
git checkout b_branch
# developをマージ
git merge develop
そしたら、コンフリクト発生してるぜって出るはず。
Auto-merging fuel/app/classes/util/message.php
CONFLICT (add/add): Merge conflict in fuel/app/classes/util/message.php
Automatic merge failed; fix conflicts and then commit the result.
状態を確認してみる
git status
On branch b_branch
# ここにも、マージできなかった旨がかいてある
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
# a_branchが追加してたファイルで、コンフリクト起こしてないから自動マージされたやつ
Changes to be committed:
new file: fuel/app/classes/util/ahoge.php
# コンフリクト起こして自動マージできなかったやつ
# ※これを修正してコンフリクト解消する必要がある!※
Unmerged paths:
(use "git add <file>..." to mark resolution)
both added: fuel/app/classes/util/message.php
ログも見てみる(IDEのプラグインとか他のツールで確認でもよい)
git log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
(※.gitconfigにaliasを設定して「git graphall」で確認できるようにしている)
では、コンフリクト解消する
今回はnetbeansで解消するが、方法はIDE使用せずエディタで行ってもなんでもいい。
確認
both added
と表示されていたコンフリクト起こしてるファイル fuel/app/classes/util/message.php
がこのように赤く表示される。
対象のファイルを開くと、コンフリクト起こした部分は以下のように表示される
<<<<<<< HEAD
# 作業ブランチでの変更内容
・・・
=======
# develop(マージしたブランチ)での変更内容
・・・
>>>>>>> develop
今回はこんな感じになってる。
ファイルの新規作成及び定数の追加をa_branchでも(作業ブランチ)b_branchでも行っていた。
<<<<<<< HEAD
<?php
class Util_Message
{
const B_MESSAGE_1 = 'bbranchが追加したメッセージ 1個目。';
const B_MESSAGE_2 = 'bbranchが追加したメッセージ 2個目。';
=======
<?php
class Util_Message
{
const A_MESSAGE_1 = 'abranchが追加したメッセージ 1個目。';
const A_MESSAGE_2 = 'abranchが追加したメッセージ 2個目。';
>>>>>>> develop
}
差分を確認しながら編集する
対象のファイルを右クリック→Git
→差分
→HEADとの差分
を選択
修正するとこんな感じ。どんな修正をしたか見やすい。
これで保存。
編集したファイルをステージする
これしないと、gitはコンフリクト解消したことに気づきません
git add fuel/app/classes/util/message.php
確認
git status
コンフリクトが解消されたこと・Changes to be committed:
に編集したファイルが追加されたことが分かる
On branch b_branch
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
new file: fuel/app/classes/util/ahoge.php
modified: fuel/app/classes/util/message.php
あとはcommitとpushすればOK
git commit -m "コンフリクト解消" # デフォルトのマージコミットコメントを使用する場合は、git commitのみでenter。エディタが開くので、コミットコメントを保存。
git push origin b_branch
一応、ログ見ておこうかな
gitlabを確認してみる
プルリクの画面を開くと、コンフリクト解消されたのでメッセージかわってるはず
おわり
あとがき
- 今回はmergeで解消したけど、rebaseでの方法もあり(やったことない)
- vimとか使ってるなら、git mergetoolでファイル編集するとよさそう?