Gitで安全に統合作業!マージとコンフリクト解消の基本を身につけよう【Git】

  • LINEで送る
Gitで安全に統合作業!マージとコンフリクト解消の基本を身につけよう【Git】

 ブランチで分けた作業を最後に「ひとつにまとめる」作業、それが「マージ(merge)」です。 しかし、うまくいかないと「コンフリクト(衝突)」が発生することも。この章では、マージの基本から、もしコンフリクトしたときの対処法まで丁寧に解説します。

git merge:変更をひとつに統合する

git merge ブランチ名

 git merge は、別のブランチで行った変更を現在のブランチに取り込む操作です。これにより、複数人が分担して行った作業や、異なる機能ごとのブランチが1つにまとまり、最終的な成果物として完成に近づけることができます。

  • 現在のブランチがマージ先になります。間違えて意図しないブランチで merge を行うと、統合先がズレてしまうので注意しましょう。
  • 通常のマージでは、git commit を手動で行う必要はありません。Gitが自動で「マージコミット」を作成します。

実際に、下記の手順で「git merge」コマンドを利用してみましょう。

手順作業ブランチ動作
1main適当なフォルダ内で「git init」を実行してgit管理のフォルダにする
※「git-sample」フォルダを作成
2main「git-sample」内に適当なファイルを作る
※「memo.txt」のファイルを作成
3main「git add」と「git commit」を行なって「memo.txt」のファイルをmainの履歴に登録する
4maindevelopcheckout
5develop「memo.txt」のファイルに適当な文字列を追加
6develop「git add」と「git commit」を行なって「memo.txt」のファイルの修正をdevelopの履歴に登録する
7developmaincheckout
8maingit merge developでdevelopの修正をmainに取り込んでマージする

コマンドでは下記のようになります。

# 現在のブランチがmainであることを確認
git-sample % git branch
* main

# mainのmemo.txtの中身を表示
git-sample % cat memo.txt
こんにちは。tamotechさん

# developブランチを作成後、チェックアウト
git-sample % git checkout -b develop
Switched to a new branch 'develop'

# ここでdevelop上のmemo.txtを編集
git-sample % open memo.txt 
# developの修正後のmemo.txt を表示
git-sample % cat memo.txt
こんにちは。tamotechさん
今日も素晴らしい1日ですね。

# developのstatusを確認
git-sample % git status
On branch develop
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   memo.txt

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

# addとcommit
git-sample % git add memo.txt
git-sample % git commit -m "memo.txtの修正"
[develop 737f215] memo.txtの修正
 1 file changed, 1 insertion(+)

#  mainにcheckout
% git checkout main
Switched to branch 'main'

# developをmainにマージ
git-sample % git merge develop
Updating faa0d51..737f215
Fast-forward
 memo.txt | 1 +
 1 file changed, 1 insertion(+)

# mainブランチのmemo.txtが修正されていることを確認
git-sample % cat memo.txt
こんにちは。tamotechさん
今日も素晴らしい1日ですね。
git-sample % 

回りくどいことをやっていますが、非常に重要な操作です。しっかり理解しておきましょう。

コンフリクトとは?

 コンフリクト(conflict)とは、マージを行った際に、同じファイルの同じ箇所が別々のブランチで異なる内容に変更されていた場合に発生する衝突です。

 Gitは通常、異なるファイルや異なる行の変更は自動的に統合できますが、同じ行に対して複数の変更がある場合は、どちらの内容を採用すべきか判断できません。 その結果として、開発者が手動で修正する「コンフリクト解消」が必要になります。

  • 同じファイルでも「異なる行」の変更であればコンフリクトしないことが多い
  • 「同じ行」を複数のブランチで書き換えるとコンフリクトする可能性が高い
コンフリクトの発生シナリオ

 では実際にコンフリクトを起こして修正してみましょう。先ほどの「git-sample」の「memo.txt」を異なるブランチから同時に修正してみます。下記の手順でコンフリクトを発生させます。

手順作業ブランチ動作
1mainfearture1checkout
2fearture1memo.txtを修正する
「今日も素晴らしい1日ですね。」→「今日は大変な1日でした。」
3fearture1「git add」と「git commit」を行なって「memo.txt」のファイルの修正を履歴に登録する
4fearture1maincheckout
5mainfearture2checkout
6fearture2memo.txtを修正する
「今日も素晴らしい1日ですね。」→「明日も素晴らし1日になるでしょう」
7fearture2「git add」と「git commit」を行なって「memo.txt」のファイルの修正を履歴に登録する
8fearture2maincheckout
9mainfearture1をマージ
10mainfearture2をマージ
11main⚠️⚠️⚠️⚠️⚠️コンフリクト発生!!⚠️⚠️⚠️⚠️⚠️
12mainコンフリクトしたmemo.txtを修正する
13main「git add」と「git commit」を行なって「memo.txt」のファイルの修正を履歴に登録する
こんにちは。tamotechさん
<<<<<<< HEAD
今日は大変な1日でした。
=======
明日も素晴らし1日になるでしょう
>>>>>>> feature2

 上記の手順でコンフリクトを発生させるとmainブランチでのmemo.txtは上記のような表示になります。HEAD(現在のブランチの行)とfeature2で変更された行が表示されます。必要な部分は残しておいて、不要なものは削除して修正しましょう。

解消方法の概要:

  • 上記の区切り記号(<<<<<<<, =======, >>>>>>>)を削除
  • 採用したい内容を残して保存
  • 修正したファイルを git add してから git commit

💡 コンフリクトはあくまで「人間の判断が必要な状態」であり、Gitのエラーではありません。チーム開発では日常的に起こるため、落ち着いて対処すれば問題ありません。

🚫 注意!この記事ではあえて main でコンフリクトを修正していますが、実務では main ブランチに直接マージ&修正は行いません。 feature2にfeature1またはmainの修正をとりんでから、feature2の修正をmainにマージしましょう。

マージせずにブランチを戻したいとき

git merge --abort

マージを途中でやめたいときに使うのが git merge --abort です。

 これは、マージ中にコンフリクトが発生した場合に限り有効で、マージ前の状態にロールバック(元に戻す)してくれます。

主な使いどころ:

  • コンフリクトが複雑で一旦やり直したい
  • 間違って違うブランチをマージしようとしてしまった

⚠️ 注意:--abort は「マージを開始したけれどまだ完了していない」状態でのみ使えます。 コミットまで終わった後には使えません。

まとめ

  • git merge でブランチを統合できる
  • 編集箇所が重なるとコンフリクトが発生する
  • 落ち着いて修正すれば問題なく解消できる

目次

実務で使えるGit講座 ― 初心者から即戦力まで6ステップ TOP

第1部 Gitの導入と基礎知識

  1. Gitとは? なぜ必要か?
  2. Gitのインストールと初期設定
  3. 最初のGit操作:init / clone / status

第2部 基本操作とローカルでの履歴管理

  1. ファイルの変更を記録:add / commit
  2. 履歴の確認と変更の取り消し:log / diff / restore
  3. Gitの仕組みを理解する(ステージングエリアとは?)

第3部 ブランチとマージの基本

  1. ブランチの概念と作り方
  2. マージとコンフリクト解消
  3. Git Flow・開発ブランチ運用の基本

第4部 GitHubを使ったチーム開発

  1. リモート操作:push / pull / fetch
  2. GitHubとプルリクエストの流れ
  3. チーム運用でのルール作り

第5部 実務で差がつく応用操作

  1. 履歴の書き換え:rebase / amend / stash
  2. タグ・リリースとCI/CDの連携
  3. Gitトラブル対応集(reflog / resetハマり対策)

第6部 GitHub Copilotの活用術

  1. GitHub Copilotとは?できること・できないこと

最新の投稿

SNSでもご購読できます。

コメントを残す