連載
» 2016年07月14日 05時00分 UPDATE

こっそり始めるGit/GitHub超入門(4):Gitでコンフリクトしても慌てるな!! 解消に向けた3つの基本作業 (1/2)

本連載では、バージョン管理システム「Git」とGitのホスティングサービスの1つ「GitHub」を使うために必要な知識を基礎から解説していきます。今回は、意図的にコンフリクトが起こるような操作を行って、コンフリクトが起こったときの対処方法を図を交えて説明します。

[平屋真吾,クラスメソッド]

実際の開発では変更内容がコンフリクトしてしまう場合がある!

 本連載「こっそり始めるGit/GitHub超入門」では、バージョン管理システムGit」とGitのホスティングサービスの1つ「GitHub」を使うために必要な知識を基礎から解説していきます。具体的な操作を交えながら解説していきますので、本連載を最後まで読み終える頃には、GitやGitHubの基本的な操作が身に付いた状態になっていると思います。

 連載第4回目の本稿のテーマは「コンフリクトが発生したときの対処方法」です。

 前回の「ポインタ嫌いでも分かるGitブランチの基本――作成、確認、切り替え、masterにマージ、削除」までで「ブランチ作成」から「マージ」までの一連の操作を行いました。前回行った一連の操作では片方の「second」ブランチだけで変更を進めたので、変更内容が複数ブランチ間で「コンフリクト(衝突、競合)」することなく簡単にマージできました。しかし、実際の開発では変更内容がコンフリクトしてしまう場合があります。

 今回は、意図的にコンフリクトが起こるような操作を行って、コンフリクトが起こったときの対処方法を説明します。

コンフリクトが発生したときに行う3ステップ

 コンフリクトが発生したときに行う基本作業をまとめますと、以下のようになります。「1」の作業は特殊ですが、「2」と「3」は通常のGitの基本作業と同じです。

  1. コンフリクトが発生している箇所を確認して対処する
  2. 「git add」コマンドを実行する
  3. 「git commit」コマンドを実行する


【準備1】新たなブランチの作成とファイル変更

 前回作業を終えた時点では、「second」ブランチを削除して「master」ブランチだけが存在しています。カレントブランチも「master」ブランチです。

$ git branch
* master
前回の作業を終えた状態(前回図8の再掲)

「git checkout -b」コマンドで「ブランチの作成」と「ブランチの切り替え」を同時に

 この状態で新たにブランチを作成します。前回「second」ブランチまで作っていたので、新たなブランチは「third」とします。

 「git checkout -b {新規作成するブランチ名}」コマンドを使用すれば、「ブランチの作成」と「ブランチの切り替え」を同時に行えます。

 今回はブランチ作成と切り替えを同時に行ってみます。

$ git checkout -b third
Switched to a new branch 'third'
$ git branch
  master
* third

 「third」ブランチが作成され、カレントブランチが「third」ブランチになりました。

図1 「third」が作成され「HEAD」が「third」を指すようになった状態

「third」ブランチでのファイル変更

 ここで、hello.txtの中身を確認してみます。3行表示されます。

$ cat hello.txt
Hello
goodbye
konnichiwa

 「hello.txt」ファイルにさらに1行追加し、コミットします。

$ echo sayounara >> hello.txt
$ git add hello.txt
$ git commit -m "add sayounara to hello.txt"
[third b6d5577] add sayounara to hello.txt
 1 file changed, 1 insertion(+)
$ git status
On branch third
nothing to commit, working directory clean

 4行目が追加されました。

$ cat hello.txt
Hello
goodbye
konnichiwa
sayounara
図2 コミット後、「third」が4つ目のコミットを指している状態

【準備2】「master」ブランチでのファイル変更

「master」ブランチへの切り替え

 再びmasterブランチに戻ります。

$ git checkout master
Switched to branch 'master'
$ git branch
* master
  third

 ここで、hello.txtの中身を確認してみます。3行のままです。

$ cat hello.txt
Hello
goodbye
konnichiwa
図3 「HEAD」の向き先が「master」になった状態

「master」ブランチでのファイル変更

 「『third』ブランチでのファイル変更」で追加した文字列とは別の文字列を追加し、コミットします。

$ echo konbanwa >> hello.txt
$ git add hello.txt
$ git commit -m "add konbanwa to hello.txt"
[master ad169d4] add konbanwa to hello.txt
 1 file changed, 1 insertion(+)
$ git status
On branch master
nothing to commit, working directory clean

 4行目が追加されました。

$ cat hello.txt
Hello
goodbye
konnichiwa
konbanwa
図4 コミット履歴が2つに分岐した状態

【準備3】今回作成したブランチを「master」ブランチにマージしてコンフリクトを起こす

 今回新たに作成した「third」ブランチで行った変更を「master」ブランチにマージしましょう。「git merge」コマンドを使用します。

$ git merge third
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.

 予想通り、hello.txtの変更がコンフリクトしました。「自動マージが失敗しました」というメッセージが表示されています。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。