Git mergeの基本|ブランチの変更を安全にmainへ統合する方法

「Git mergeの基本|ブランチの変更を安全にmainへ統合する方法」の内容を表す技術イラスト
目次

Git mergeとは

Gitでは、機能追加や修正をmainとは別のbranchで進め、作業が完了したらその変更をmainへ統合できます。この「別の開発履歴を現在のbranchへ取り込む」操作が git merge です。

最初に覚えておきたい重要な原則は、mergeは「現在いるbranch」に「指定したbranch」を取り込む操作だということです。

たとえば、feature-demo の変更を main へ取り込みたい場合は、先に main へ移動してから次を実行します。

git switch main
git merge feature-demo

git merge feature-demo を実行したとき、取り込み先は main、取り込み元は feature-demo です。逆のbranchにいる状態で実行すると、意図と逆方向のmergeになるため注意します。

merge前に状態を確認する

merge前には、まず現在のbranchと作業ツリーの状態を確認します。

git status
git branch

Git公式ドキュメントでも、merge前には自分の作業を整理し、基本的にはcommit済みの状態にしておくことが推奨されています。未commit変更がmerge対象と重なる場合、Gitはmergeを停止します。

安全な学習手順では、次の状態を確認してからmergeします。

  • 取り込み先branchにいる
  • 必要な変更がcommitされている
  • git status で意図しない変更が残っていない

branchを作って変更する

例として、mainから feature-demo branchを作ります。

git switch main
git switch -c feature-demo

ファイルを変更したら状態を確認します。

git status

変更をstageし、commitします。

git add .
git commit -m "Add demo change"

ここまでで、feature-demo にだけ新しいcommitが存在する状態になります。

mainへmergeする

変更をmainへ取り込むには、まずmainへ戻ります。

git switch main

状態を確認します。

git status

問題がなければ、feature-demoをmergeします。

git merge feature-demo

merge後は必ず結果を確認します。

git status
git log --oneline --graph --decorate --all

git status は現在の作業状態、git log --graph はbranchとcommitの履歴構造を確認するために使えます。

fast-forwardとは

mainからfeature-demoを作ったあと、main側に新しいcommitが増えていない場合を考えます。

A---B  main
     \
      C  feature-demo

この場合、mainはfeature-demoの履歴上にそのまま進むことができます。

git switch main
git merge feature-demo

すると概念的には次の状態になります。

A---B---C  main, feature-demo

Git公式ドキュメントでは、このように現在のbranchの先端が取り込み元commitの祖先である場合、新しいmerge commitを作らずbranchポインタを進める動作をfast-forwardと説明しています。

つまりfast-forwardでは、merge操作は行われていますが、merge専用の新しいcommitは作られません。

merge commitとは

branchを分けたあと、main側にもfeature側にも別々のcommitが追加された場合は履歴が分岐します。

      C---D  feature-demo
     /
A---B---E    main

この状態でmainからfeature-demoをmergeすると、単純にmainのポインタを前へ進めるだけでは両方の履歴を表現できません。

競合せず自動統合できれば、Gitは両方の履歴を親として持つmerge commitを作成します。

      C---D
     /     \
A---B---E---M  main

この M がmerge commitです。

初学者の段階では、次の区別で十分です。

  • fast-forward:履歴が一直線なのでbranchポインタを前へ進められる
  • merge commit:履歴が分岐しているため、両方を結ぶ新しいcommitを作る

merge後は履歴を図で確認する

mergeはコマンドが成功しただけで終わりにせず、履歴を確認すると理解しやすくなります。

git log --oneline --graph --decorate --all

fast-forwardなら履歴はほぼ一直線に見えます。merge commitが作られた場合はbranchが分岐し、再び合流する形が表示されます。

この表示を毎回見る習慣をつけると、「今どのbranchにいて、どのcommitがどこへ統合されたのか」を理解しやすくなります。

mergeがうまくいかないとき

最初に確認するコマンドは次の2つです。

git status
git log --oneline --graph --decorate --all

git status では、未commit変更、merge途中の状態、競合ファイルなどを確認できます。

履歴の関係が分からなくなった場合は git log --graph でbranchの位置関係を確認します。

merge conflictが発生した場合は、Gitは自動で統合できなかった箇所を残して停止します。これはmergeそのものの失敗ではなく、人間による判断が必要な状態です。conflictの詳細な解消方法は別テーマとして扱います。

複雑な競合が発生し、merge開始前へ戻したい場合には次のコマンドがあります。

git merge --abort

ただし、merge開始前から複雑な未commit変更があると元の状態を完全に再構成できない場合があるため、やはりmerge前に作業状態を整理しておくことが重要です。

安全なmergeの基本手順

基本形は次の流れです。

git switch main
git status
git merge feature-demo
git status
git log --oneline --graph --decorate --all

ポイントは、mergeコマンドそのものよりも、merge前後の状態確認をセットにすることです。

Gitではbranchを自由に作成できますが、どのbranchへ何を取り込んだかを理解できなければ履歴管理の意味が薄れます。git status と git log --graph を組み合わせることで、mergeを「なんとなく成功した操作」ではなく、確認可能な履歴操作として扱えます。

まとめ

git merge は、指定したbranchの変更を現在のbranchへ統合するコマンドです。

まずは次の3点を押さえれば十分です。

  1. 取り込み先branchへ先に移動する
  2. git merge <取り込み元branch> を実行する
  3. git status と git log --graph で結果を確認する

さらに、履歴が一直線ならfast-forward、履歴が分岐していればmerge commitが必要になる場合がある、と理解しておくとGitの履歴構造が見えやすくなります。

branchは作業を分離する仕組み、mergeは分離した作業を再び統合する仕組みです。この2つをセットで理解すると、mainを直接編集し続ける運用から、安全に変更を分離・検証・統合するGit運用へ進めます。

参考資料

参考になったらシェアしてください
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

機械設計・油圧・CAD・Python・AIなど、ものづくりに関わる技術を扱っています。工学知識を整理・構造化し、設計や自動化に再利用できる形へ変えていくことを目指しています。

目次