출력에 나열된 모든 분기를 삭제하고 싶습니다.
$ git branch
...하지만 한 단계로 현재 분기를 유지 합니다 . 가능합니까? 그렇다면 어떻게?
출력에 나열된 모든 분기를 삭제하고 싶습니다.
$ git branch
...하지만 한 단계로 현재 분기를 유지 합니다 . 가능합니까? 그렇다면 어떻게?
답변:
@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 % 확신하지 않는다면 절대로 버전을 사용하지 마십시오 . 영원히 잃어 버렸기 때문 입니다.
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
마스터를 제외한 모든 브랜치를 삭제합니다 (마스터를 유지하려는 브랜치로 교체하지만 마스터는 삭제됩니다)
grep -v ^*
.
master-copy
예를
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
먼저 (유지하려는 브랜치> ex : master로 전환 ) :
git checkout master
두 번째 ( 마스터 에 있는지 확인하십시오 )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
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 '^*')
병합 된 분기를 삭제하려면 이어야합니다 .
한 번 내 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
그래서 여기에 하드 코딩 된 브랜치 이름이 많이 보입니다. 여기 내 대답은 질문의 "현재 브랜치"부분에 더 정확하면서도 한 줄로 유지하고 저와 같은 초보자를 괴롭히기 쉽습니다. 정당한 곳에 크레딧을두기 위해 대답은 분명히 @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 기능을 활성화해야한다고 생각하지만)
삭제하고 싶지 않은 부분에 대해 더 선택 적이기 때문에 이것을 사용합니다. 아래 명령은 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
IMHO, 로컬 지점을 제거하는 가장 안전한 방법은 다음과 같습니다.
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
또한이 주제와 관련된 더 많은 정보를 찾을 수 있습니다. 모든 로컬 git 브랜치 삭제
gone
사용할 마커 를 인쇄 하려면 -vv
(두 번 자세하게 표시) -a
도움이되지 않습니다 (원격 브랜치도 나열)