#12 競合(コンフリクト)を解消する。

前項までの全8項で、Gitに関する基本的な操作は学習しました。
Gitには他にもできることが沢山ありますが、最低限ここまでの知識があればGitを使用することは可能でしょう。

Git編の最後に、競合(コンフリクト)について学習します。
競合はリモートリポジトリと変更履歴とローカルリポジトリの変更履歴が、全く同じ箇所だった場合に発生します。
この状況でローカルリポジトリの変更をマージしてしまうと、以前までの変更が消えてしまう可能性がある為、Git側がマージを拒否します。

実際に競合を発生させて、それを解消するところまでをやってみましょう。
※今回は学習の為、意図的に競合を発生させますが、本来のGit運用であれば発生しないのがベストです。


CBC_GitとCBC_Git2双方で作業する
study.txtの1行目を、それぞれ下図のように変更してください。
CBC_Git側:初めてのコミット(競合解消の練習)
CBC_Git2側:初めてのコミット(競合解消の学習)

それぞれのローカルリポジトリ上にあるstudy.txtの1行目を、ほとんど同じような内容に変更しました。


※CBC_Gitリポジトリで作業して下さい!
①CBC_Gitリポジトリ上で、テキストファイルの変更をコミット&プッシュ
これで、リモートリポジトリ上には「CBC_Git」リポジトリで実施した変更がマージされました。
ここまではもう、皆さんにとってもお馴染みの作業だと思います。


※CBC_Git2リポジトリで作業して下さい!
①CBC_Git2リポジトリ上で、テキストファイルの変更をコミット
まずはコミットだけ行いましょう。

②プッシュする為に、リモートリポジトリ上の変更履歴をプルする
コミットまで終えたら、プルを実行してみてください。下図のようなポップアップが表示されると思います。
リモートリポジトリ上の変更履歴(=ローカルリポジトリ「CBC_Git」からプッシュされ、統合された変更履歴)とローカルリポジトリ上でコミットされた変更履歴が競合しました。
CBC_Git2上のstudy.txtを開いてみると、下図のようになっていると思います。

競合が発生した場合、該当するファイルには図のように、
  • HEAD(現在の変更) = リモートリポジトリ上の変更履歴
  • コミット番号(入力側の変更) = ローカルリポジトリ上の変更履歴
の2つが、マークされて表示されます。

③必要な変更だけを残して、ローカルリポジトリ上からコミット&プッシュする
競合の解消方法はいくつかやり方があるのですが、今回は一番分かりやすい方法を見ていきます。
競合が発生している = Git側で、どの変更履歴が正しいのか判断がつかなくなっている状況なので、
テキストファイルを正しい変更に修正し、もう一度コミット&プッシュしてあげれば解消は解決します。

今回はCBC_Git上の変更が正として、競合の解消を行います。
テキストファイルを下図のように変更してください。
sourcetree上でコミットします。
競合解消のためのコミットを実行する際、コミットメッセージが既に入力されているはずです。
「マージしようとした際に、study.txtで競合が発生した」という旨のメッセージなのですが、
これはこのままでも良いですし、分かりやすいコミットメッセージに書き直しても良いです。
※参画するプロジェクト等で、競合解消時のコミットメッセージはどうするのか、決まりがあると思いますので、基本はそのルールに従いましょう。
今回はコミットメッセージはそのままでコミットします。

④競合解消のコミットを、リモートリポジトリへプッシュする
GitHubでリモートリポジトリの状態を見てみましょう。
リモートリポジトリ上のstudy.txtも、競合解消時のものに内容がマージされていますね。
ローカルリポジトリ「CBC_Git」も確認してみましょう。変更履歴をプルしてください。
競合は既に解消されている為、プルする際に競合は発生しません。
テキストファイルも、競合解消時のものになっていますね。

不特定多数の人員で作業をする以上、競合の発生リスクは常に存在します。
ですが、解消すること自体はそれほど難易度の高い作業ではありませんので、冷静に対処しましょう。
ただし、解消する際に残しておかなければならない変更を削除してしまうのはNGです。
競合が発生した場合は、その変更をコミットした作業者や上長と相談の上で対処するよう心がけましょう。
コピーしました
RSS https://cbc-study.com/rss.xml
質問などあればSlackで