web-dev-qa-db-ja.com

マージされたすべてのGitブランチを削除するにはどうすればいいですか?

私はたくさんのGitブランチを持っています。既にマージされているブランチを削除する方法1つずつ削除するのではなく、すべて削除する簡単な方法はありますか?

1597
Nyambaa

更新:

ワークフローに先祖としてそれらがある場合、masterやdevのように除外するために他のブランチを追加することができます。通常、私は "sprint-start"タグとマスターから分岐し、devとqaは先祖ではありません。

まず、リモートでマージされたブランチをすべてリストします。

git branch --merged

削除したくないブランチがいくつかあるかもしれません。マスターやディベロップメントのように削除したくない重要なブランチをスキップするための引数をいくつか追加できます。次のコマンドはmasterブランチとそれにdevがあるものはすべてスキップします。

git branch --merged| egrep -v "(^\*|master|dev)"

スキップしたい場合は、次のようにegrepコマンドに追加できます。ブランチskip_branch_nameは削除されません。 

git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"

現在チェックアウトされているブランチにすでにマージされているすべてのローカルブランチを削除するには、次の手順を実行します。

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

祖先である場合は、masterとdevが除外されていることがわかります。


マージしたローカルブランチを削除することができます。

git branch -d branchname

マージされていない場合は、

git branch -D branchname

Gitの古いバージョンでリモートからそれを削除するには:

git Push Origin :branchname

Gitの最近のバージョンでは、

git Push --delete Origin branchname

リモートからブランチを削除したら、Pruneでリモートトラッキングブランチを取り除くことができます。

git remote Prune Origin

または他の答えが示すように、個々のリモート追跡ブランチを次のようにプルーニングします。

git branch -dr branchname

お役に立てれば。

2523
Adam Dymitruk

既にマージされているremote上のすべてのブランチを削除するには

git branch -r --merged | grep -v master | sed 's/Origin\//:/' | xargs -n 1 git Push Origin

Gitのより最近のバージョンでは

git branch -r --merged | grep -v master | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin
365
kuboon

Adamの答えを少しだけ拡張します。

git config -e --globalを実行してこれをGit設定に追加します。

[alias]
    cleanup = "!git branch --merged | grep  -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"

そして、単純なgit cleanupを実行して、すべてのローカルマージブランチを削除できます。

150
real_ate

これはmaster以外の全てのマージされたブランチを削除するのにも働きます。

git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d
74
Ismael Abreu

これらのコマンドからmasterdevelopのブランチを除外したいでしょう。

ローカルGitのクリア: 

git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d

リモートGitのクリア: 

git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin

リモートブランチのローカルレジストリを同期します。 

git fetch -p
66
Guido Bouman

Windows上にいてPowerShellスクリプトを好む人のために、ローカルのマージされたブランチを削除するものがあります。

function Remove-MergedBranches
{
  git branch --merged |
    ForEach-Object { $_.Trim() } |
    Where-Object {$_ -NotMatch "^\*"} |
    Where-Object {-not ( $_ -Like "*master" )} |
    ForEach-Object { git branch -d $_ }
}
42
Klas Mellbourn

Git Sweep これは素晴らしい仕事をする。

20
paul

Gitバージョン2.5.0を使う:

git branch -d `git branch --merged`
14
drautb

私は何年もの間Adamの答えを使ってきました。それは言った、それは私が予想したように振舞わなかったいくつかのケースがあるということです:

  1. 含まれた という単語「マスター」は無視されました。マスターブランチだけではなく、「notmaster」または「masterful」
  2. 含まれた という単語「dev」は無視されました。 devブランチだけではなく "dev-test"
  3. current ブランチのHEADから到達可能なブランチを削除します(つまり、必ずしもマスターではありません)。
  4. 切り離されたHEAD状態で、 すべての 現在のコミットから到達可能なブランチを削除

1と2は、正規表現を変更するだけで、簡単に対処できます。 3はあなたが望むもののコンテキストに依存します(すなわち、masterにマージされなかったブランチ、または現在のブランチに対して削除されたブランチのみを削除します)。意図せずにデタッチされたHEAD状態で実行した場合はgit reflog)。

最後に、私はこれをすべて別の(Bash | Ruby | Python)スクリプトを必要としないワンライナーにすることを望みました。

TL、DR

オプションの-fフラグを受け付けるgitエイリアス "sweep"を作成してください。

git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

そしてそれを呼び出してください:

git sweep

または

git sweep -f

長く詳細な答え

いくつかのブランチを含むgitリポジトリの例を作成し、正しい動作をテストすることが最も簡単でした。

1回のコミットで新しいGitリポジトリを作成する

mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"

いくつかの新しいブランチを作る

git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
  bar
  develop
  foo
* master
  masterful
  notmaster

望ましい動作:master、development、または current を除いて、マージされたブランチをすべて選択します。

元の正規表現では、ブランチ "masterful"と "notmaster"がありません。

git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
  bar

更新された正規表現(これで "dev"ではなく "Develop"が除外されました):

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster

ブランチfooに切り替え、新しいコミットを行い、そしてfooに基づいて新しいブランチfoobarをチェックアウトします。

echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"

私の現在のブランチはfoobarなので、削除したいブランチをリストするために上記のコマンドを再実行すると、masterにマージされていなくてもブランチ "foo"が含まれます。

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  masterful
  notmaster

しかし、masterで同じコマンドを実行すると、ブランチ "foo"は含まれません。

git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

そして、これは単にgit branch --mergedが他に指定されていなければ現在のブランチのHEADをデフォルトとするからです。少なくとも私のワークフローでは、ローカルブランチがmasterにマージされていない限り、ローカルブランチを削除したくないので、私は次のような方法を好みます。

git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

切り離されたHEAD状態

git branch --mergedのデフォルトの振る舞いに頼ることは切り離されたHEAD状態においてさらに重要な結果をもたらします:

git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  foobar
  masterful
  notmaster

これは私が今行っていたブランチ "foobar"と "foo"を削除したはずですが、これはほぼ確実に望ましい結果ではありません。

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

実際の削除を含む1行

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d

すべてがgitエイリアス "sweep"にまとめられました。

git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

別名はオプションの-fフラグを受け入れます。デフォルトの動作ではmasterにマージされたブランチだけが削除されますが、-fフラグは現在のブランチにマージされたブランチを削除します。

git sweep
Deleted branch bar (was 9a56952).
Deleted branch masterful (was 9a56952).
Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).
13
eddies

コミットを--mergedオプションに追加することができます。

以下のコマンドはあなたのOriginからマージされたブランチを削除します。

git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 git Push Origin --delete 

Git Push Origin --deleteをechoに置き換えて、どのブランチが削除されるのかをテストできます。

git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 echo
13
Jörn Reimerdes

次のRubyスクリプトを使って、既にマージされているローカルブランチとリモートブランチを削除します。複数のリモートを持つリポジトリに対してそれを実行していて、1つだけから削除したい場合は、必要なリモートのみを取得するために、リモートステートメントリストにselectステートメントを追加します。

#!/usr/bin/env Ruby

current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
  if $?.exitstatus == 0
    puts "WARNING: You are on branch #{current_branch}, NOT master."
  else
    puts "WARNING: You are not on a branch"
  end
  puts
end

puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
  split("\n").
  map(&:strip).
  reject {|b| b =~ /\/(#{current_branch}|master)/}

local_branches= `git branch --merged`.
  gsub(/^\* /, '').
  split("\n").
  map(&:strip).
  reject {|b| b =~ /(#{current_branch}|master)/}

if remote_branches.empty? && local_branches.empty?
  puts "No existing branches have been merged into #{current_branch}."
else
  puts "This will remove the following branches:"
  puts remote_branches.join("\n")
  puts local_branches.join("\n")
  puts "Proceed?"
  if gets =~ /^y/i
    remote_branches.each do |b|
      remote, branch = b.split(/\//)
      `git Push #{remote} :#{branch}`
    end

    # Remove local branches
    `git branch -d #{local_branches.join(' ')}`
  else
    puts "No branches removed."
  end
end
11
mmrobins

PowerShellコンソールでマージされたブランチを削除する方法

git branch --merged | %{git branch -d $_.Trim()}

GitHub for Windows を参照してください。

8

Gitにはこれを自動的に実行するコマンドはありません。しかし、Gitコマンドを使って必要なものを提供するスクリプトを書くことができます。これは、使用している分岐モデルに応じてさまざまな方法で実行できます。 

もしブランチがmasterにマージされたかどうかを知る必要があるなら、myTopicBranchがマージされていれば次のコマンドは何も出力しません(すなわちあなたはそれを削除することができます)。

$ git rev-list master | grep $(git rev-parse myTopicBranch)

Git branchコマンドを使用してBash内のすべてのブランチを解析し、すべてのブランチに対してforループを実行できます。このループでは、ブランチを削除できるかどうかを上記のコマンドで確認します。

8
ralphtheninja

kuboonの回答では、ブランチ名にWordのマスターが含まれているブランチの削除に失敗しました。

git branch -r --merged | grep -v "Origin/master$" | sed 's/\s*Origin\///' | xargs -n 1 git Push --delete Origin

もちろん、 "master"ブランチ自体は削除されません:)

8
Paras

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -dは、現在チェックアウトされているブランチやmasterを除くすべてのローカルブランチを削除します。

これらのコマンドを理解したい人のために役立つ記事を以下に示します。 Git Clean:すでにマージされたブランチを削除、スティーブンハーマン

6
styger

git-del-brtool を使うことができます。

git-del-br -a

pip経由でインストールできます。

pip install git-del-br

P.S:私はツールの作者です。任意の提案/フィードバックは大歓迎です。 

5
tusharmakkar08

エイリアスバージョンの Adamの最新の回答

[alias]
    branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"

また、複雑なエイリアスをエスケープするための便利なヒントについては、 この回答 をご覧ください。

5
Eliot

あなたが現在いるブランチに既にマージされているすべてのローカルブランチを削除したいのであれば、私は以前の答えに基づいてそうするための安全なコマンドを思いついた。

git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d

このコマンドは現在のブランチやマスターブランチには影響しません。 xargsの-tフラグを使用して、実行する前に実行していることもわかります。

4
chrismendis

次のコマンドを試してください。

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

git rev-parseを使用すると、 現在のブランチ名 が除外されます。エラーが発生した場合は、削除するローカルブランチがないことを意味します。

リモートブランチでも同じようにするには(リモート名でOriginを変更します)、

git Push Origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

複数のリモートを使用している場合は、cutの前にgrep Origin |を追加してOriginのみをフィルタリングします。

上記のコマンドが失敗した場合は、最初にマージされたリモートトラッキングブランチを削除してみてください。

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

その後、リモコンをもう一度git fetchして、前のgit Push -vdコマンドをもう一度使用します。

頻繁に使用する場合は、~/.gitconfigファイルにエイリアスとして追加することを検討してください。

誤っていくつかのブランチを削除した場合は、git reflogを使って失われたコミットを見つけてください。

4
kenorb

以下のクエリは私のために働きます 

for branch in  `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/Origin\//, "")}1'`;do git Push Origin --delete $branch; done

これにより、grepパイプ内の特定のブランチがフィルタリングされます。

Http cloneを介してはうまく機能しますが、ssh接続ではあまりうまくいきません。

4
user1460965

私が作ったこれらの答えのいくつかに基づいて それをするための私自身のBashスクリプト

マージされたブランチを削除するためにgit branch --mergedgit branch -dを使い、削除する前にそれぞれのブランチについてプロンプトを出します。

merged_branches(){
  local current_branch=$(git rev-parse --abbrev-ref HEAD)
  for branch in $(git branch --merged | cut -c3-)
    do
      echo "Branch $branch is already merged into $current_branch."
      echo "Would you like to delete it? [Y]es/[N]o "
      read REPLY
      if [[ $REPLY =~ ^[Yy] ]]; then
        git branch -d $branch
      fi
  done
}
4
earlonrails

私はgit-flowのような命名法を使っていますので、これは私にとって非常に安全に動作します。

git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d

基本的には文字列fix/またはfeature/で始まるマージされたコミットを探します。

4
Chad M

Gitがmasterにマージされたすべてのブランチをチェックアウトするスクリプトを書きます。

それからgit checkout masterをしてください。

最後に、マージした枝を削除します。

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git checkout $branchnew
done

git checkout master

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git Push Origin --delete $branchnew
done
3
Komu

受け入れられている解決策はかなり良いですが、それがまだリモートにマージされていないローカルブランチも削除するという1つの問題があります。

あなたがあなたの出力を見ると、こんな感じになるでしょう 

$ git branch --merged master -v
  api_doc                  3a05427 [gone] Start of describing the Java API
  bla                      52e080a Update wording.
  branch-1.0               32f1a72 [maven-release-plugin] prepare release 1.0.1
  initial_proposal         6e59fb0 [gone] Original proposal, converted to AsciiDoc.
  issue_248                be2ba3c Skip unit-for-type checking. This needs more work. (#254)
  master                   be2ba3c Skip unit-for-type checking. This needs more work. (#254)

ブランチblaissue_248は、静かに削除されるローカルブランチです。

しかし、[gone]という単語を見ることもできます。これは、リモートにプッシュされたブランチ(現在は消えている)を示しているため、ブランチを削除できることを示します。

元の答えはこのように変更することができます(短い行の長さのために複数行に分割)

git branch --merged master -v | \
     grep  "\\[gone\\]" | \
     sed -e 's/^..//' -e 's/\S* .*//' | \
      xargs git branch -d

まだマージされていないブランチを保護するために。これを保護するためのmasterのgrepは必要ありません。これはOriginにリモートがあり、なくなったようには見えないからです。

2
Heiko Rupp

Windowsの場合、 Cygwin をインストールして、次のコマンドを使用してすべてのリモートブランチを削除できます。

git branch -r --merged | "C:\cygwin64\bin\grep.exe" -v master | "C:\cygwin64\bin\sed.exe" 's/Origin\///' | "C:\cygwin64\bin\xargs.exe" -n 1 git Push --delete Origin

私にとってgit branch --mergedは、GitHub PRを介してマージされたブランチを表示しません。理由はわかりませんが、次の行を使用して削除しますリモートトラッキングブランチを持たないすべてのローカルブランチ

diff <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | grep '<' | cut -c 3- | xargs git branch -D

説明:

  • git branch --format "%(refname:short)"はローカルブランチのリストを提供します
  • git branch -r | grep -v HEAD | cut -d/ -f2-はリモートブランチのリストを提供し、HEADを除外します
  • diff <(...) <(...)は、括弧内の2つのコマンドの出力の差分を提供します
  • grep '<'は、最初のリストには存在するが2番目のリストには存在しないブランチをフィルターします
  • cut -c 3-は3番目の文字から始まる行を与えるため、接頭辞<を削除します
  • xargs git branch -Dは各ブランチ名に対してgit branch -Dを実行します

または、次のようにgrep -v '<'を回避できます:

diff --old-line-format="%L" --new-line-format="" --unchanged-line-format="" <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | xargs git branch -D
1
folex

git bash がインストールされているWindowsではegrep -vは動作しません

git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d

grep -E -vegrep -vと同じです。

-dを使用してすでに merged branchesを削除するか、 -Dを使用して unmerged branchesを削除します

1
DevWL

誤ってmaster以外のブランチからコマンドを実行しないように、次のbashスクリプトを使用します。そうでなければ、masterからマージされたブランチからgit branch --merged | grep -v "\*" | xargs -n 1 git branch -dを実行すると、マスターブランチが削除される可能性があります。

#!/bin/bash

branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)"     # detached HEAD
branch_name=${branch_name##refs/heads/}

if [[ $branch_name == 'master' ]]; then
   read -r -p "Are you sure? [y/N] " response
   if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
       git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
   fi
else
   echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first."
fi
1
Robert Kajic

2018.07現在

これをあなたの[alias]~/.gitconfigセクションに追加してください:

sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"

これで、必要なクリーンアップを実行するためにgit sweepを呼び出すことができます。

1
sorin

マスターブランチにマージされたローカルブランチを削除するには、次のエイリアス(git config -e --global)を使います。

cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D"

私の現在のチェックアウトはマスターブランチとは異なりますが、私はgit branch -Dメッセージを避けるためにerror: The branch 'some-branch' is not fully merged.を使用しています。

0
dgt

WindozeにやさしいPythonスクリプト(git-sweepがWesnothリポジトリで詰まったため)

#!/usr/bin/env python
# Remove merged git branches. Cross-platform way to execute:
#
#   git branch --merged | grep -v master | xargs git branch -d
#
# Requires gitapi - https://bitbucket.org/haard/gitapi
# License: Public Domain

import gitapi

repo = gitapi.Repo('.')
output = repo.git_command('branch', '--merged').strip()
for branch in output.split('\n'):
  branch = branch.strip()
  if branch.strip(' *') != 'master':
    print(repo.git_command('branch', '-d', branch).strip())

https://Gist.github.com/techtonik/b3f0d4b9a56dbacb3afc​​

0

HubFlowやGitFlowなどの分岐モデルを使用している場合は、このコマンドを使用してマージされた機能分岐を削除できます。

git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d

0
bedrin

これはgit branchを削除する方法です

git branch -D BranchName
0
Hasib Kamal

私のBashスクリプトへの貢献 は、 mmrobinの回答におおまかに基づいています

Includeとexcludeを指定したり、両方ではなくローカルブランチまたはリモートブランチだけを調べたり削除したりするために、いくつかの便利なパラメータを取ります。

#!/bin/bash

# exclude branches regex, configure as "(branch1|branch2|etc)$"
excludes_default="(master|next|ag/doc-updates)$"
excludes="__NOTHING__"
includes=
merged="--merged"
local=1
remote=1

while [ $# -gt 0 ]; do
  case "$1" in
  -i) shift; includes="$includes $1" ;;
  -e) shift; excludes="$1" ;;
  --no-local) local=0 ;;
  --no-remote) remote=0 ;;
  --all) merged= ;;
  *) echo "Unknown argument $1"; exit 1 ;;
  esac
  shift   # next option
done

if [ "$includes" == "" ]; then
  includes=".*"
else
  includes="($(echo $includes | sed -e 's/ /|/g'))"
fi

current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
  echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching branches...\n"

git remote update --Prune
remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
  echo "No existing branches have been merged into $current_branch."
else
  echo "This will remove the following branches:"
  if [ "$remote" == 1 -a -n "$remote_branches" ]; then
    echo "$remote_branches"
  fi
  if [ "$local" == 1 -a -n "$local_branches" ]; then
    echo "$local_branches"
  fi
  read -p "Continue? (y/n): " -n 1 choice
  echo
  if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
    if [ "$remote" == 1 ]; then
      remotes=$(git remote)
      # Remove remote branches
      for remote in $remotes
      do
        branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n')
        git Push $remote $branches
      done
    fi

    if [ "$local" == 1 ]; then
      # Remove local branches
      locals=$(echo "$local_branches" | sed 's/Origin\///g' | tr -d '\n')
      if [ -z "$locals" ]; then
        echo "No branches removed."
      else
        git branch -d $(echo "$locals" | tr -d '\n')
      fi
    fi
  fi
fi
0
Raman

Windowsを使用している場合は、 Out-GridView を使用してWindows Powershellを使用して(残念ながら、現在Powershell Coreには存在しません)、分岐の良いリストを表示し、削除したいブランチをマウスで選択できます。

git branch --merged | Out-GridView -PassThru | % { git branch -d $_.Trim() }

enter image description here [OK]をクリックした後、Powershellはこのブランチ名をgit branch -dコマンドに渡して削除します enter image description here

0
for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \ 
git branch -D $b; done && git fetch -p
0
030
0
holys

私は、upstreamという名前のリモートとOriginを持っているとしましょう(GitHubスタイル、私のforkはOrigin、上流は上流です)。

私はどんなマスター、HEAD、あるいは上流からの何かを削除したくありません。それは私達がPRを作成する私達の共通の枝であるので、私はまた現像枝を削除したくない。

マージされたものでフィルタリングされたすべてのリモートブランチを一覧表示します。

git branch -r

そのリストから、削除したくないブランチ名にあることがわかっている単語を含む行を削除します。

sed '/develop\|master\|HEAD\|upstream/d'

参照名からリモート名を削除します(Origin/somebranchはsomebranchになります)。

sed 's/.*\///'

Xargsを使ってワンライナーを呼び出す:

xargs git Push --delete Origin

あなたが得るすべて一緒にそれをパイプ:

git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' |  sed 's/.*\///' | xargs git Push --delete Origin

これは私が取り組んできたがマージしていないいくつかのブランチだけを私に残すでしょう。多すぎてはいけないので、それらを一つずつ削除することができます。

不要になったブランチを探します。

git branch -ar

削除したいbranch1、branch2、およびbranch3が見つかったとします。

git Push --delete Origin branch1 branch2 branch3
0
miigotu
$ git config --global alias.cleanup
'!git branch --merged Origin/master | egrep -v "(^\*|master|staging|dev)" | xargs git branch -d'

(読みやすくするために複数行に分割)

"git cleanup"を呼び出すと、既にOrigin/masterにマージされているローカルブランチが削除されます。通常の状況ではそれらを削除したくないため、master、staging、およびdevはスキップされます。

これを打破して、これはそれがしていることです:

  1. git config --global alias.cleanup
    • これは "cleanup"と呼ばれるグローバルなエイリアスを作成しています(あなたのすべてのリポジトリで)
  2. コマンドの冒頭の!は、このエイリアスの一部としてgit以外のコマンドを使用することになっているので、実際にはbashコマンドをここで実行する必要があります
  3. git branch --merged Origin/master
    • このコマンドは、すでにOrigin/masterにマージされているブランチ名のリストを返します。
  4. egrep -v "(^\*|master|staging|dev)"
    • これにより、master、staging、およびdevの各ブランチが、すでにマージされているブランチのリストから削除されます。これらのブランチは機能ではないため、削除したくありません。
  5. xargs git branch -d
    • これにより、マージされていない各ブランチに対してgit branch -d xxxxxコマンドが実行されます。これにより、ローカルブランチが1つずつ削除されます。
0
Joe Phillips

私は1つのcmdでマージされたローカルANDリモートブランチを削除するに以下のメソッドを使っています。 

bashrcファイルには以下のものがあります。

function rmb {
  current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
  if [ "$current_branch" != "master" ]; then
    echo "WARNING: You are on branch $current_branch, NOT master."
  fi
  echo "Fetching merged branches..."
  git remote Prune Origin
  remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
  local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
  if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
    echo "No existing branches have been merged into $current_branch."
  else
    echo "This will remove the following branches:"
    if [ -n "$remote_branches" ]; then
      echo "$remote_branches"
    fi
    if [ -n "$local_branches" ]; then
      echo "$local_branches"
    fi
    read -p "Continue? (y/n): " -n 1 choice
    echo
    if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
      # Remove remote branches
      git Push Origin `git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/Origin\//:/g' | tr -d '\n'`
      # Remove local branches
      git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/Origin\///g' | tr -d '\n'`
    else
      echo "No branches removed."
    fi
  fi
}

オリジナル ソース

これはマスターブランチを削除するのではなく、マージされたローカルANDリモートブランチを削除するです。これをrcファイルに入れたら、rmbを実行するだけで、マージされたブランチが失われたことが示されます。確認を求めないようにコードを変更することもできますが、それを保持しておくのはおそらく良いことです。

0
Prashant

マージされたローカルブランチを削除したいのであれば、ここで私が好むワンライナーがここにあります:

git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git Push Origin --delete _br'
0
Ikar Pohorský