🗑️

Gitで不要なローカルブランチを削除する完全ガイド

に公開

はじめに

開発を続けていると、いつの間にかローカルブランチが大量にたまってしまうことがありませんか?この記事では、Gitで不要になったローカルブランチを効率的に削除する方法を、安全性を重視しながら解説します。

基本的なブランチ削除コマンド

安全な削除(推奨)

git branch -d <ブランチ名>

この方法は最も推奨される削除方法です。マージ済みのブランチのみ削除されるため、作業内容を失う心配がありません。

実行例:

git branch -d feature/login

マージされていないブランチを削除しようとすると、以下のようなエラーが表示されます:

error: The branch 'feature/login' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/login'.

強制削除

git branch -D <ブランチ名>

マージされていないブランチでも強制的に削除できますが、作業内容が失われる可能性があるため注意が必要です。

複数ブランチの削除

複数ブランチを指定して削除

git branch -d feature/login feature/signup feature/profile

マージ済みブランチの一括削除

git branch --merged | grep -v "\*\|main\|master" | xargs -n 1 git branch -d

このコマンドは以下の処理を行います:

  1. git branch --merged: マージ済みブランチを一覧表示
  2. grep -v "\*\|main\|master": 現在のブランチ、main、masterブランチを除外
  3. xargs -n 1 git branch -d: 残ったブランチを1つずつ削除

便利なコマンド集

ブランチ一覧の確認

# 全ブランチを表示
git branch

# マージ済みブランチを表示
git branch --merged

# マージされていないブランチを表示
git branch --no-merged

リモートで削除されたブランチの整理

# リモートで削除されたブランチをローカルからも削除
git remote prune origin

# または以下のコマンドでも同様の処理が可能
git fetch --prune

古いブランチの削除(時間ベース)

一定期間更新されていないブランチを削除することも可能です。

30日以上更新されていないブランチを表示

git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads/ | \
  awk '$2 <= "'$(date -d '30 days ago' +%Y-%m-%d)'"' | \
  grep -v -E "(main|master|develop)"

30日以上更新されていないブランチを削除

# まず確認(推奨)
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads/ | \
  awk '$2 <= "'$(date -d '30 days ago' +%Y-%m-%d)'"' | \
  grep -v -E "(main|master|develop)" | \
  cut -d' ' -f1

# 削除実行
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads/ | \
  awk '$2 <= "'$(date -d '30 days ago' +%Y-%m-%d)'"' | \
  grep -v -E "(main|master|develop)" | \
  cut -d' ' -f1 | \
  xargs -n 1 git branch -D

より簡潔な方法(macOS/Linux)

# 30日以上古いブランチを表示
git branch --format='%(refname:short) %(committerdate:relative)' --sort=-committerdate | \
  grep -E '[0-9]+ (months?|years?) ago'

# 特定の日数で削除(例:60日)
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads/ | \
  awk -v cutoff="$(date -d '60 days ago' +%Y-%m-%d)" '$2 < cutoff {print $1}' | \
  grep -v -E "(main|master|develop)" | \
  xargs -I {} git branch -D {}

実践的な使用例

日常的なクリーンアップ手順

  1. 現在の状況を確認

    git branch
    
  2. マージ済みブランチを確認

    git branch --merged
    
  3. 安全に削除

    git branch -d feature/completed-task
    

プロジェクト整理時の一括クリーンアップ

# 1. リモートの最新情報を取得
git fetch --prune

# 2. マージ済みブランチを一括削除
git branch --merged | grep -v "\*\|main\|master|develop" | xargs -n 1 git branch -d

# 3. 結果を確認
git branch

注意点とベストプラクティス

削除前の確認事項

  • 作業内容の保存状況: 未保存の変更がないか確認
  • マージ状況: 本当にマージ済みか確認
  • 他の開発者との共有: チーム開発時は削除前に確認

おすすめのワークフロー

  1. 常に -d オプションを使用して安全に削除
  2. 定期的に git remote prune origin でリモート情報を更新
  3. 削除前に必ずブランチ一覧で確認

エイリアス設定で効率化

.gitconfig にエイリアスを設定すると便利です:

[alias]
    cleanup = "!git branch --merged | grep -v '\\*\\|main\\|master' | xargs -n 1 git branch -d"
    prune-all = "!git remote prune origin && git cleanup"
    cleanup-old = "!git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads/ | awk '$2 <= \"'$(date -d '30 days ago' +%Y-%m-%d)'\"' | grep -v -E '(main|master|develop)' | cut -d' ' -f1 | xargs -n 1 git branch -D"
    show-old = "!git for-each-ref --format='%(refname:short) %(committerdate:relative)' refs/heads/ --sort=-committerdate | grep -E '[0-9]+ (months?|years?) ago'"

設定後は以下のコマンドで簡単にクリーンアップできます:

git cleanup        # マージ済みブランチを削除
git prune-all      # リモート削除分も含めて整理
git show-old       # 古いブランチを表示
git cleanup-old    # 30日以上古いブランチを削除

まとめ

Gitのローカルブランチ削除は、適切に行えば開発環境を整理し、効率的な開発につながります。特に重要なポイントは:

  • 安全性重視: -d オプションでマージ済みブランチのみ削除
  • 定期的な整理: git remote prune origin でリモート情報を更新
  • 確認の習慣: 削除前に必ずブランチ一覧を確認
  • 時間ベースの削除: 古いブランチを定期的にクリーンアップ
  • エイリアス活用: よく使うコマンドは.gitconfigに登録

これらのコマンドを活用して、クリーンで管理しやすいGitリポジトリを維持しましょう。

Discussion