병합된 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()}
아담의 대답을 몇 년째 쓰고 있어요다만, 기대했던 대로 동작하지 않는 경우도 있습니다.
- "master"라는 단어를 포함하는 브랜치는 마스터 브랜치뿐만 아니라 "notmaster" 또는 "masterful"과 같이 무시되었다.
- "dev"라는 단어가 포함된 브랜치는 개발 브랜치뿐만 아니라 "dev-test"와 같이 무시되었습니다.
- 현재 브랜치의 HEAD에서 도달할 수 있는 브랜치 삭제(마스터일 필요는 없음)
- 분리된 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
대신 사용됩니다.egrep
egrep ( 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
브랜치를 이치노
하시면 됩니다.gbda
git 플러그인과 함께 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 플래그를 사용하여 실행 전에 무엇을 하는지 알려줍니다.
[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
츠키다
.~/.gitconfig
filename을 클릭합니다.
, 부부 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
'programing' 카테고리의 다른 글
Swift Array - 인덱스가 존재하는지 확인합니다. (0) | 2023.04.14 |
---|---|
git 마크를 삭제한 파일과 새로운 파일을 파일 이동으로 만드는 방법 (0) | 2023.04.14 |
Bash에서 테이블 열을 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
Windows 콘솔에서 cURL 명령 실행 (0) | 2023.04.14 |
IndexError: 배열에 대한 인덱스가 너무 많습니다. (0) | 2023.04.14 |