【Git・GitHub操作ガイド】第2章 ブランチ・マージ関連:ブランチを使った並行作業

本記事の目的

本記事は、バージョン管理システムGitと、コラボレーションプラットフォームGitHubを、体系的に学び、実践的に使いこなすためのガイドです。
あなたがGitユーザーとして、チームの生産性とコードの品質を牽引できる、信頼される開発者へと成長することができる情報を提供します。


実際の開発では「新しい機能を試したい」「急なバグ修正をしなければならない」といった複数の作業を同時に進める場面が頻繁にあります。

この章で学ぶ「ブランチ」は、そうした並行作業を安全かつ効率的に行うための、Gitにおける重要な機能です。
メインの履歴から分岐(ブランチ)させることで、他の作業に影響を与えることなく、独立した環境で自由に作業を進めることができます。


目次


対象読者

本書は、以下のような幅広い読者を対象としています。

  • GitやGitHubをこれから学びたい、あるいは学び始めたばかりの学生や初学者の方
  • 黒い画面(ターミナル)に抵抗がある方でも、一つひとつのコマンドの意味と目的を理解しながら、着実にステップアップできます。
  • 自己流でGitを使ってきたが、チーム開発の経験は浅いエンジニアの方
  • Pull Requestの作成、コードレビュー、コンフリクトの解決といった、共同作業で必須となる作法を体系的に学び直したい方に最適です。
  • GitHubの便利な機能を使いこなし、開発プロセスを改善したい中級者の方
  • GitHub ActionsによるCI/CDの構築、セキュリティ機能の導入、CODEOWNERSによる責任範囲の明確化など、チームの生産性と安全性を向上させるための具体的な手法を学べます。
  • エンジニアと協業する非エンジニア職(デザイナー、プロジェクトマネージャー、テクニカルライター等)の方
  • 開発チームがどのようなツールとプロセスで仕事を進めているのかを理解し、より円滑なコミュニケーションとコラボレーションを実現するための知識を得られます。


操作の概要

ブランチを使った、開発の流れは以下のようになります。

ブランチを使った開発の流れ
  1. 基準となるブランチ(例: main)から、作業用の新しいブランチを作成する。
    例:「ログイン機能開発ブランチ」「バグ修正ブランチ」など。
  2. 作成したブランチに切り替えて、作業(コミット)を進める。
    この間、mainブランチには一切影響がありません。
  3. 作業が完了したら、その成果をmainブランチに統合(マージ)する。
    これにより、mainブランチが新機能や修正が取り込まれます。
  4. 役目を終えた作業用ブランチは削除する。

このサイクルを繰り返すことで、メインのブランチを常に安定した状態に保ちながら、複数の開発を安全に進めることができます。


コマンドごとの利用事例と実行手順

1. git branch <name> / git switch -c <name>:ブランチを作成する

概要

現在のコミット位置から、新しい作業履歴の分岐点(ブランチ)を作成します。
特にgit switch -c <name>は、ブランチの作成と、そのブランチへの切り替えを一度にやってくれる便利なコマンドです。

コマンド

利用事例

  • 新しい機能「feature/user-profile」の開発に着手する。
  • 緊急のバグ「hotfix/login-bug」を修正する必要がある。
ブランチの作成イメージ

実行手順

mainブランチにいることを確認してから、新しいブランチを作成・移動します。

# (推奨) 'feature/add-login' という名前のブランチを作成しそこへ移動する
git switch -c feature/add-login

# 従来の方法ブランチ作成と移動を別々に行う
# 'feature/add-login' ブランチを作成
git branch feature/add-login
# 作成したブランチへ移動
git switch feature/add-login

実行例

コマンドの実行例:ブランチの作成と移動

hogehoge@mac hello-world % git switch -c feature/add-login
Switched to a new branch 'feature/add-login'

これで、あなたはfeature/add-loginという新しい作業部屋に入ることができるようになりました。ここでのコミットはmainブランチには影響しませんので、安心して作業してください。


2. git switch <name>:ブランチを切り替える

概要

現在作業しているブランチから、別の既存ブランチへ移動します。作業部屋を移動するイメージです。

コマンド

利用事例

  • feature/add-loginでの作業を一旦中断し、mainブランチの最新の状態を確認したい。
ブランチの切り替えイメージ

実行手順

# mainブランチへ移動する
git switch main

# 再び作業ブランチへ戻る
git switch feature/add-login

実行例

コマンドの実行例:ブランチの作成と移動

hogehoge@mac hello-world % git switch main
M README.md
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
hogehoge@mac hello-world % git switch feature/add-login 
M README.md
Switched to branch 'feature/add-login'
hogehoge@mac hello-world %

注意点

コミットしていない変更が残っている状態では、ブランチを切り替えられないことがあります。その場合は、git stashを使うか、変更をコミットしてから切り替えましょう。


3. git merge <branch>:ブランチを統合する

概要

あるブランチで行った変更の歴史を、現在いるブランチにすべて取り込み、一つにまとめます。

コマンド

利用事例

  • feature/add-loginブランチでの開発が完了したので、その成果をmainブランチに反映させたい。
ブランチの統合イメージ

実行手順

  1. まず、取り込み先となるブランチ(main)に移動します。
git switch main
  1. 次に、取り込みたいブランチ(feature/add-login)を指定してgit mergeを実行します。
git merge feature/add-login
  1. これでfeature/add-loginで行われたすべてのコミットがmainブランチに統合されました。
  2. 最後に、不要になった作業ブランチを削除します。
git branch -d feature/add-login

実行例

コマンドの実行例:ローカルブランチでの変更とマージ

# mainブランチ初期状態
hogehoge@mac hello-world % ls -la
total 16
drwxr-xr-x   5 hogehoge  staff  160 Sep  8 00:49 .
drwxr-xr-x   4 hogehoge  staff  128 Sep  6 18:12 ..
drwxr-xr-x  13 hogehoge  staff  416 Sep  8 00:50 .git
-rw-r--r--   1 hogehoge  staff   70 Sep  8 00:49 README.md
hogehoge@mac hello-world % ls
README.md index.html

# feature/add-loginブランチへの切り替え
hogehoge@mac hello-world % git switch feature/add-login
Switched to branch 'feature/add-login'

# ファイルの編集
hogehoge@mac hello-world % git status
On branch feature/add-login
nothing to commit, working tree clean
hogehoge@mac hello-world % vi README.md 

# ステータス確認
hogehoge@mac hello-world % git status  
On branch feature/add-login
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:   README.md

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

# 差分確認
hogehoge@mac hello-world % git diff    
**diff --git a/README.md b/README.md**
**index c54944b..7495d7f 100644**
**--- a/README.md**
**+++ b/README.md**
@@ -1 +1,2 @@
 # My First GitHub Repository
+add second line

# 変更のステージング
hogehoge@mac hello-world % git add README.md 
hogehoge@mac hello-world % git diff         
hogehoge@mac hello-world % git diff --staged
**diff --git a/README.md b/README.md**
**index c54944b..7495d7f 100644**
**--- a/README.md**
**+++ b/README.md**
@@ -1 +1,2 @@
 # My First GitHub Repository
+add second line
hogehoge@mac hello-world % git commit -m "docs: update README.md"
[feature/add-login 0a344a3] docs: update README.md
 1 file changed, 1 insertion(+)
hogehoge@mac hello-world % git diff --staged                     

# mainブランチへの切り替え
hogehoge@mac hello-world % git switch main
Switched to branch 'main'
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

# mainブランチへfeature/add-loginブランチをマージ
hogehoge@mac hello-world % git merge feature/add-login
Updating 462a977..0a344a3
Fast-forward
 README.md  | 4 +---
 1 files changed, 1 insertion(+), 3 deletions(-)
hogehoge@mac hello-world % ls -la
total 8
drwxr-xr-x   4 hogehoge  staff  128 Sep  8 00:57 .
drwxr-xr-x   4 hogehoge  staff  128 Sep  6 18:12 ..
drwxr-xr-x  14 hogehoge  staff  448 Sep  8 00:57 .git
-rw-r--r--   1 hogehoge  staff   45 Sep  8 00:57 README.md

# mainブランチに変更がないことを確認
hogehoge@mac hello-world % git diff                              
hogehoge@mac hello-world % git diff --staged                     

# マージされていることをgitログで確認
hogehoge@mac hello-world % git log --oneline 
0a344a3 (**HEAD** -> **main**, **feature/add-login**) docs: update README.md
19f8f2f (**origin/main**, **origin/HEAD**) Revert "feat: Add initial index file and Update README file"
462a977 feat: Add initial index file and Update README file
97aea68 Initial commit

# feature/add-loginブランチの削除
hogehoge@mac hello-world % git branch -d feature/add-login
Deleted branch feature/add-login (was 0a344a3).
hogehoge@mac hello-world %


4. git merge:マージコンフリクト(競合)の解決

概要

マージしようとした複数のブランチで、同じファイルの同じ行が別々に変更されていた場合、Gitはどちらの変更を優先すべきか判断できず、コンフリクト(競合)を報告してマージを中断します。これを解決するのは、開発者の役割です。

コマンド

利用事例

マージしようとした複数のブランチで、同じファイルの同じ行が別々に変更されていたので、コンフリクトを解消してマージしたい。

コンフリクトの解決イメージ

実行手順

  1. git mergeを実行すると、コンフリクトが発生した旨のメッセージが表示されます。
  2. git statusを実行すると、どのファイルでコンフリクトが発生しているか確認できます。
  3. 該当ファイルをテキストエディタで開くと、以下のような特殊なマーカーで競合箇所が示されています。
<<<<<<< HEAD
ここに現在のブランチ(main)での変更内容が表示されます
=======
ここにマージしようとしたブランチ(feature/add-login)での変更内容が表示されます
>>>>>>> feature/add-login
  1. 開発者はこのマーカーとコードを見比べ、最終的にどちらのコードを残すか(あるいは両方を組み合わせるか)を判断し、手動でファイルを編集します。マーカー(<<<<<<<, =======, >>>>>>>)も忘れずに削除してください。
  2. 修正が完了したら、ファイルを保存し、git addで解決したことをGitに伝えます。
git add conflicted-file.txt
  1. 最後に、git commitを実行してマージを完了させます。(コミットメッセージは自動で用意されています)

実行例

コマンドの実行例:マージでのコンフリクト

hogehoge@mac hello-world % git merge feature/add-login
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
hogehoge@mac hello-world %

コマンドの実行例:コンフリクトしたファイル(README.md)の確認

<<<<<<< HEAD
# My First Git?Hub Repository
=======
# My First Git/Hub Repository
>>>>>>> feature/add-login
add second line

コマンドの実行例:コンフリクトしたファイル(README.md)を編集し内容を確定

# My First Git/Hub Repository
add second line

コマンドの実行例:編集したファイルをコミット

hogehoge@mac hello-world % git add README.md 
hogehoge@mac hello-world % git status                 
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
modified:   README.md

hogehoge@mac hello-world % git commit -m "fix:conflict"
[main 6e4ce3b] fix:conflict


5. git rebase <branch>:履歴を一直線に整える

概要

mergeが「合流」のイメージなら、rebaseは「付け替え」のイメージです。作業ブランチの根元を、指定したブランチの最新地点に移動させ、コミット履歴を一直線に綺麗に見せることができます。

mergeの場合(合流)

mergeイメージ

rebaseの場合(付け替え)

rebaseを実行すると、コミット履歴が一直線になるように付け替えられます。

実行前:

rebase実行前イメージ

実行後:

rebase実行後イメージ

コマンド

利用事例

  • mainブランチの履歴が汚れないように、作業ブランチの履歴を綺麗に整えてからマージしたい。

注意点

GitHubなどで既に他の人と共有しているブランチに対してrebaseを実行してはいけません。 履歴を書き換える強力な操作のため、他の人の履歴と食い違い(コンフリクト)を生み出す原因となります。個人の作業ブランチでのみ利用するのが原則です。


6. git cherry-pick <sha>:特定のコミットだけを適用する

概要

他のブランチにある、特定のコミット1つだけを「つまみ食い」して、現在のブランチにコピーするコマンドです。コミットを識別するためのID(SHA、git logで確認できる長い英数字)を指定します。

コマンド

利用事例

  • ある開発ブランチで行ったバグ修正コミットが、緊急でmainブランチにも必要になった。

cherry-pickを実行すると、以下のようにfeatureブランチにある「バグ修正」のコミットがコピーされ、mainブランチの先頭に適用されます。

cherry-pickのイメージ

実行手順

  1. まず、取り込みたいコミットのID(SHA)を、featureブランチのログで確認します。
    bash # featureブランチに移動 git switch feature # ログを表示 git log # commit 5a3f8b... Author: ... <- このIDをコピーする
  2. 次に、適用先となるmainブランチに移動します。
    bash git switch main
  3. git cherry-pickコマンドで、先ほどコピーしたコミットIDを指定します。
    bash git cherry-pick 5a3f8b
  4. これで、mainブランチに指定したコミットだけが適用されました。

実行例

コマンドの実行例:feature/cherry-pickブランチから指定したコミットを取得

README.md(feature/cherry-pickブランチ)

# My First GitHub Repository
add second line
add third line
add fourth line
add fifth line

git log –oneline(feature/cherry-pickブランチ)

193b0cd (**HEAD** -> **feature/cherry-pick**) upd:add fifth line
360aefd upd:add 4th line
ac1b2fb upd:add 3rd line
0a344a3 (**origin/main**, **origin/HEAD**, **main**) docs: update README.md
19f8f2f Revert "feat: Add initial index file and Update README file"
462a977 feat: Add initial index file and Update README file
97aea68 Initial commit
hogehoge@mac hello-world %

README.md(mainブランチ)

# My First GitHub Repository
add second line

git cherry-pick(mainブランチ)

hogehoge@mac hello-world % git switch main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
hogehoge@mac hello-world % git cherry-pick ac1b2fb
[main 1e0cd76] upd:add 3rd line
 Date: Mon Sep 8 18:27:00 2025 +0900
 1 file changed, 1 insertion(+)

README.md(mainブランチ)

# My First GitHub Repository
add second line
add third line


7. git revert <sha>:コミットを打ち消す

概要

指定したコミットの変更内容を、完全に打ち消す効果を持つ新しいコミットを作成します。履歴を削除するのではなく、上書き修正するので、安全に変更を元に戻すことができます。

コマンド

利用事例

  • リリースした機能に問題が見つかったため、その機能を追加したコミットを安全に取り消したい。
revertのイメージ

実行手順

  1. まず、打ち消したいコミットのID(SHA)をログで確認します。
    bash git log # commit 3c8b2d... Author: ... <- この「問題のある機能B」のIDをコピー
  2. git revertコマンドで、そのコミットIDを指定します。
    bash git revert 3c8b2d
  3. コマンドを実行すると、自動的にコミットメッセージが入力された状態でテキストエディタが開きます。内容を確認し、そのまま保存してエディタを閉じます。
  4. これで、指定したコミットの変更を打ち消す、新しいコミットが作成されました。履歴は上書きされず、安全に変更が取り消されます。

実行例

コマンドの実行例:feature/cherry-pickブランチから指定したコミットを取り消し

README.md(feature/cherry-pickブランチ)

# My First GitHub Repository
add second line
add third line
add fourth line
add fifth line

git log –oneline(feature/cherry-pickブランチ)

hogehoge@mac hello-world % git log --oneline      
193b0cd (**HEAD** -> **feature/cherry-pick**) upd:add fifth line
360aefd upd:add 4th line
ac1b2fb upd:add 3rd line
0a344a3 (**origin/main**, **origin/HEAD**) docs: update README.md
19f8f2f Revert "feat: Add initial index file and Update README file"
462a977 feat: Add initial index file and Update README file
97aea68 Initial commit
hogehoge@mac hello-world %

git revert(feature/cherry-pickブランチ)

hogehoge@mac hello-world % git revert 193b0cd          
[feature/cherry-pick b0d07f3] Revert "upd:add fifth line"
 1 file changed, 1 deletion(-)
hogehoge@mac hello-world %

git revertコマンドで作成されたコミットメッセージ

Revert "upd:add fifth line"

This reverts commit 193b0cde8e5e9eec4f3974a790145b3ced3a2e6f.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch feature/cherry-pick
# Changes to be committed:
#       modified:   README.md
#

README.md(feature/cherry-pickブランチ)

# My First GitHub Repository
add second line
add third line
add fourth line


参考資料


まとめ

ブランチは少し複雑に感じるかもしれませんが、使いこなせれば開発効率が向上します。
まずはswitch -cmerge、そしてコンフリクト解決の流れをしっかりマスターしましょう!

さあ、あなたのMacを快適な開発環境にしましょう!!

SNSでもご購読できます。

コメントを残す

*