ここから本文です

こっそり始めるGit/GitHub超入門(4)

@IT 7月14日(木)6時10分配信

 本連載「こっそり始める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

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

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

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

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

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

 「third」ブランチが作成され、カレントブランチが「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】「master」ブランチでのファイル変更

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

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

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

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

$ cat hello.txt
Hello
goodbye
konnichiwa

○「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

●【準備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の変更がコンフリクトしました。「自動マージが失敗しました」というメッセージが表示されています。

●コンフリクトを解消する3ステップの実践

【ステップ1】コンフリクト発生箇所の確認

 hello.txtファイルを任意のエディタで開くと、以下のようになっています。

Hello
goodbye
konnichiwa
<<<<<<< HEAD
konbanwa
=======
sayounara
>>>>>>> third

 4~6行目の間が、マージした時のカレントブランチの内容です。また、6~8行目の間が「third」ブランチ(マージ元のブランチ)の内容です。「どちらを残すのか」または「どちらも残すのか」を決めなければなりません。

 ここでは、どちらも残すことにします。任意のエディタ上で4、6、8行目を削除し保存します。

Hello
goodbye
konnichiwa
konbanwa
sayounara

●【ステップ2】「git status」コマンドと「git add」コマンド

 ここで「git status」コマンドを実行すると以下のようなメッセージが表示されます。「Unmerged paths」項目を見ると、「解決済みにするにはgit addコマンドを使用せよ」と書いてあります。

$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")

Unmerged paths:
(use "git add <file>..." to mark resolution)

both modified: hello.txt

no changes added to commit (use "git add" and/or "git commit -a")


 「git add」コマンドを実行します。

$ git add hello.txt
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)

Changes to be committed:

modified: hello.txt


 hello.txtファイルをコミットできるようになりました。

●【ステップ3】「git commit」コマンド

 「git commit」コマンドを実行します。

$ git commit
[master da212e1] Merge branch 'third'
$ git status
On branch master
nothing to commit, working directory clean

 作業ディレクトリがクリーンな状態に戻りました。

○コンフリクトが解消されたか確認

 最後に「git log --oneline --decorate」コマンドを実行してみます。

$ git log --oneline --decorate
da212e1 (HEAD -> master) Merge branch 'third'
ad169d4 add konbanwa to hello.txt
b6d5577 (third) add sayounara to hello.txt
d90401a add konnichiwa to hello.txt
8a0afb3 edit hello.txt
8d7430a first commit

 「third」と「master」ブランチで行った変更を統合する操作は、以上で完了です。「third」ブランチは不要になったので削除できます。

●本記事で初めて登場したGitのコマンド

 本記事では「コンフリクトが発生したときの対処方法」について解説しました。

 本記事で初めて登場したGitのコマンドは以下の通りです。

・git checkout -b {新規作成するブランチ名}:「ブランチの作成」と「ブランチの切り替え」を同時に行う

 次回は、前回と今回で紹介できなかった「ブランチ」の他の機能について解説する予定です。お楽しみに!

参考書籍
・『Pro Git』(written by Scott Chacon and Ben Straub and published by Apress)

●著者紹介 平屋真吾:クラスメソッド株式会社 iPhoneアプリサービス事業部所属のプログラマーです。iOSアプリの開発がメインですが、デザインやAWSなども勉強中です。ブログ:http://dev.classmethod.jp/author/hiraya-shingo/

最終更新:7月14日(木)6時10分

@IT

TEDカンファレンスのプレゼンテーション動画

暗闇で光るサメと驚くほど美しい海洋生物たち
波のほんの数メートル下で、海洋生物学者であり、ナショナルジオグラフィックのエクスプローラーかつ写真家のデビッド・グルーバーは、素晴らしいものを発見しました。海の薄暗い青い光の中で様々な色の蛍光を発する驚くべき新しい海洋生物たちです。彼と一緒に生体蛍光のサメ、タツノオトシゴ、ウミガメ、その他の海洋生物を探し求める旅に出て、この光る生物たちがどのように私たちの脳への新たな理解を明らかにしたのかを探りましょう。[new]