LoginSignup
768
678

More than 3 years have passed since last update.

Git コンフリクト解消手順

Last updated at Posted at 2018-08-01

概要

いつの日か訪れるコンフリクト解消の日のための備忘録。
(つまりコンフリクト解消手順)

状況

作業ブランチで編集したのち、プルリクを出したらコンフリクトが!

ツール

  • gitlab
  • netbeans

登場ブランチ

  • develop(マージ先)
  • a_branch(すでにdevelopにマージ済み)
  • b_branch(作業ブランチ)

前提条件

作業ブランチ(b_branch)からdevelopにプルリク出している。
先にa_branchがマージされてて、そのブランチで編集されたものと競合したらしい。

プルリク出した時にコンフリクト起こしてると、こう表示されるはず

image.png

手順

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」で確認できるようにしている)
image.png

では、コンフリクト解消する

今回はnetbeansで解消するが、方法はIDE使用せずエディタで行ってもなんでもいい。

確認

both addedと表示されていたコンフリクト起こしてるファイル fuel/app/classes/util/message.phpがこのように赤く表示される。
image.png

対象のファイルを開くと、コンフリクト起こした部分は以下のように表示される

<<<<<<< HEAD
# 作業ブランチでの変更内容
・・・
=======
# develop(マージしたブランチ)での変更内容
・・・
>>>>>>> develop

今回はこんな感じになってる。
ファイルの新規作成及び定数の追加をa_branchでも(作業ブランチ)b_branchでも行っていた。

message.php
<<<<<<< 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との差分を選択
image.png

これで差分を見ながら修正できる
image.png

修正するとこんな感じ。どんな修正をしたか見やすい。
これで保存。
image.png

編集したファイルをステージする

これしないと、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

一応、ログ見ておこうかな

枝分かれしてたのが、ちゃんと集結?(語彙力)してます。
image.png

gitlabを確認してみる

プルリクの画面を開くと、コンフリクト解消されたのでメッセージかわってるはず
image.png

おわり

あとがき

  • 今回はmergeで解消したけど、rebaseでの方法もあり(やったことない)
  • vimとか使ってるなら、git mergetoolでファイル編集するとよさそう?
768
678
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
768
678