현재 지점을 제외한 모든 로컬 지점을 삭제할 수 있습니까?


95

출력에 나열된 모든 분기를 삭제하고 싶습니다.

$ git branch

...하지만 한 단계로 현재 분기를 유지 합니다 . 가능합니까? 그렇다면 어떻게?




답변:


66

@pankijs 답변에 따라 두 개의 git 별칭을 만들었습니다.

[alias]
    # Delete all local branches but master and the current one, only if they are fully merged with master.
    br-delete-useless = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
    }; f"
    # Delete all local branches but master and the current one.
    br-delete-useless-force = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
    }; f"

추가 예정 ~/.gitconfig


그리고 @torek이 지적했듯이 :

소문자 -d는 "완전히 병합되지 않은"분기를 삭제하지 않습니다 (문서 참조). 을 사용 -D 하면 이러한 분기가 삭제 됩니다. 이로 인해 커밋이 "손실"되는 경우에도 마찬가지입니다. 이 방법을 사용 하면 분기 리플 로그도 삭제되므로 일반적인 "실수로 인한 삭제에서 복구"항목도 작동하지 않습니다.

기본적으로 -force중요한 것을 잃지 않을 것이라고 300 % 확신하지 않는다면 절대로 버전을 사용하지 마십시오 . 영원히 잃어 버렸기 때문 입니다.


2
삭제 된 브랜치에 대한 커밋은 잠시 동안 리플 로그에 남아 있어야합니다.
CaptRespect 2011

실제로 커밋은 리플 로그에 남아 있습니다. 그러나 가지 자체는 아닙니다. 시도하지 않겠지 만 커밋을 찾을 수 있지만 분기 상태로 돌아가시겠습니까? 나는 그렇게 의심한다. Cherry-pick은 삭제 된 분기에서 커밋을 검색하는 데 사용할 수 있지만 분기 자체를 복원 할 수는 없습니다.
Vadorequest

1
@Vadorequest 당신은 수행하여 특정 커밋을 가리키는 지점을 다시 만들 수 있습니다git branch branchname commitid
pqnet

@pqnet 그 지점에 대한 모든 역사를 다시 만들지 몰랐습니다. 감사합니다.
Vadorequest

1
@Vadorequest 커밋 이후 개체는 모든 편집 (다른 해시와) 새로운 객체를 만들 필요 불변 (및 해시로 인덱싱)입니다
pqnet

180
$ git branch | grep -v "master" | xargs git branch -D 

마스터를 제외한 모든 브랜치를 삭제합니다 (마스터를 유지하려는 브랜치로 교체하지만 마스터는 삭제됩니다)


30
현재 분기 를 유지 하려면 grep -v ^*.
Schwern

2
많은 소스는 나에게이 스크립트를 보여,하지만 난 항상 말해 실행할 때 가지 :( 찾을 수없는 것을
tucq88

1
이것은 정확하지 않습니다. master-copy예를
들어라

2
예를 들어 필요에 따라 정규식을 조정합니다.grep -v "^ *master$"
Brad Koch

8
두 개의 분기를 유지하려면 grep -v "master\|my-other-branch".
Derek Soike 2018

18

먼저 (유지하려는 브랜치> ex : master로 전환 ) :

git checkout master

두 번째 ( 마스터있는지 확인하십시오 )

git branch -D $(git branch)

3
매우 빠르고 쉽습니다. 왜 이것이 찬성되지 않습니까?
princebillyGK

1
그것은 나에게 가장 간단하고 최고의 대답입니다.
Saleh Enam Shohag

1
PowerShell을 사용하는 경우 git branch -D $(git branch).Trim().
NatoBoram

13

git branch -d (또는 -D )은 여러 브랜치 이름을 허용하지만, 최소한 약간의 코드를 작성하지 않고 "지금 내가있는 브랜치를 제외한 모든 로컬 브랜치"를 자동으로 제공하는 것은 약간 까다 롭습니다.

"가장 좋은"(공식적으로 올바른) 방법은 git for-each-ref분기 이름을 가져 오는 데 사용 하는 것입니다.

git for-each-ref --format '%(refname:short)' refs/heads

하지만 어느 브랜치에 있는지 알아 내기가 훨씬 더 어렵습니다 ( git symbolic-ref HEAD멋진 스크립트를 작성하려는 경우 "공식적으로 올바른"방법입니다).

더 편리하게 사용할 수 있습니다. git branch, 두 개의 공백 또는 (현재 분기의 경우) 별표가 앞에있는 로컬 분기 이름을 인쇄합니다 *. 따라서 *버전 을 제거하기 위해 이것을 실행하면 공백으로 구분 된 브랜치 이름이 남습니다. 그러면 다음으로 전달할 수 있습니다 git branch -d.

git branch -d $(git branch | grep -v '^*')

또는:

git branch | grep -v '^*' | xargs git branch -d

소문자 -d는 "완전히 병합되지 않은"분기를 삭제하지 않습니다 (문서 참조). 을 사용 -D하면 커밋이 "손실"되더라도 그러한 분기가 삭제됩니다. 이 방법을 사용하면 분기 리플 로그도 삭제되므로 일반적인 "실수로 인한 삭제에서 복구"항목도 작동하지 않습니다.


git branch -D $(git branch | grep -v '^*')병합 된 분기를 삭제하려면 이어야합니다 .
Pratik Singhal 2018 년

@PratikSinghal : Git이 "병합 된"것으로 간주하는 분기뿐만 아니라 다른 모든 분기 를 삭제 합니다 . 이것은 좋은 생각이 아닙니다. 나는 이미 내 대답 에서이 두 항목을 모두 지적했습니다.
torek

12

병합 된 모든 분기를 제거하려면 (current 제외 -v ‘*’) :

git branch --merged | grep -v '*' | xargs git branch -D

또한 repo 완전한 정리에 대한 명령을 만들었습니다.

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

여기 에서 가져 왔습니다 .


1
병합 된 분기 만 삭제됩니다.
Pratik Singhal 2018 년

10

특정 분기를 제외한 모든 분기 삭제 :

git branch | grep -v "branch name" | xargs git branch -D

개발마스터를 제외한 모든 로컬 분기 삭제

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

6

Windows의 경우 Powershell에서 다음을 사용합니다.

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }

4

병합 된 모든 분기를 로컬에서 삭제합니다.

git branch -D `git branch --merged | grep -v \* | xargs`

특정 분기를 제외한 모든 분기 삭제 :

git branch | grep -v "branch name" | xargs git branch -D

개발마스터를 제외한 모든 로컬 분기 삭제

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

3

한 번 내 Windows 환경을 위해이 구성을 만들었습니다. 다른 사람에게 도움이 될 수도 있습니다. 실행 중에 마스터 및 현재 분기는 삭제되지 않습니다 . 다른 병합 된 분기는 모두 삭제됩니다.

@echo off
cd PATH_TO_YOUR_REPO

REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%

REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
    endlocal
)

REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
    git branch -D %%a
)

REM -- remove temp-file with branch information inside
DEL %textFile%

REM -- show local branches after the cleaning
echo Local branches:
git branch

pause 
exit

3

현재 분기를 제외한 모든 분기를 한 번에 삭제하려면 :

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D


2

git branch현재 분기가 접두사로 표시된 것으로 가정 합니다 *. Powershell을 사용하면 다음 하나의 라이너가 *.

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = Where-Object

% = Foreach-Object


1

그래서 여기에 하드 코딩 된 브랜치 이름이 많이 보입니다. 여기 내 대답은 질문의 "현재 브랜치"부분에 더 정확하면서도 한 줄로 유지하고 저와 같은 초보자를 괴롭히기 쉽습니다. 정당한 곳에 크레딧을두기 위해 대답은 분명히 @pankijs의 대답을 기반으로합니다.

git branch | grep -v $(git branch --show-current) | xargs git branch -d

그리고 데비안의 .bash_aliases에서도 한 줄에 별칭이 지정되었습니다.

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(일부 명령 줄에서 하위 명령을 실행하려면 일부 bash 기능을 활성화해야한다고 생각하지만)


1

삭제하고 싶지 않은 부분에 대해 더 선택 적이기 때문에 이것을 사용합니다. 아래 명령은 master, develop 및 현재 분기를 제외한 모든 분기를 제거합니다.

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

그래서 나는 이것을 내 ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches

0

IMHO, 로컬 지점을 제거하는 가장 안전한 방법은 다음과 같습니다.

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

또한이 주제와 관련된 더 많은 정보를 찾을 수 있습니다. 모든 로컬 git 브랜치 삭제


gone사용할 마커 를 인쇄 하려면 -vv(두 번 자세하게 표시) -a도움이되지 않습니다 (원격 브랜치도 나열)
pqnet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.