【自主学習の記録 part1】GitLabの基本的な使い方その3

#概要
前回に引き続きプロジェクトの基本機能について触れていきます。
今回はプロジェクトのマージ実行時の競合について学習していきます。

#競合(コンフリクト)
GitLab上のプロジェクトにあるファイルについて、例えば2人のプロジェクトメンバーがプロジェクトのクローンを行い、全く同じファイルを編集したとします。
メンバーAが編集を完了し、GitLab上のマスターブランチへマージを行います。
当然マスターブランチにはメンバーAが編集したファイルとして更新されている状態になります。
この状態で異なる編集を行ったメンバーBがマスターブランチへマージを実施しようとすると、メンバーBのクローンしたファイルにはメンバーAが編集した内容が反映されていませんので、その差分が発生してしまいます。
この状態を競合(コンフリクト)と呼びます。
実際に競合を発生してみたいと思います。

##競合の発生
まずは以前作成したプロジェクトのクローンを行います。
今回もGitBashを使用します。
![GitLab01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/ab2ec6fa-5fea-f163-259a-06eb35f892d5.png)
GitBash上で上記の通りクローンを行いました。
プロジェクトのディレクトリ内にあるテキストファイルを編集します。
今回は以下画像の青い線が引かれた箇所を追記しました。
![GitLab11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/982d1694-c5d0-868e-367a-f8983b93441b.png)
その後、以下の要領でコミットからプッシュまで実施しています。
![GitLab12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/59143ca5-74ce-b6de-7f54-59091eb9bd87.png)
現時点でGitLab上には原本であるmasterブランチと原本を修正したdevelopブランチが存在している状態です。
この状態で一旦別のディレクトリへ移動し、再度クローンを実行します。
![GitLab13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/7bb5c6b3-6377-2996-0aba-1dfbd641c52e.png)
現在のブランチはmasterが選択されている状態ですので、再びブランチの切り替えを実施します。
今度はdevelopとは異なる名称で新たにブランチを切ります。
以下の通り新たにdebugというブランチを作成し、切り替えしました。(ブランチ名は適当に付けました…)
![GitLab14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/5e85be54-2f98-9753-93b3-e8bc74fc7c2d.png)
新しいブランチにてテキストファイルを以下の通り修正しました。
修正箇所は青線部分です。
![GitLab15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/aec8bb60-ff0e-c54d-6965-8932da4e371d.png)
先程と同じ要領でGitLabへプッシュまで実施しました。
この時点では特にエラーらしきメッセージは表示されていません。(それぞれ別のブランチで修正しているので当然ですが…)
![GitLab16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/5de41c25-4cbc-c785-0bb0-7cbac348de0f.png)
GitLabへ戻り、まずはdevelopブランチをmasterブランチへマージします。
GitLabのマージリクエストの画面へ移動します。
以下のマージリクエスト画面にある緑の枠で囲った**「New merge request」**をクリックします。
※「マージリクエストを作成」からだと最後にプッシュしたブランチが指定されます。最後にプッシュしたブランチは「debug」ですが、その前にプッシュした「develop」ブランチのマージがまだ未実施なので、「develop」ブランチを指定する必要があります。
![GitLab17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/11051120-332c-0321-2280-4434de6260f3.png)
「Source branch」欄内の青枠内に選択されているブランチをdevelopに変更します。
「Target branch」はデフォルトでmasterが選択されていますので、ここは切り替え不要です。
この状態で、「Compare branches and continue」をクリックします。
![GitLab18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/9e1bd2c5-f471-7cf6-f262-6440e2b3078a.png)
New Merge Requestの画面に移動します。
下記画像の赤線部に「From develop」と記載されている事を確認し、「Submit マージリクエスト」をクリックします。
![GitLab19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/cf89c684-b708-ceb8-6328-07987f6aa5f8.png)
以下の画面に移動しますので、「マージ」をクリックします。
※前回マージ実行時に、以下の赤線部「ソースブランチを削除」にチェックが入ったままマージしてしまったので、前回のdevelopブランチが消失してしまっていました…
今回はチェックを外しています
![GitLab20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/cc18bbd4-13d6-ce07-705b-56e6d99795df.png)
特にエラーなく完了しました。
![GitLab21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/c3985399-2034-d4b5-5d20-488d78b47492.png)
masterブランチのファイルとdevelopブランチのファイルの内容が一致している事がわかります。
![GitLab22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/33870142-1383-e938-0290-db3b6475132e.png)
この状態で今度はdebugブランチとmasterブランチをマージしてみます。
再びマージリクエストの画面へ移動し、「New merge request」をクリックします。
![GitLab23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/0f837ff1-8e10-3291-73a9-aaccd588939f.png)
デフォルトでソースブランチが選択されていない状態となりますので、「ソースブランチを選択」をクリックし、プルダウン内から「debug」を選択します。
Target branchはmasterのまま、「Compare branches and continue」をクリックします。
![GitLab24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/ea31b5b7-2d2a-feba-13e0-d570fc9819c8.png)
以下画面の赤線部が「From debug」となっている事を確認し、「Submit マージリクエスト」をクリックします。
![GitLab25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/f2ae0f9c-f722-8a8c-f1dc-faccf52f19c9.png)
すると以下の画面に移動します。
赤枠で囲っている箇所に「マージ」ボタンが表示されていますが、クリックする事が出来ません。
また、赤線部に競合を示すメッセージが表示されています。
これでマージの再現が出来ました。
![GitLab26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/74c37e06-6b48-9461-9c29-7d9380c79d84.png)

##競合の解決
競合を発生させたところで、次は競合を解消していきます。
競合を解決させるには、GitLab上で操作する方法と、ローカル上で修正する方法の2パターン存在しているようです。
今回はお手軽なGitLab上での解消方法を試してみます。
まずは以下の画面から「競合を解決する」を選択します。
![GitLab27.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/d867f532-3849-76e9-d87b-4ec97ac0af4c.png)
すると以下の画面に移動します。
ここで表示されている「HEAD //自分の変更」がマージを行えなかったdebugブランチの変更内容で、「origin //相手の変更」はマージ先の変更対象となっています。
以下画面の緑枠の「自分の変更を使用」をクリックするとorigin変更分が削除され、逆に「相手の変更を使用」をクリックするとdebugの変更がキャンセルされる様です。
また、オレンジ枠の「Edit inline」をクリックするとテキストエディタモードになり、編集が出来るようになります。
両方の変更を保持したい場合は、Edit inlineで手動で修正するとよいでしょう。
![GitLab28.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/49daab40-a09a-9e45-39ab-027a4f8c5c76.png)
今回は「Edit inline」を使用し、両方の変更を反映させました。(少し見えづらいですが…)
編集が完了しましたら、「ソースブランチへのコミット」をクリックします。
![GitLab29.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/68ce8edd-0194-bee8-a911-59de845c6113.png)
先程のマージリクエストの画面に戻ります。青線部に競合が解消されたというメッセージが表示されています。
しかしこの状態ではまだ「マージ」ボタンをクリック出来ません。
緑枠内の「承認」をクリックすると、「マージ」がクリック出来るようになります。
※競合の解消内容を他のメンバーにレビューしてもらう事を想定しているのではないかと思います
![GitLab30.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/5c4530f7-3fd4-570a-3961-27ff52f2612e.png)
「マージ」が押せるようになった状態で、「マージ」をクリックしましたところ、以下の画面に切り替わりました。
無事にマージが完了したようです。
![GitLab31.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/30f37bc5-8d68-fe16-28e1-e0fc8dc9d059.png)
マスターブランチ内のファイルを開くと、先程競合の解消を行った際に編集した内容が反映されています。
![GitLab32.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/0ef554e0-c8f0-904f-750a-850cdba4bf21.png)
以上で競合の解消は完了となります。 

今回でGitLabのプロジェクトの基本的な使い方は一旦終了となります。
次回はLFSについて学習しようと思います。