【Git】競合を解決しよう

Git でブランチをマージしたとき、競合が発生することがあります。
この記事では競合をどのように解決するかを順を追って解説します。

この記事では TortoiseGit を使います。
Visual Studio Code を使って競合の解決を行いたい場合は、
次の記事を参照してください:
【Git】Visual Studio Code で競合を解決しよう
【Git】Visual Studio Code で競合を解決しよう (3 way merge editor)

Linux 知識の要らない Git 講座 目次にもどる

ストーリー

ビジネスオーナー A さんと Web ディレクター B さん
ビジネスオーナー A さんと Web ディレクター B さん

前回までのあらすじ
ビジネスオーナーの A さんが営業時間の変更をプッシュし終えた頃、
Web ディレクターの B さんは、 A さんから依頼を引き受けたとき
A さんに提案したお店のコピーの変更をホームページに適用しました。

B さんは変更をコミットしてプッシュしましたが、
プッシュに失敗しました。

リモートリポジトリーから編集履歴をフェッチしたところ、
A さんが先にプッシュしていたことに気付き、
A さんの編集履歴をマージしてみましたが、競合が発生しました。

競合を解決するために TortoiseGitMerge を起動しよう

手順

1. [競合の解決] ボタンをクリック

マージを実行したときに競合が発生すると
以下のような画面が表示されるので [競合の解決] ボタンをクリックします。

[競合の解決] ボタンをクリック
[競合の解決] ボタンをクリック

すると、競合したファイルの一覧画面が表示されます。

2. 「index.html」 をダブルクリック
「index.html」 をダブルクリック
「index.html」 をダブルクリック

すると、「TortoiseGitMerge」というアプリケーションが起動します。

TortoiseGitMerge
TortoiseGitMerge

TortoiseGitMerge のつかいかた

TortoiseGitMerge の基本的な使い方を説明します。
まず、画面の上半分は確認用の表示で、編集できません。
そして、画面の下半分は編集用の画面になっています。

TortoiseGitMerge の画面の役割
TortoiseGitMerge の画面の役割

画面上半分にそれぞれのブランチの編集内容が表示されるので、
画面下半分の編集用画面で「どのようにマージするか」を編集していきます。
画面下半分はテキストエディターのように操作できます。

それぞれの画面で各行の色は以下の内容を示しています。

黄色編集で追加された行
オレンジ色編集で削除された行
赤色編集が競合している行

そして、編集が競合している行は、画面の上半分では文字列は青く表示され、
その中でもう一方と異なる部分は黄色で表示されています。
マージする上で参考になるかもしれません。

編集が競合している行
編集が競合している行

画面左端はスクロールバーになっており、
ファイル全体の中の競合が発生している箇所が赤く表示されます。

画面左端のスクロールバー
画面左端のスクロールバー

画面下半分の編集用画面で競合部分を編集していくと
この赤い表示は消えていきますので、
ファイル内の全ての赤い表示をなくすことを目標に編集していきます。

競合を解決してみよう

競合を解決する上で最も基本的な考え方は、
「どちらか一方が正しいわけではない」
ということです。

双方にそれぞれの編集意図があるので、
双方の編集意図を汲んだマージを行う必要があります。
相手の編集意図がコミットメッセージや編集内容から読み取れなければ
相手に連絡をとって編集意図を確認してマージしましょう。

この例では、競合した行が更新された編集履歴である
「営業時間の変更」と「キャッチコピーの追加」の
両方の意図を汲んだマージを行う必要があります。

競合した行が更新された編集履歴
競合した行が更新された編集履歴

手順

1. 編集用画面の競合部分を編集します

TortoiseGitMerge の画面下半分の編集用画面で
競合部分を以下の内容に更新します。

            未知との出会いを応援する 勉強会カフェ 「First Knowledge」 オープン! 営業時間:平日 07:00〜13:00, 18:00〜23:00 / 土日祝 07:30〜21:00

※ 行末で改行することに注意してください。

行末で改行しましょう
行末で改行しましょう
2. [ファイル] → [保存]
[ファイル] → [保存]
[ファイル] → [保存]
3. [解決済みとする] をクリック

競合した行を全て編集した状態でファイルを保存すると、
そのファイルを「解決済み」としてマークするためのダイアログが表示されます。
ここで [解決済みとする] をクリックします。

[解決済みとする] をクリック
[解決済みとする] をクリック
4. 競合したファイルの一覧画面のファイルリストが空になっていることを確認します

競合したファイルを「解決済み」としてマークすると、
競合したファイルの一覧画面には表示されなくなります。
この画面が空になれば、全ての競合の解決が完了していることになります。

5. コミットダイアログを開きます

「マージ中」の状態でコミットダイアログを開くと、
次のようなダイアログが表示されます。

Git が「マージ中」の状態であることを知らせるダイアログ
Git が「マージ中」の状態であることを知らせるダイアログ

このダイアログは、現在 Git が「マージ中」の状態であることを
ユーザーに知らせるためのものです。
[OK] をクリックして閉じます。

6. コミットします

コミットダイアログはそのままで構いません。
画面下部 [変更した項目] の [状態] 欄が
「競合」になっているファイルがないことを確認して
[コミット] ボタンをクリックします。

「競合」になっているファイルがないことを確認して [コミット] ボタンをクリック
「競合」になっているファイルがないことを確認して [コミット] ボタンをクリック

すると、次のようなダイアログが表示されます。

コミットメッセージの省略を奨めるダイアログ
コミットメッセージの省略を奨めるダイアログ
It looks as if there is a conflict hint (a line like “# Conflicts:”) in your commit message.
This hint is automatically added by Git for cli users and there is no need to keep it. Do you want to ignore this warning and keep these lines or abort committing in order to edit the commit message? You can automatically remove these lines by enabling “Strip lines starting with “#” in commit messages” in TortoiseGit settings.

日本語訳すると、だいたい次のような意味です。

コミットメッセージに競合のヒント(「#Conflicts:」のような行)があります。
このヒントは、 Git によって cli ユーザー向けに自動的に追加されたものであり、
保持する必要はありません。
この警告を無視してこれらの行を保持しますか、それともコミットメッセージを編集するためにコミットを中止しますか?
TortoiseGit の設定で
「コミットメッセージにおいて、 “#” で始まる行を取り除く」
を有効にすると、これらの行を自動的に削除できます。

TortoiseGit は削除を推奨しているようです。
筆者は、後から競合を解決したファイルを調べるのは大変なので、
念のためコミットメッセージに残しておくようにしています。

7. 「成功」と表示されることを確認します
「成功」と表示されることを確認します
「成功」と表示されることを確認します

これでマージが完了しました。

結果を確認してみよう

HTML ファイルをブラウザで表示すると次のようになっています。

ブラウザでの表示 競合の解決後
ブラウザでの表示 競合の解決後

ログは次のようになっています。

競合の解決後のログ
競合の解決後のログ

これでプッシュできるようになりました。
成功するはずです。

競合の解決後にプッシュした結果
競合の解決後にプッシュした結果

以上でプロジェクトの編集履歴の競合の解消が完了しました。

Linux 知識の要らない Git 講座 目次にもどる

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