Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
297
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

gitの不要なブランチを消すコマンド

不要になったブランチは削除しましょう

多くのメンバーや他の会社と共同で開発作業を行う場合、どうしても同時並行で作業するためのブランチは増えます。
しかし、本当にアクティブなブランチ数は人数分+αはずなのに、ブランチを消す作業をしておかないとどんどん残っていきますよね。
ブランチが増えすぎると同時進行中のタスクの見通しが悪くなり、Githubなどでブランチを切り替えたりする際にも非常に使いづらくなってしまいます。
ローカルブランチ・リモートブランチ共に、不要になったブランチは削除してこまめにメンテナンスしておきましょう。

今回紹介するコマンド

$ git branch --merged                    # マージ済みブランチの一覧
$ git branch -d                          # マージ済みブランチの削除
$ git branch -D                          # 強制的なブランチの削除
$ git fetch -p                           # リモートブランチの最新状態を取得(リモートブランチの削除も同期)
$ git for-each-ref refs/remotes --merged # マージ済みリモートブランチの一覧
$ git push --delete                      # リモートブランチの削除

ローカルブランチの削除

gitでは一つのブランチを基準としてマージ済みになっているブランチの一覧を出力できます。

$ git branch --merged [branchname]

[branchname] は基準となるブランチです。
[branchname] を省略した場合は現在チェックアウトしているブランチになります。

逆に、マージされていないブランチ一覧は git branch --no-merged で確認できます。

マージ済みローカルブランチの削除

さて、マージされているブランチなら削除可能でしょう。 -d を付けてさっさと削除しちゃいましょう。

$ git branch -d [branchname]

削除せずにまだ開発するかもしれないから残す?
いやいや、そんなことをするくらいなら一度消して同じ名前のブランチを最新の状態から作り直しましょう。
古いブランチを残しっぱなしにしてると、結果として最新版に追いつくためにマージやコンフリクト解消がコストになります。
用途が完了したブランチは潔く消すべし!

マージ未完了のローカルブランチの削除

マージが完了していないブランチは -d では消せません。実行してみると次のようなエラーメッセージが出力されます。

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

「ブランチは完全にマージされていません。もしどうしても削除したい場合は git branch -D branchname を実行して下さい。」
基本的にはマージ未完了のブランチを削除すべきではないので -d を使いましょう。
ローカルで実験するために作ったブランチや実装不要になった場合などの「マージする予定のない」ブランチに関しては、 -D を使って強制的に削除することもあります。

リモートブランチの削除

ローカルブランチをいくら削除してもGithubなどにPushしたリモートブランチは消えません。
ちゃんと整理して消すために、まずはリモートブランチのマージ状態を確認しましょう。
以下のようにコマンドを実行すると branchname にマージが完了しているリモートブランチ一覧と最終コミット日、最終コミット作成者の名前をCSV形式で取得できます。

$ git checkout branchname
$ git fetch -p
$ git pull origin branchname
$ git for-each-ref --sort=committerdate --format='"%(committerdate:short)","%(authorname)","%(refname:short)"' refs/remotes --merged
  • git fetch -p : リモートブランチの最新状況を取得します。 -p を付けない場合はリモートブランチの削除を同期しません。
  • git for-each-ref refs/remotes: リモートブランチ一覧を出力
    • --merged : マージ済みブランチのみ出力
    • --sort=committerdate : ブランチの最終コミット日でソート
    • --format='"%(committerdate:short)","%(authorname)","%(refname:short)"' : コミット日、コミット作成者、ブランチ名を出力

CSV以外の方法で取得したい場合や、その他の情報をリストに出したい場合は git for-each-ref のリファレンスを参照しましょう。
https://git-scm.com/docs/git-for-each-ref

リモートブランチの削除コマンド

リモートブランチを削除する場合は以下のようにします。

$ git push --delete origin branchname

リモートブランチは共同作業者に配慮して消しましょう。
特にGithubなどではPull Requestがマージされたタイミングで削除することもできるので活用しましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
297
Help us understand the problem. What are the problem?