Gitの競合(コンフリクト)を解決する手順

git
photo by Scott*

photo by Scott*

Pull Requestをためたりなどして、マージする競合(コンフリクト)が発生すると、GitHubでは自動マージできないためこの様な表示になる。

Cannot auto merge

この様なときの解決方法は、競合が発生しているため、人間が判断して取り込む必要がある。

スポンサーリンク

自分のリポジトリへマージする

まず、Pull Requestを受け取ったリポジトリを最新の状態にする。

$ git clone [email protected]:hirocaster/wdpress69.git
Cloning into 'wdpress69'...
remote: Counting objects: 236, done.
remote: Compressing objects: 100% (122/122), done.
remote: Total 236 (delta 134), reused 211 (delta 111)
Receiving objects: 100% (236/236), 126.55 KiB | 77 KiB/s, done.
Resolving deltas: 100% (134/134), done.
$ cd wdpress69
$ git pull
Already up-to-date.

既にCloneしていたのであれば、Pull Requestを受けたブランチでpullだけすれば良い。

リモートリポジトリを追加

今回リポジトリを送ってきた人のリポジトリをremoteに追加する

$ git remote add kitak git://github.com/kitak/wdpress69.git

リモートリポジトリのデータを取得する。

$ git fetch kitak
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2)
Unpacking objects: 100% (3/3), done.
From git://github.com/kitak/wdpress69
 * [new branch]      gh-pages   -> kitak/gh-pages
 * [new branch]      work       -> kitak/work

kitak/workからPull Requestが送られてきたので、kitak/workをマージしてみる。

$ git merge kitak/work
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

見事にindex.htmlで競合(CONFLICT)が発生した。このため自動マージができなかったのである。

コンフリクトを解決する

コンフリクトをしたindex.htmlをのぞいてみる。

<<<<<<< HEAD
<p class="impression">Pull Requestを初めて使いました。git使いこなせるようになり
たい!(<a href="https://twitter.com/#!/ko2000jp">@ko2000jp</a>)</p>
<p class="impression">GitHubが分かりやすく理解できました。初めてのPull Request\
もできました!ありがとうございます。(<a href="http://twitter.com/nasneg">@nasne
g</a>)</p>
<p class="impression">敷居が高いと思っていたPull Requestを実際に体験できてよか\
ったと思います。これからGitHubをもっと活用していきたいです!ありがとうございま\
した!!(<a href="http://twitter.com/__yas">@__yas</a>)</p>
=======
<p class="impression">Pull Request, 初挑戦です. 分かりやすい記事をありがとうご\
ざいます! (<a href="https://twitter.com/#!/kitak">@kitak</a>)</p>
>>>>>>> kitak/work 

この様に ======= の行を境目にして、上側が自分のリポジトリの最新版、下側がPull Requestを送ってもらったリポジトリの内容である。この部分が競合(コンフリクト)している。

今回の場合は両方の競合を採用するので、以下のように修正する。


<p class="impression">Pull Requestを初めて使いました。git使いこなせるようになり
たい!(<a href="https://twitter.com/#!/ko2000jp">@ko2000jp</a>)</p>
<p class="impression">GitHubが分かりやすく理解できました。初めてのPull Request\
もできました!ありがとうございます。(<a href="http://twitter.com/nasneg">@nasne
g</a>)</p>
<p class="impression">敷居が高いと思っていたPull Requestを実際に体験できてよか\
ったと思います。これからGitHubをもっと活用していきたいです!ありがとうございま\
した!!(<a href="http://twitter.com/__yas">@__yas</a>)</p>
<p class="impression">Pull Request, 初挑戦です. 分かりやすい記事をありがとうご\
ざいます! (<a href="https://twitter.com/#!/kitak">@kitak</a>)</p>

単純に無駄な行を削除しただけである。どちらか1つが必要な場合は片方を丸ごと削除するケースもある。

あまり難しいことを考えず、両方比較して、あるべき姿に修正してやれば良い。

競合箇所を見つけるには ===== なんかを検索して見つけるのがポイント。

$ git add index.html
$ git commit -m "Merge from kitak/work #37"
$ git push
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 657 bytes, done.
Total 6 (delta 4), reused 0 (delta 0)
To [email protected]:hirocaster/wdpress69.git
   71a6643..139e41a  gh-pages -> gh-pages

こんな感じでコミットして、pushしてやれば良い。

PR Merged

マージされている表示に変わったことが確認できる。

紙面の都合で競合(コンフリクト)については触れられてないが、それ以外の操作については触れているので、こちらのお買い上げも検討頂きたい。どうぞよろしくお願いします。

WEB+DB PRESS Vol.69

WEB+DB PRESS Vol.69

WEB+DB PRESS編集部

git力をあげるにはこちらがイイかも。

タイトルとURLをコピーしました