programing

병합된 Git 브랜치를 모두 삭제하려면 어떻게 해야 하나요?

lovejava 2023. 4. 14. 20:53

병합된 Git 브랜치를 모두 삭제하려면 어떻게 해야 하나요?

이미 병합된 브랜치를 삭제하려면 어떻게 해야 합니까?각 브랜치를 하나씩 삭제하는 것이 아니라 한꺼번에 삭제할 수 있습니까?

메모: 워크플로우에 master 및 dev와 같은 다른 브랜치가 있을 경우 이를 제외할 다른 브랜치를 추가할 수 있습니다.보통 "sprint-start" 태그에서 분기하여 마스터, 개발 및 QA는 상위 태그가 아닙니다.


를 리스트 (「Marge」를 사용하는 것을 ).-r모든 리모트 스위칭브런치를 일람표시합니다).

git branch --merged

삭제하지 않을 브랜치가 몇 개 표시될 수 있습니다.마스터나 개발처럼 삭제하고 싶지 않은 중요한 브랜치를 건너뛰기 위해 인수를 몇 개 추가할 수 있습니다.다음 명령어는 마스터 브랜치 및 마스터 브랜치에 dev가 있는 모든 것을 건너뜁니다.

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

건너뛸 경우 다음과 같이 egrep 명령에 추가할 수 있습니다. ★★★★★skip_branch_name삭제되지 않습니다.

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

현재 체크아웃된 분기에 이미 Marge된 모든 로컬 분기를 삭제하려면 다음 절차를 수행합니다.

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

상위인 경우 마스터와 개발은 제외됨을 알 수 있습니다.


병합된 로컬 분기를 삭제할 수 있습니다.

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

이미 병합된 원격의 모든 분기를 삭제하려면:

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

UPDATE(@oliver에 의한,코멘트에 맞지 않지만, 이미 충분한 회답이 있습니다):브런치 ABC에 있는 경우, ABC는 다음의 결과에 표시됩니다.git branch -r --merged브랜치가 지정되어 있지 않기 때문에 브랜치는 디폴트로 현재의 브랜치로 되어 있습니다.브런치는 항상 그 브랜치와 그 브랜치 사이에 차이가 없기 때문에, 그 브랜치는 항상 그 브랜치 자체에 대해서 Marge 된 것으로 간주됩니다.

그 때문에, 브랜치를 지정합니다.

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

또는 첫 번째 체크아웃 마스터:

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

Adam의 답변을 조금 더 연장해 보겠습니다.

을 Git 하려면 , 「Git」를 실행합니다.git config -e --global

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

간단한 할 수 .git cleanup.

이 부분은 게 것 같아요.master,main&develop런치입입니니다

로컬 git 클리어:

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

원격 GIT 지우기:

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

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

git fetch -p

마스터를 제외한 모든 병합된 분기도 삭제됩니다.

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

Windows를 사용하고 있으며 PowerShell 스크립트를 선호하는 사용자는 다음과 같이 로컬에서 병합된 지점을 삭제합니다.

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

또는 단축 버전:

git branch --merged | %{$_.trim()}  | ?{$_ -notmatch 'dev' -and $_ -notmatch 'master' -and $_ -notmatch 'main'} | %{git branch -d $_.trim()}

아담의 대답을 몇 년째 쓰고 있어요다만, 기대했던 대로 동작하지 않는 경우도 있습니다.

  1. "master"라는 단어를 포함하는 브랜치는 마스터 브랜치뿐만 아니라 "notmaster" 또는 "masterful"과 같이 무시되었다.
  2. "dev"라는 단어가 포함된 브랜치는 개발 브랜치뿐만 아니라 "dev-test"와 같이 무시되었습니다.
  3. 현재 브랜치의 HEAD에서 도달할 수 있는 브랜치 삭제(마스터일 필요는 없음)
  4. 분리된 HEAD 상태에서 현재 커밋에서 도달 가능한 모든 브랜치 삭제

1과 2는 regex를 변경하는 것만으로 간단하게 대처할 수 있었습니다.3은 원하는 컨텍스트에 따라 달라집니다(마스터에 병합되지 않은 브랜치만 삭제하거나 현재 브랜치에 대해 삭제). 4로 할 수 ).git reflog"HEAD" "HEAD" "HEAD" "HEAD" "HEAD" "HEAD" "HEAD" "HEAD" 입니다.

마지막으로, 이 모든 것을 1개의 라인(Bash|Ruby|)으로 하고 싶다고 생각하고 있었습니다.Python) 스크립트.

TL;DR

인 "sweep" git을 사용할 수 있는 git .-f 삭제:

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를 작성하는 것이 가장 쉬웠습니다.

단일 커밋으로 새 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

원하는 동작: 마스터, 개발 또는 현재를 제외한 모든 병합된 브랜치를 선택합니다.

원래 regex에서 "masterful" 및 "notmaster" 브랜치가 누락되었습니다.

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

갱신된 regex (이제 "dev"가 아닌 "develope"가 제외됨)를 사용하는 경우:

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"가 포함됩니다.

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 rev-parse를 사용하는 다음 변종이 좋습니다.

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

분리 헤드 상태

git branch --merged분리된 헤드 상태에서는 더욱 중대한 결과를 초래합니다.

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

이렇게 하면 제가 방금 있던 지점인 "foo"와 "foo"가 삭제될 것입니다. 이는 거의 확실히 바람직한 결과가 아닙니다.단, 개정된 명령어를 사용하면 다음과 같습니다.

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 별칭 "sweep"로 포장됩니다.

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 Sweep는 이것을 잘 해낸다.

Git 버전 2.5.0 사용:

git branch -d `git branch --merged`

Windows 를 사용하고 있는 경우는, Windows Powershell 또는 Powershell 7 와 Out-GridView 를 사용하고, 삭제할 브랜치 리스트를 마우스로 선택할 수 있습니다.

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

여기에 이미지 설명 입력 OK Powershell을 클릭하면 이 브랜치 이름이 에 전달됩니다.git branch -d명령 및 삭제

--merge 옵션에 커밋을 추가할 수 있습니다.이렇게 하면 오리진/마스터와 같이 병합된 브랜치만 제거할 수 있습니다.

다음 명령을 실행하면 병합된 분기가 오리진에서 제거됩니다.

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

git push origin --delete with echo 대신 어떤 브랜치가 삭제되는지 테스트할 수 있습니다.

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

내가 좋아하는 간단한 스크립트:

git branch --merged | grep -E -v "(master|main|develop|other)" | xargs git branch -d

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

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()})

주의: 이전 답변에 만족하지 않습니다(일부 시스템에서 작동하지 않거나, 원격에서 작동하지 않거나, --merge 브랜치를 지정하지 않거나, 필터링을 하지 않습니다).그래서 저만의 답을 덧붙입니다.

크게 두 가지 경우가 있습니다.

현지의

이미 다른 로컬 분기에 병합로컬 분기를 삭제하려고 합니다.삭제 중에는 마스터, 개발 등의 중요한 브랜치를 유지할 수 있습니다.

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대신 사용됩니다. egrepegrep ( git ) 。
  • grep -E -v '^master$|^feature/develop$'입니다.
  • xargs -n 1 git branch -d브랜치를 로컬 브랜치를 삭제합니다(리모트 브랜치에서는 동작하지 않습니다).
  • 물론 현재 체크아웃된 지점을 삭제하려고 하면 오류가 발생합니다.그래서 미리 마스터로 전환하는 것이 좋습니다.

원격의

이미 다른 원격 분기에 병합원격 분기를 삭제하려고 합니다.삭제 중에는 HEAD, 마스터, 릴리스 등 중요한 브랜치를 유지할 필요가 있습니다.

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-에 출력되는 'contificate를 삭제합니다.git branch명령어를 입력합니다.
  • xargs -n 1 git push --delete origin 브랜치를 이치노

하시면 됩니다.gbdagit 플러그인과 함께 OhMyZSH를 사용하는 경우 에일리어스.

나는 이것을 사용한다.

git branch --delete $(git branch --format '%(refname:short)' --merged | grep --invert-match 'main\|master\|branch-to-skip')

지정된 형식으로 분기된 모든 병합 목록을 나열한 다음 git branch --delete에 해당 목록을 제공합니다.

Kuboon의 답변은 지점 이름에 master라는 단어가 있는 지점을 삭제하는 것을 놓쳤습니다.그의 답변은 다음과 같습니다.

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

물론 "master" 브랜치 자체는 삭제되지 않습니다.

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

myTopicBranch가 마스터에 병합되었는지 여부를 확인해야 하는 경우(즉, 삭제할 수 있음) 다음 명령어는 출력을 출력하지 않습니다.

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

하고 Git 브랜치를 할 수 .for모든 브랜치에 루프합니다.이 루프에서는 위의 명령어로 브랜치를 삭제할 수 있는지 여부를 확인합니다.

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d/또는 "지점"을 합니다.master.

명령어를 이해하고 싶은 사람에게 도움이 되는 기사: Steven Harman의 Git Clean: Delete Already Merged Branchs.

하시면 됩니다.git-del-br 에 액세스 할 수 있습니다.

git-del-br -a

할 수 있는 것은, 인스톨 할 수 있습니다.pip.

pip install git-del-br

추신: 저는 그 도구의 제작자입니다.어떠한 제안/피드백도 환영합니다.

저는 git-flow esque 명명 방식을 사용하기 때문에 매우 안전하게 동작합니다.

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

으로는 어느 하나의 .fix/ ★★★★★★★★★★★★★★★★★」feature/.

인정된 솔루션은 매우 좋지만 리모트로 아직 통합되지 않은 로컬브런치도 삭제해야 한다는 단 하나의 문제가 있습니다.

결과물을 보시면 다음과 같은 것을 보실 수 있습니다.

$ 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)

★★★★★bla ★★★★★★★★★★★★★★★★★」issue_248자자삭

'아예'라는 도 볼 수중에 '아예'라는 요.[gone]리모트에 푸시된 브랜치(현재 없어짐)를 나타내므로 브랜치를 삭제할 수 있습니다.

따라서 원래 답변은 (줄 길이를 줄이려면 여러 줄로 분할)로 변경할 수 있습니다.

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

아직 통합되지 않은 브랜치를 보호합니다.또한 마스터를 보호하기 위한 그리핑은 필요하지 않습니다.리모트는 원래 위치에 있어 없어졌다고 표시되지 않기 때문입니다.

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(손톱을 제거하다

현재 있는 브랜치에 이미 Marge되어 있는 모든 로컬브런치를 삭제하려면 이전 답변을 바탕으로 안전한 명령어가 준비되어 있습니다.

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

이 명령어는 현재 브랜치 또는 마스터 브랜치에는 영향을 주지 않습니다.또한 xargs의 -t 플래그를 사용하여 실행 전에 무엇을 하는지 알려줍니다.

Adam의 업데이트된 답변의 별칭 버전:

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

또, 복잡한 에일리어스를 회피하기 위한 힌트에 대해서는, 다음의 회답을 참조해 주세요.

아래 조회가 유효합니다.

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 접속에서는 그다지 동작하지 않습니다.

다음 명령을 사용해 보십시오.

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츠키다

.~/.gitconfigfilename을 클릭합니다.

, 부부 by by by by in부부 in in in in in 。git reflog을 사용법

이 답변들 중 몇 가지를 바탕으로 저도 Bash 스크립트를 만들어 봤습니다!

it it를 한다.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
}

2018.07 기준

을 더하면 됩니다.[alias]~/.gitconfig:

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

그냥 .git sweep을 사용법

언급URL : https://stackoverflow.com/questions/6127328/how-do-i-delete-all-git-branches-which-have-been-merged