【保存版】Git実務ガイド|ブランチ戦略から失敗時のリカバリまで完全網羅

Others
スポンサーリンク
スポンサーリンク

はじめに

Gitは強力なバージョン管理ツールですが、使い方を間違えると大変なことになります。

この記事では、実務で使えるブランチ戦略から、よくある失敗とそのリカバリ方法まで、完全網羅します。

対象読者:

  • Gitの基本は分かるが、実務での使い方に不安がある方
  • ブランチ戦略を学びたい方
  • 失敗したときの対処法を知りたい方
  • チーム開発でGitを使う予定の方

この記事で分かること:

  • main/develop/feature/* の使い分け
  • 日常的な操作フロー
  • 失敗したときのリカバリ方法
  • 便利なコマンド集

ブランチ戦略の基本

なぜブランチを分けるのか

1つのブランチだけだと:

main
  ├─ 機能Aを開発中
  ├─ 機能Bを開発中
  └─ バグ修正中

→ すべてが混ざって混乱

ブランチを分けると:

main(本番)
  ├─ develop(開発)
  │   ├─ feature/機能A
  │   ├─ feature/機能B
  │   └─ fix/バグ修正
  └─ hotfix/緊急修正

それぞれ独立して作業できる!


Git Flow:最も一般的なブランチ戦略

main(本番環境)
  ├─ 常に安定版
  └─ リリース済みのコード

develop(開発環境)
  ├─ 開発中のコード
  └─ すべての作業の起点

feature/*(機能開発)
  ├─ feature/login
  ├─ feature/payment
  └─ 開発完了後、developにマージ

hotfix/*(緊急修正)
  ├─ hotfix/critical-bug
  └─ 本番の緊急バグ修正

各ブランチの役割

mainブランチ

役割:

  • 本番環境のコード
  • 常に動作する状態
  • リリース済みの確定版

ルール:

  • ❌ 直接編集しない
  • ✅ developまたはhotfixからマージのみ
  • ✅ タグでバージョン管理

例:

main
  ├─ v1.0.0
  ├─ v1.1.0
  └─ v2.0.0

developブランチ

役割:

  • 開発環境のコード
  • すべての機能開発の起点
  • 次のリリース候補

ルール:

  • ✅ feature/* からマージを受け入れる
  • ✅ テスト済みの機能のみマージ
  • ✅ mainより先に進んでいる

イメージ:

develop = main + 開発中の機能

feature/* ブランチ

役割:

  • 個別の機能開発
  • 独立して作業できる
  • 開発完了後、developにマージ

命名規則:

feature/ログイン機能
feature/決済機能
feature/ユーザー管理

ライフサイクル:

1. developから作成
2. 機能開発
3. developにマージ
4. ブランチ削除

hotfix/* ブランチ

役割:

  • 本番の緊急バグ修正
  • mainから直接作成
  • mainとdevelopの両方にマージ

使用タイミング:

本番でバグ発見
  ↓ 緊急修正が必要
hotfix/critical-bug を作成
  ↓ 修正
mainにマージ(本番反映)
  ↓ 同時に
developにもマージ(開発環境にも反映)

基本操作

ブランチの作成と切り替え

新しいブランチを作成して切り替え

git checkout develop
git checkout -b feature/new-function

# または
git switch -c feature/new-function

説明:

  • -b オプションで作成と切り替えを同時に実行
  • switch は新しいGitコマンド(v2.23以降)

既存のブランチに切り替え

# developに切り替え
git checkout develop

# mainに切り替え
git checkout main

ブランチ一覧を確認

# ローカルブランチ一覧
git branch

# 出力例:
  main
* develop  ← *が現在のブランチ
  feature/login

# リモートブランチも含めて表示
git branch -a

# 出力例:
* develop
  main
  remotes/origin/develop
  remotes/origin/main
  remotes/origin/feature/login

コミット

ステージングとコミット

# ファイルをステージング
git add file.txt

# すべてのファイルをステージング
git add .

# コミット
git commit -m "feat: ログイン機能を追加"

コミットメッセージの規約

Conventional Commits:

: 

type:
- feat: 新機能
- fix: バグ修正
- docs: ドキュメント
- style: コードスタイル
- refactor: リファクタリング
- test: テスト
- chore: その他

例:

git commit -m "feat: ユーザー登録機能を追加"
git commit -m "fix: ログインエラーを修正"
git commit -m "docs: READMEを更新"

プッシュ

リモートにプッシュ

# 現在のブランチをリモートにプッシュ
git push origin feature/login

# 初回プッシュ時(追跡ブランチを設定)
git push -u origin feature/login

# 次回以降
git push

-u オプション:

  • upstream(追跡ブランチ)を設定
  • 次回以降は git push だけでOK

マージ

developにマージ

# developに切り替え
git checkout develop

# featureブランチをマージ
git merge feature/login

# 出力例:
Updating abc1234..def5678
Fast-forward
 login.js | 50 +++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

# リモートにプッシュ
git push origin develop

mainにマージ

# mainに切り替え
git checkout main

# developをマージ
git merge develop

# プッシュ
git push origin main

日常的な運用フロー

パターン1:新機能を開発

Step 1:featureブランチを作成

# developから作成
git checkout develop
git pull origin develop  # 最新の状態に更新

# featureブランチ作成
git checkout -b feature/user-profile

Step 2:開発作業

# ファイルを編集
code user-profile.js

# コミット(何度でも)
git add user-profile.js
git commit -m "feat: ユーザープロフィール表示機能"

git add user-profile.css
git commit -m "style: プロフィール画面のスタイル調整"

git add tests/user-profile.test.js
git commit -m "test: ユーザープロフィールのテスト追加"

Step 3:リモートにプッシュ

# 初回
git push -u origin feature/user-profile

# 2回目以降
git push

Step 4:developにマージ

# developに切り替え
git checkout develop

# 最新の状態に更新
git pull origin develop

# featureブランチをマージ
git merge feature/user-profile

# コンフリクトがなければ
git push origin develop

# featureブランチを削除(オプション)
git branch -d feature/user-profile
git push origin --delete feature/user-profile

パターン2:複数の機能を並行開発

# 機能A開発
git checkout develop
git checkout -b feature/function-a
# 開発...
git push origin feature/function-a

# 機能Bも開発したい
git checkout develop  # developに戻る
git checkout -b feature/function-b
# 開発...
git push origin feature/function-b

# 機能Aに戻る
git checkout feature/function-a
# 開発続き...

ポイント:

  • 各機能が独立して開発できる
  • いつでもブランチを切り替えられる

パターン3:mainへのリリース

# developの作業が完了
git checkout main
git pull origin main

# developをマージ
git merge develop

# タグを付ける
git tag -a v1.0.0 -m "バージョン1.0.0リリース"

# プッシュ
git push origin main
git push origin v1.0.0

よくある失敗とリカバリ

失敗1:mainで誤って作業してしまった

状況

# mainブランチにいることに気づかず作業
git add file.txt
git commit -m "機能追加"

# あっ、mainだった!
git branch
# * main  ← まずい!

リカバリ方法A:まだプッシュしていない場合

# コミットを取り消し(変更は残る)
git reset --soft HEAD~1

# developに切り替え
git checkout develop

# 再度コミット
git add file.txt
git commit -m "機能追加"
git push origin develop

reset --soft

  • コミットだけ取り消し
  • ファイルの変更は残る
  • ステージング状態も残る

リカバリ方法B:すでにプッシュしてしまった場合

# developに該当のコミットを持っていく
git checkout develop
git cherry-pick コミットハッシュ
git push origin develop

# mainから削除
git checkout main
git revert コミットハッシュ
git push origin main

cherry-pick

  • 特定のコミットだけを別ブランチに適用

revert

  • コミットを打ち消す新しいコミットを作成
  • 履歴は残る(安全)

失敗2:developとmainがずれてしまった

状況

main: 最新の状態
develop: 古い状態

→ mainで作業してしまった
→ developに反映されていない

リカバリ方法:mainの変更をdevelopにマージ

# developに切り替え
git checkout develop

# mainの変更を取り込む
git merge main

# 出力例:
Updating abc1234..def5678
Fast-forward
 file.txt | 10 ++++++++++
 1 file changed, 10 insertions(+)

# プッシュ
git push origin develop

これで同期完了!


失敗3:コミットメッセージを間違えた

まだプッシュしていない場合

# 最後のコミットメッセージを修正
git commit --amend -m "正しいメッセージ"

すでにプッシュしてしまった場合

# 修正
git commit --amend -m "正しいメッセージ"

# 強制プッシュ(注意!)
git push -f origin feature/my-branch

⚠️ 注意:

  • git push -f は履歴を書き換える
  • チーム開発では使わない(他の人の作業が壊れる)
  • 自分専用のブランチでのみ使用

失敗4:間違ったファイルをコミットしてしまった

まだプッシュしていない場合

# 最後のコミットを取り消し(変更は残る)
git reset --soft HEAD~1

# 正しいファイルだけをステージング
git add correct-file.txt
git commit -m "メッセージ"

# 間違ったファイルは破棄
git checkout -- wrong-file.txt

すでにプッシュしてしまった場合

# ファイルを削除するコミット
git rm wrong-file.txt
git commit -m "不要なファイルを削除"
git push origin feature/my-branch

失敗5:コンフリクトが発生した

状況

git merge feature/function-a

# 出力:
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.

解決手順

1. コンフリクトしているファイルを確認:

git status

# 出力:
Unmerged paths:
  both modified:   file.txt

2. ファイルを開いて編集:

<<<<<<< HEAD
現在のブランチの内容
=======
マージしようとしているブランチの内容
>>>>>>> feature/function-a

どちらを採用するか決める:

# 最終的な内容(コンフリクトマーカーを削除)
採用する内容

3. コミット:

git add file.txt
git commit -m "merge: コンフリクトを解決"

便利なコマンド

空コミット

ファイルを変更せずにコミット:

git commit --allow-empty -m "chore: CI/CDをトリガー"

使用例:

  • CI/CDを再実行したい
  • Git履歴に記録を残したい
  • ファイル変更なしでプッシュしたい

特定のコミットを別ブランチに適用

# コミットハッシュを確認
git log --oneline

# 出力例:
abc1234 feat: 機能追加
def5678 fix: バグ修正

# 別ブランチに切り替え
git checkout target-branch

# 特定のコミットを適用
git cherry-pick abc1234

コミット履歴を確認

# 簡易表示
git log --oneline

# グラフ表示
git log --graph --oneline --all

# 出力例:
* abc1234 (HEAD -> develop) feat: 機能追加
* def5678 (origin/develop) fix: バグ修正
* ghi9012 (main) chore: 初期設定

変更内容を確認

# まだステージングしていない変更
git diff

# ステージング済みの変更
git diff --staged

# ブランチ間の差分
git diff develop..main

変更を一時保存

# 変更を一時保存
git stash

# 別のブランチで作業...

# 変更を復元
git stash pop

# stash一覧
git stash list

使用例:

  • 作業中に別のブランチに切り替える必要がある
  • コミットしたくないが、変更を保存したい

ブランチを削除

# ローカルブランチを削除
git branch -d feature/old-feature

# まだマージしていないブランチを強制削除
git branch -D feature/old-feature

# リモートブランチを削除
git push origin --delete feature/old-feature

GitHub連携

Re-run jobs(GitHub Actions)

GitHub Actions が失敗したときの再実行方法:

方法1:GitHub UIから再実行(推奨)

GitHub → Actions
→ 失敗したWorkflow
→ Re-run jobs
→ Re-run all jobs

メリット:

  • コード変更不要
  • 設定変更後に使う

方法2:空コミット

git commit --allow-empty -m "chore: GitHub Actions再実行"
git push origin main

メリット:

  • Git履歴に記録される
  • コマンドラインで完結

Pull Request(PR)

チーム開発での標準フロー:

Step 1:featureブランチで開発

git checkout -b feature/new-function
# 開発...
git push origin feature/new-function

Step 2:GitHub でPRを作成

GitHub → Pull requests
→ New pull request
→ base: develop ← compare: feature/new-function
→ Create pull request

Step 3:レビュー

チームメンバーがレビュー
→ コメント
→ 承認

Step 4:マージ

Merge pull request
→ Confirm merge
→ Delete branch(オプション)

ベストプラクティス

1. 作業前に必ずブランチ確認

# 習慣化する
git branch

または、プロンプトに表示:

# ~/.bashrc に追加
parse_git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
export PS1="\[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

表示例:

~/project (develop) $

2. 小まめにコミット

# 悪い例
git add .
git commit -m "いろいろ修正"

# 良い例
git add login.js
git commit -m "feat: ログイン機能追加"

git add login.css
git commit -m "style: ログイン画面のスタイル調整"

git add tests/login.test.js
git commit -m "test: ログイン機能のテスト追加"

メリット:

  • 履歴が分かりやすい
  • 問題があったときに特定しやすい
  • レビューしやすい

3. 定期的にdevelopを更新

# 作業開始時
git checkout develop
git pull origin develop

# mainの変更も取り込む
git merge origin/main

# featureブランチでも定期的に
git checkout feature/my-feature
git merge develop  # developの最新を取り込む

メリット:

  • コンフリクトを早期に発見
  • 最新の状態で開発できる

4. 意味のあるコミットメッセージ

# 悪い例
git commit -m "修正"
git commit -m "update"
git commit -m "fix"

# 良い例
git commit -m "feat: ユーザー登録機能を追加"
git commit -m "fix: ログインエラーを修正(#123)"
git commit -m "docs: READMEに環境構築手順を追加"

5. mainとdevelopを保護

GitHub設定:

Settings → Branches
→ Add branch protection rule

main:
  ✅ Require pull request reviews
  ✅ Require status checks to pass
  ❌ Allow force pushes

develop:
  ✅ Require pull request reviews
  ❌ Allow force pushes

これで:

  • 誤って直接プッシュできない
  • レビューが必須
  • 安全性向上

チートシート

ブランチ操作

# ブランチ一覧
git branch

# ブランチ作成
git checkout -b feature/new

# ブランチ切り替え
git checkout develop

# ブランチ削除
git branch -d feature/old

コミット操作

# コミット
git add .
git commit -m "メッセージ"

# コミット修正
git commit --amend -m "修正後のメッセージ"

# コミット取り消し(変更は残る)
git reset --soft HEAD~1

# 空コミット
git commit --allow-empty -m "メッセージ"

リモート操作

# プッシュ
git push origin branch-name

# プル
git pull origin branch-name

# リモートブランチ削除
git push origin --delete branch-name

マージ操作

# マージ
git merge branch-name

# コンフリクト確認
git status

# マージ中止
git merge --abort

確認系

# 状態確認
git status

# 履歴確認
git log --oneline

# 差分確認
git diff

# ブランチ確認
git branch -a

リカバリ系

# 変更を破棄
git checkout -- file.txt

# コミット取り消し
git reset --soft HEAD~1

# コミット打ち消し
git revert コミットハッシュ

# 特定のコミットを適用
git cherry-pick コミットハッシュ

まとめ

ブランチ戦略

main(本番)
  ↓ マージ
develop(開発)
  ↓ マージ
feature/*(機能開発)

ルール:

  • mainで直接作業しない
  • developですべての開発
  • featureで個別機能

基本フロー

1. featureブランチ作成
2. 開発・コミット
3. developにマージ
4. mainにマージ(リリース時)

失敗時の対処

mainで誤って作業
  → developにマージ

コミットミス
  → reset --soft

コンフリクト
  → 手動で解決

覚えておくべきコマンド

git branch  # ブランチ確認
git checkout -b  # ブランチ作成
git merge  # マージ
git reset --soft  # コミット取り消し
git stash  # 一時保存

おわりに

Gitは最初は難しく感じるかもしれません。

でも、基本的な流れを理解して、失敗を恐れずに使っていけば、必ず使いこなせるようになります。

この記事が、あなたのGit習得の助けになれば幸いです。

Happy Coding! 🚀


参考リンク

最終更新: 2026-01-12

コメント