병합 된 모든 Git 브랜치를 삭제하려면 어떻게해야합니까?


1934

Git 브랜치가 많이 있습니다. 이미 병합 된 분기를 어떻게 삭제합니까? 하나씩 삭제하지 않고 모두 삭제하는 쉬운 방법이 있습니까?


46
좀 더 구체적으로 말하면 git branch -D병합 여부에 관계없이 모든 분기를 삭제합니다.
PhilT

12
리포지토리 의 'branches'섹션 (예 : github.com/<username>/<repo_name>/branches )으로 이동하면 GitHub에서 직접이 작업을 수행 할 수도 있습니다 . 선택한 분기를 삭제하는 측면에 빨간색 휴지통 아이콘이있는 모든 분기 목록이 있어야합니다. 터미널에서하는 것보다 훨씬 빠릅니다! 또한 master각 지점이 얼마나 앞 / 뒤에 있는지 보여줍니다 . 그러나 실행하면 로컬 클라이언트는 여전히 이전 분기를 나열합니다 git branch -a. 이 답변에git fetch --prune 따라 제거하는 데 사용 하십시오 .
user5359531

3
안전 점검 및 사전 구성된 "안전 분기"를 사용하여 로컬 또는 원격으로이를 수행하는 스크립트 : github.com/fatso83/dotfiles/tree/master/utils/… git delete-merged --doit origin 또는git delete-merged --doit --local
oligofren

이 앱 을 사용 하여 병합 된 분기를 자동으로 삭제할 수도 있습니다 .
Sebass van Boxel

rm -fr work && git clone http://example.com/work.git수년에 걸쳐 git으로 피클을 꺼내는 가장 쉬운 방법이되었습니다.
Reactgular

답변:


3115

최신 정보:

워크 플로에 가능한 상위 항목이있는 경우 마스터 및 개발자처럼 제외 할 다른 분기를 추가 할 수 있습니다. 일반적으로 "sprint-start"태그에서 분기하고 master, dev 및 qa는 조상이 아닙니다.

먼저 원격으로 병합 된 모든 분기를 나열하십시오.

git branch --merged

제거하지 않으려는 분기가 거의 없을 수 있습니다. 마스터 나 개발처럼 삭제하고 싶지 않은 중요한 브랜치를 건너 뛰기 위해 몇 가지 인수를 추가 할 수 있습니다. 다음 명령은 마스터 브랜치 및 그 안에있는 모든 것을 건너 뜁니다.

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 push --delete origin branchname

git push origin :branchname    # for really old git

원격에서 지점을 삭제하면 다음을 사용하여 원격 추적 지점을 제거 할 수 있습니다.

git remote prune origin

다른 답변에서 알 수 있듯이 개별 원격 추적 분기를 정리하십시오.

git branch -dr branchname

도움이 되었기를 바랍니다.


46
경고 : 지점을 방금 만든 경우 해당 지점도 삭제됩니다. 최상위 명령을 실행하기 전에 목록에 새로 작성된 분기가 없는지 확인하십시오.
게리 하란

153
경고의 가능성 : reflog는 베이컨을 저장합니다. 걱정하지 마십시오.
Adam Dymitruk

33
첫 번째 명령은 로컬 분기 만 삭제하므로 일부가 지적한 것처럼 '위험하지'않습니다.
ifightcrime

79
다음 번에 답변을 git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
봤을

23
fatal: branch name required삭제할 분기가없는 경우 오류가 발생 합니다. 당신이 전달할 수 있다는 방지하려면 -rxargs실행되지 않도록 git branch -d표준 입력이 비어있는 경우. (Man 페이지에 따르면 이것은 GNU xargs 확장입니다).
Marius Gedminas

456

이미 병합 된 원격 지점을 모두 삭제하려면

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

업데이트 (@oliver; 코멘트에 맞지 않기 때문에 이미 충분한 답변이 있습니다) : 분기 ABC에 있으면 git branch -r --merged분기가 지정되지 않았기 때문에 결과에 ABC가 표시 되므로 분기는 현재 분기로 설정되고 분기 분기와 자체간에 차이가 없기 때문에 항상 자체적으로 병합 된 것으로 간주됩니다.

따라서 지점을 지정하십시오.

git branch -r --merged master | grep -v master ...

또는 첫 체크 아웃 마스터 :

git checkout master | git branch -r --merged | grep -v ...

18
최고의 답변. 참고로, 마스터 지점의 이름 dev이 변경되었으므로 변경해야했습니다
Dorian

41
내가 추가 한 | grep origingrep -v master원점 다른 리모컨의 지점을 밀어 방지 할 수 있습니다. git branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
L0LN1NJ4

9
develop분기도 제외하도록 약간 수정했습니다 . git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin. 이제 이것은 내 별칭으로 밝혀졌습니다.
sarat

8
이것이 내가 읽은 최고의 대답 인 이유는 -r다른 곳에서는 언급하지 않은 주장입니다. 현지 지사들만이 하우스 키핑을 할 가치가 있다는 것은 당연한 일입니다. 그러나 리모콘에는 쓰레기가 가득합니다.
Asbjørn Ulsberg

19
주의 - 바로 실현이 분명히 가지가 합병 찾을 현재 지점 이 아닌 마스터에 당신이 그렇다면 myFeatureBranch그것을 닦아 주실 것이다 origin/myFeatureBranch. 아마 git checkout master먼저하는 것이 가장 좋습니다 .
jakub.g

190

Adam의 답변을 조금만 확장하면됩니다.

다음을 실행하여 Git 구성에 추가하십시오. git config -e --global

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

그런 다음 간단한 로컬 병합 분기를 모두 삭제할 수 있습니다 git cleanup.


11
첫 번째 명령은 안됩니다 : git branch --merged master현재 체크 아웃 된 분기가 아닌 마스터에 병합 된 것을보고 싶습니까?
Joe Phillips

@JoePhilllips 어떤 사람들은 마스터 브랜치가 마스터가 아닌 대신에 develop또는 대신 dev에 명령이 실패 할 경우 fatal: malformed object name일반적인 명령을 사용하는 것이
좋으며

1
@JoePhilllips이 답변의 요점은 Adam의 답변 (이 질문의 최상위 답변)을 유용한 자식 별칭으로 묶는 것입니다. 아담의 대답에는 당신이 제안하는 것이 없으며 많은 사람들이 유용하다는 것을 알았으므로 내 것을 바꾸지 않으려는 경향이 있습니다. 당신이 그것에 대해 강하게 느끼면 Adam 's answer에 대한 토론을 여는 것이 좋습니다
real_ate

13
추가 -r로하는 것은 xargs불필요한 오류를 방지 할 수 있습니다 ( branch name required)이 별칭을 여러 번 실행 중이거나이있는 경우에는 지점이 삭제 될 남아 있지 때. 내 별칭은 다음과 같습니다 :cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
spezifanta

1
현재 명령은 마스터를 필터링하고 분기를 개발하지 않습니다
Andriy F.

83

또한 master를 제외한 모든 병합 된 분기를 삭제합니다.

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

3
이제는 안에있는 분기를 삭제하지 않습니다 master. grep -v ^master$중간을 시도하십시오 .
wchargin

또한 마스터| grep -v '^\*'아닌
svassr

5
감사합니다! 이것을 사용하는 사람에게는 하나의주의 사항 :에 두 개의 공백이 grep -v '^ master$'있습니다. 직접 입력하고 master보고 싶지 않은 경우 삭제 하면 삭제 됩니다.
styger

3
@ Mr.Polywhirl을 편집하면 명령이 중단되고 되돌려 야합니다. git branch현재 체크 아웃 된 분기가 아닌 경우 왼쪽에 두 개의 공백이있는 새 줄에 각 분기 이름을 나열 하므로 두 개의 공백이 필요 합니다. 기본적으로이 명령을 실행하는 사람은 현재 체크 아웃 된 브랜치가 아닌 한 자신의 마스터 브랜치를 삭제합니다.
styger

79

해당 명령에서 master& develop분기 를 제외하려고 합니다.

로컬 자식 지우기 :

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

원격 git clear :

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

원격 지사의 로컬 레지스트리 동기화 :

git fetch -p

3
원격 버전의 경우 +1입니다 (그러나 원격-제거 (prune)할수록 덜 필요합니다). 또한 가치가 지적 그 thoose 것이다 나이 자식 버전과하지 작업
malko

4
git config --global --add fetch.prune true가져 오기 또는 가져 오기시 자동으로 정리합니다.
T3rm1

1
자두는 원격 클리어와 동일하지 않습니다. 원격 지우기는 실제로 현재 지점과 완전히 병합 된 원격 지점을 삭제합니다. 정리는 이미 삭제 된 원격 분기의 로컬 레지스트리 만 정리합니다.
Guido Bouman

브랜치는 이전에 병합되었을 때 병합 된 것으로 간주되지만 병합되지 않은 병합 후에 새로운 커밋을 갖기 때문에 완전히 잘못된 단어입니다.
스콘

한 번의 호출로 모든 git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
원거리

48

Windows를 사용하고 PowerShell 스크립트를 선호하는 사용자에게는 로컬 병합 분기를 삭제하는 스크립트가 있습니다.

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

13
호기심 위해,이이 단축 될 수있다 git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
이안 발라드

5
@IainBallard 물론, 나는 별칭을 사용할 수 있었다. 가독성을 극대화하려는 경우에는 권장하지 않습니다. github.com/darkoperator/PSStyleGuide/blob/master/English.md
Klas

1
확실한. 나는 당신의 대답이 매우 도움이된다는 것을 알았습니다. 그러나 주로, 나는 당신이 복사 / 붙여 넣기 또는 입력 할 수있는 것을 일회성으로 전달하고있었습니다. 다시 감사합니다.
Iain Ballard

4
여기에 그 보존 마스터 쉘 cmd 만든 Windows 용 한 줄과 현재의 지점입니다 : for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B(한숨, 싱글과 더블 역 인용 부호를 대체, 나는 확실히 역 인용 부호를 포함하는 문자의 형식을 지정하는 방법을 모르겠어요)
요요

42

나는 수년간 아담의 대답을 사용했습니다. 즉, 예상대로 작동하지 않는 경우가 있습니다.

  1. "master"라는 단어 가 포함 된 분기 ( 예 : 마스터 분기 만이 아니라 "notmaster"또는 "masterful")는 무시되었습니다.
  2. "dev"라는 단어 가 포함 된 분기 ( 예 : dev 분기 만이 아니라 "dev-test")가 무시되었습니다.
  3. 현재 브랜치 의 헤드에서 도달 할 수있는 브랜치 삭제 (즉, 반드시 마스터는 아님)
  4. 분리 된 HEAD 상태 에서 현재 커밋에서 도달 할 수있는 모든 분기 삭제

1 & 2는 정규 표현식을 변경하여 간단하게 해결할 수있었습니다. 3은 원하는 컨텍스트에 따라 다릅니다 (즉, 마스터 또는 현재 분기에 병합되지 않은 분기 만 삭제). 4가 git reflog실수로 분리 된 HEAD 상태에서 실행 한 경우 4는 비참 할 가능성이 있습니다 (으로 복구 가능하더라도 ).

마지막으로, 이것은 별도의 (Bash | Ruby | Python) 스크립트를 필요로하지 않는 하나의 라이너 안에 있기를 원했습니다.

TL; DR

선택적 -f플래그 를 허용하는 git 별명 "sweep"을 작성하십시오 .

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

다음과 같이 호출하십시오.

git sweep

또는:

git sweep -f

길고 자세한 답변

일부 브랜치로 예제 git repo를 작성하고 올바른 동작을 테스트하기 위해 커밋하는 것이 가장 쉬웠습니다.

단일 커밋으로 새로운 자식 저장소 만들기

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

원하는 동작 : 마스터, 개발 또는 현재를 제외한 모든 병합 된 분기 선택

원래 정규 표현식은 "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이며 위의 명령을 다시 실행하여 삭제하려는 브랜치를 나열하면 "foo"브랜치가 master로 병합되지 않은 경우에도 포함됩니다.

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

그러나 마스터에서 동일한 명령을 실행하면 "foo"분기가 포함되지 않습니다.

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

그리고 git branch --merged달리 지정되지 않은 경우 기본적으로 현재 분기의 HEAD로 기본 설정 되기 때문 입니다. 적어도 워크 플로의 경우 로컬 분기가 마스터와 병합되지 않은 경우 로컬 분기를 삭제하고 싶지 않으므로 다음 변형을 선호합니다.

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

분리 된 HEAD 상태

git branch --mergedHEAD 상태가 분리 되면 기본 동작에 의존하는 것이 훨씬 더 중요한 결과를 가져 옵니다 .

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

이렇게하면 "foobar"와 함께 "foobar"라는 분기를 삭제했을 것입니다. 이는 거의 확실하게 원하는 결과가 아닙니다. 그러나 우리의 수정 된 명령으로 :

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

실제 삭제를 포함하여 한 줄

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

모두 자식 별칭 "스위프"에 싸여 있습니다.

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

별명은 선택적 -f플래그를 승인합니다 . 기본 동작은 마스터로 병합 된 분기 만 삭제하지만 -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).

왜 함수를 만들어야합니까? 하지인가 git config원자?
VasiliNovikov 2016 년

선택적인 '-f'인수를 처리하려면 (질문을 올바르게 이해하면)
eddies

1
하지만 어떻게 도움이 되나요? 나는 표현의 시작을 의미한다 !f(){ git branch .... 함수 선언 이지요? 왜 직접 시작하지 git branch ...않습니까?
VasiliNovikov 2016 년

1
당신 말이 맞아요 이에 따라 내 대답을 편집했습니다. 포인터 주셔서 감사합니다!
eddies 2018 년

다음은 비 강제 모드와 동일하지 않습니까? git checkout master && git branch -d `git branch --merged` && git checkout - 제외 develop하지만 삭제하는 것이 더 간단한 방법 일 수 있습니다.
Guido Bouman


18

Git 버전 2.5.0 사용 :

git branch -d `git branch --merged`

16
master브랜치 btw를 삭제할 수 있습니다 !
Wazery

4
진실. 내가 켜져있을 때만 사용합니다 master.
drautb

11
git branch -d $(git branch --merged | grep -v master)
alexg

1
흐름이 있으면 위험합니다. 마스터 <-스테이지 <-dev가 있다고 상상해보십시오. 여전히 가장 쉬운 솔루션 imo
Joseph Briggs

14

커밋을 --merged 옵션에 추가 할 수 있습니다. 이렇게하면 원점 / 마스터에 병합 된 분기 만 제거 할 수 있습니다

다음 명령은 원점에서 병합 된 분기를 제거합니다.

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

git push origin을 대체하여 제거 할 브랜치를 테스트 할 수 있습니다.

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

2
나는 시험 옵션을 좋아한다
iwein

12

다음 Ruby 스크립트를 사용하여 이미 병합 된 로컬 및 원격 분기를 삭제합니다. 여러 리모컨이있는 저장소 에서이 작업을 수행하고 하나에서만 삭제하려면 원격 목록에 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

작은 git helper 라이브러리를 위해이 tidbit를 훔쳐도 될까요? github.com/yupiq/git-branch-util
logan

1
사람들이 어떤 식 으로든 코드를 재사용하는 것에 관심이 있다면 여기에 넣지 않았을 것입니다.
mmrobins

@mmrobins 라인에 \/대한 거부 문의 시작 부분에 추가 항목 이 remote_branches있습니다. 오타입니까, 아니면 목적입니까?
Jawwad

@ mmrobins, 오, 난 b.split(/\//)지금 라인을 참조 상관 없어
Jawwad

루비 대신 바닐라 bash를 통해 기본적 으로이 작업을 수행하려는 경우 : stackoverflow.com/a/37999948/430128
Raman

11

PowerShell 콘솔에서 병합 된 분기를 삭제하는 방법

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

마스터 또는 다른 분기 이름 을 제외하려는 경우 다음 과 같이 PowerShell Select-String으로 파이프하고 결과를 git branch -d다음으로 전달할 수 있습니다 .

git branch -d $(git branch --merged | Select-String -NotMatch "master" | %{$_.ToString().Trim()})

1
더 높은 답변은 마스터 또는 다른 지점 필터링을 제안합니다. powershell에서 그렇게하려는 사람들을 위해 : git branch --merged | findstr / v "마스터"| % {git branch -d $ _. trim ()}
tredzko

@tredzko 좋은 지적입니다. FTR 더 높은 답변은 stackoverflow.com/questions/6127328/…- 링크가있는 코멘트를 다시 게시 할 수 있으며이를 삭제하겠습니다.
Ruben Bartelink

그것은 또한 삭제하려고합니다 * master:)
iesen

9

kuboon의 답변은 지점 이름에 master라는 단어가있는 지점을 삭제하지 못했습니다. 그의 대답은 다음과 같습니다.

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

물론 "마스터"분기 자체는 삭제하지 않습니다.


8

Git에는 자동으로이를 수행하는 명령이 없습니다. 그러나 Git 명령을 사용하여 필요한 것을 제공하는 스크립트를 작성할 수 있습니다. 사용중인 분기 모델에 따라 여러 가지 방법으로 수행 할 수 있습니다.

분기가 마스터에 병합되었는지 알아야하는 경우 myTopicBranch가 병합 된 경우 다음 명령이 출력을 생성하지 않습니다 (예 : 삭제할 수 있음).

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

Git branch 명령을 사용하여 Bash의 모든 분기를 구문 분석하고 모든 분기에 대해 for루프를 수행 할 수 있습니다. 이 루프에서 분기를 삭제할 수 있는지 여부를 위 명령으로 확인하십시오.



7

참고 : 이전 답변에 만족하지 않습니다 (모든 시스템에서 작동하지 않고 원격에서 작동하지 않고 --merged 분기를 지정하지 않고 정확하게 필터링하지 않음). 그래서 나는 내 자신의 대답을 추가합니다.

두 가지 주요 경우가 있습니다.

현지

당신은 원하는 지역 지점 삭제 되어 이미 다른 지역 지점에 합병을 . 삭제하는 동안 마스터, 개발 등과 같은 중요한 분기를 유지하려고합니다.

git branch --format "%(refname:short)" --merged master | grep -E -v '^master$|^feature/develop$' | xargs -n 1 git branch -d

참고 사항 :

  • git branch output --format ".."는 공백을 제거하고 정확한 grep 일치를 허용하는 것입니다.
  • grep -E대신에를 사용 egrep하므로 egrep이없는 시스템에서도 작동합니다 (예 : git for windows).
  • grep -E -v '^master$|^feature/develop$' 삭제하고 싶지 않은 로컬 브랜치를 지정하는 것입니다.
  • xargs -n 1 git branch -d: 로컬 브랜치 삭제 수행 (원격 브랜치에서는 작동하지 않음)
  • 물론 현재 체크 아웃 된 분기를 삭제하려고하면 오류가 발생합니다. 미리 마스터로 전환하는 것이 좋습니다.

당신은 할 원격 지점 삭제 되어 이미 다른 원격 지사에 합병을 . 삭제하는 동안 HEAD, master, release 등과 같은 중요한 분기를 유지하려고합니다.

git branch -r --format "%(refname:short)" --merged origin/master | grep -E -v '^*HEAD$|^*/master$|^*release' | cut -d/ -f2- | xargs -n 1 git push --delete origin

참고 사항 :

  • 원격의 경우 -r옵션을 사용하고 전체 분기 이름을 제공하십시오 .origin/master
  • grep -E -v '^*HEAD$|^*/master$|^*release' 삭제하고 싶지 않은 원격 브랜치를 일치시키는 것입니다.
  • cut -d/ -f2-: git branch명령에 의해 인쇄되는 불필요한 'origin /'접 두부를 제거하십시오 .
  • xargs -n 1 git push --delete origin : 원격 브랜치 삭제를 수행합니다.

7

Windows를 사용하는 경우 Out-GridView 가있는 Windows Powershell 또는 Powershell 7을 사용 하여 멋진 분기 목록을 만들고 삭제할 분기를 마우스로 선택할 수 있습니다.

git branch --format "%(refname:short)" --merged  | Out-GridView -PassThru | % { git branch -d $_ }

여기에 이미지 설명을 입력하십시오 확인을 클릭하면 Powershell은이 분기 이름을 전달하여 git branch -d명령을 삭제합니다. 여기에 이미지 설명을 입력하십시오


6

git-del-br tool 을 사용할 수 있습니다 .

git-del-br -a

pip사용하여 설치할 수 있습니다

pip install git-del-br

추신 : 저는이 도구의 저자입니다. 어떤 제안이나 피드백도 환영합니다.


1
@ stackoverflow.com/users/100297/martijn-pieters : 왜이 답변이 삭제되고 다운 보트 되었습니까?
tusharmakkar08

1
답변과 도구가 작동하지 않습니다. 나는 그것에 몇 시간을 보낸다. 아무것도.
SpoiledTechie.com

@ SpoiledTechie.com : 정확히 어떤 문제에 직면하고 있는지 말해 줄 수 있습니까? 정기적으로 사용하고 있습니다.
tusharmakkar08

오프라인으로 전환하려면 스크린 샷을 공유 할 수 있습니까? 그 구글 메일 일에 망친 기술자. :)
SpoiledTechie.com 16:17

5

현재있는 지점에 이미 병합 된 모든 로컬 지점을 삭제하려면 이전 답변을 기반으로 안전한 명령을 내립니다.

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

이 명령은 현재 지점 또는 마스터 지점에 영향을 미치지 않습니다. 또한 xargs의 -t 플래그를 사용하여 수행하기 전에 수행중인 작업을 알려줍니다.



5

git-flow esque 이름 지정 체계를 사용하므로 매우 안전합니다.

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

기본적으로 문자열 fix/또는로 시작하는 병합 커밋을 찾습니다 feature/.


4

다음 명령을 시도하십시오 :

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)

리모컨이 여러 개인 경우을 필터링 grep origin |하기 전에 전에 추가 cut하십시오 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

이 답변 중 일부를 기반으로 내 Bash 스크립트를 작성했습니다 !

병합 된 분기를 사용 git branch --merged하고 git 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

아래 쿼리는 저에게 효과적입니다.

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 클론에서는 잘 작동하지만 ssh 연결에서는 잘 작동하지 않습니다.


4

2018 년 7 월 기준

이것을 [alias]당신의 섹션에 추가 하십시오 ~/.gitconfig:

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

이제 git sweep필요한 정리 작업을 수행하기 위해 전화 를 걸 수 있습니다 .


나를 위해, git sweep을 호출하면 정리해야 할 가지만 나열되지만 제거하지는 않습니다.
Victor Moraes

4

git bash가 설치된 Windows에서는 egrep -v가 작동하지 않습니다.

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

여기서 grep -E -v의 상당egrep -v

사용 -d이미 제거 합병 지점 또는 -D제거 병합 가지


egrep -v가 저에게 효과적입니다. gitextensions 설치 프로그램에서 gitbash를 사용하고 있습니다
Joe Phillips

4

하나의 cmd에서 병합 된 로컬 및 원격 분기제거 하기 위해 다음 방법을 사용했습니다 .

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 파일에 이것을 저장하면 run을 실행 rmb하면 정리되고 작업에 대한 확인을 요청하는 병합 된 분기 목록이 표시됩니다. 확인을 요청하지 않도록 코드를 수정할 수는 있지만 유지하는 것이 좋습니다.


3

Git이 마스터로 병합 된 모든 브랜치를 체크 아웃하는 스크립트를 작성하십시오.

그런 다음 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

수용 된 솔루션은 꽤 좋지만 아직 원격으로 병합되지 않은 로컬 분기를 삭제하는 문제가 있습니다.

출력을 보면 다음과 같은 것을 볼 수 있습니다.

$ 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

아직 병합되지 않은 지점을 보호합니다. 또한 마스터를 보호하기위한 grepping은 필요하지 않습니다. 원격에 원점이 있고 사라진 것으로 표시되지 않기 때문입니다.


3

나를 위해 git branch --mergedGitHub 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 <(...) <(...) 괄호 안에 두 명령의 출력 차이를 제공
  • grep '<' 첫 번째 목록에는 있지만 두 번째 목록에는없는 분기를 필터링합니다.
  • cut -c 3- 3 번째 문자부터 시작하여 접두사를 제거합니다. <
  • xargs git branch -Dgit 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.