원격 저장소에서 로컬 Git 브랜치를 삭제 한 후 삭제


162

로컬 및 원격 리포지토리를 항상 브랜치 측면에서 동기화하고 싶습니다.

GitHub에 대한 풀 요청 검토 후 분기를 병합하고 제거합니다 (원격). 로컬 리포지토리에서이 정보를 가져 와서 Git이 로컬 버전의 브랜치를 제거하도록하려면 어떻게해야합니까?


원격 추적 지점, 로컬 지점 또는 둘 다를 삭제 하시겠습니까? 실제로 삭제 된 모든 원격 브랜치를 가져 오는 별명 (bash 또는 git)을 작성하고 한 번의 명령으로 모두 삭제할 로컬 사본을 찾을 수 있습니다.

아마 뭔가을 마련하기 위해 다음 명령을 사용하려고 git ls-remote하고 git show-ref.

또한, 당신은 체크 아웃 할 수 있습니다 git symbolic-refgit update-ref.

도와 주셔서 감사합니다. 다른 곳에서 답을 찾았습니다. 내 답변을 참조하십시오.
sf89

답변:


180

빠른 길

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

주의 :에 있지 않으면 master분기를 삭제할 가능성이 있습니다. "더 나은 방법"을 계속 읽으십시오.

우리는 주인을 유지해야합니다

당신을 확인 할 수 있습니다 master, 또는 그 문제에 대한 다른 지점에 의해 제거되지 않는 grep이상 보내고. 이 경우 당신은 갈 것입니다 :

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

그래서 만약 우리가 유지하고 싶어 master, develop그리고 staging예를 들어, 우리는 갈 것입니다 :

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

이것을 별명으로 만드십시오

약간 길기 때문에 .zshrc또는에 별칭을 추가 할 수 있습니다 .bashrc. 내 이름은 gbpurge( git branches purge)입니다.

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

그런 다음 다시로드하여 .bashrc.zshrc:

. ~/.bashrc

또는

. ~/.zshrc

명령을 별명에 넣고 단일 명령으로 만들 수 있습니다. 때문에, branchA는 자기가 아닌 배관 명령 , 그것을 깰 수 망할 놈의 미래 버전의 모든 UI 변경에 대한 조심.

1
완전한! Github Workflow에 이어 로컬 브랜치 master가 삭제됩니다.
Rubens Mariuzzo 2012

아니, 그것이 거기에 머무르고 있다고 확신합니다 (매일 사용하고 있으며 그렇게하지 않는 것 같습니다).
sf89

4
참고 여러 지점을 유지하려면 다음과 같이 단일 그렙을 사용할 수 있습니다. grep -Ev '(\*|master|important-branch)'
Andrew Burns

4
이것을 ~/.gitconfig대신 넣으려면 다음을 [alias]섹션에 추가 하십시오 : gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"(grep 표현식에서 ()을 사용할 필요가 없습니다).
dskrvk

82

나는 GitHub와 동일한 흐름을 사용하고 git branch --merged병합 된 분기 목록으로 저를 만족시키는 이전 답변을 찾지 못했습니다 .하지만 모든 경우 원격으로 제거되지 않았습니다. 그래서 이것은 나를 위해 일했습니다 :

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

어디:

  • git fetch --all -p: 로컬 지점 상태 업데이트
  • git branch -vv: 현지 지사 상태 표시
  • grep ": gone]": 삭제 된 필터
  • awk '{ print $1 }': 그들의 이름을 추출
  • xargs -n 1 git branch -d: 이름을 삭제 명령에 전달

참고 : 원하는 경우 -d 대신 -D를 사용하면 삭제가 적용됩니다.

예를 들면 다음과 같습니다.

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

참고:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches


3
나는 항상 마스터에 대항하여 그렇게 할 수 있도록 자유를 얻었습니다. 따라서 git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d 대본과 설명, 감사합니다 :)
Miguelgraz

branch -vv지점의 마지막 커밋 메시지 를 보여줍니다. 그 메시지에 "사라진"문제가 발생하면 grep gone해당 지점에도 영향을 미칩니다. 따라서 grep ": gone]"사용하기에 조금 더 안전 할 것입니다.
chawkinsuf

1
이것이 실제 질문에 대한 답변입니다. 감사합니다.
Andrei Gladkyi

1
더 나은 :awk '$3 $4 ~ /:gone]$/ { print $1 }'
야쿱 Bochenski

3
-D대신에 필요한 것 외에도 -d완벽한 답이 있습니다!
Cas

72

시험:

자식 풀-정리

해당 원격 지점이 삭제되면 로컬 지점을 삭제합니다.

업데이트 :

위의 진술은 정확하지 않습니다.

실제로 달리기 git pull --prune는 다음 과 같은 원격 추적 분기 만 제거합니다.

리모컨 / 원산지 / fff
리모컨 / 원산지 / 개발
리모컨 / 원산지 / 마스터

그런 다음 git branch -r컴퓨터에 남아있는 원격 추적 분기를 확인하기 위해 실행할 수 있습니다 . 왼쪽 가지가 다음과 같다고 가정하십시오.

출발지 / 개발자
출발지 / 마스터

이는 지점 origin/fff이 삭제 되었음을 의미합니다 .

따라서을 실행 한 후 다음을 실행하십시오 git pull --prune.

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

다음과 같은 모든 현지 지점을 찾을 수 있습니다.

  1. 더 이상 해당하는 원격 분기가 없습니다.
  2. 안전하게 제거 할 수 있습니다.

그런 다음 <the command above> | xargs git branch -d모두 삭제할 수 있습니다.


42
이 답변은 정확하지 않습니다. --prune플래그는 원격 추적 지점이 아닌 현지 지점을 삭제합니다.

3
@Cupcake와 동의하면 여기에서 원하는 것을 얻을 수 없습니다.
sf89

6
공감하지는 않지만 로컬 분기를 삭제 한 다음 GitHub에서 삭제 한 후에도 여전히 git remote -v 명령에 원격으로 존재합니다.
Spechal

8
당신은 또한 할 수 있습니다 git fetch --prune, 그것은 나의 선택입니다
e_m0ney

1
스택 오버플로에 대한 조언에서 또 다른 Git 오류가 git pull --prune발생했습니다 . 명령 행에 분기를 지정해야합니다. "
jww

23

허용되는 솔루션으로 마스터개발 분기를 삭제하지 않도록해야합니다 .

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d

16

powershell을 사용하는 사람들에게는 의 답변과 같습니다 .

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. 사라진 것으로 표시된 모든 가지를 필터링합니다.
  2. git branch -D발견 된 각 지점에 전화

6

이 중 어느 것도 나를 위해 일하지 않았습니다. https://stackoverflow.com/a/34969726/550454 에서 내 다른 대답을 볼 수 있습니다.

그러나 본질적으로, 나는 이제 이것을 내 안에 가지고 있습니다 ~/.gitconfig:

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d

5

매우 간단한 해결책 : 로컬 저장소를 제거하고 원격을 새로 복제하십시오. 매우 우아해 보이지는 않지만 간단하지만 매뉴얼 페이지를 읽지 않고 현재하고있는 것을 정확하게 이해할 수 있습니다 :-).


1
왜 다운 보트가 그렇게 많은가? 나는 특히 더 큰 repos에서는 분명히 효율적이지 않지만 OP가 요구 한 것을 수행합니다. 이것을하지 않는 다른 이유가 있습니까?
3ocene

6
당신은 당신의 모든 지방 지점, 숨겨지지 않은 커밋되지 않은 커밋을 잃을 것입니다 ... 그것은 다이너마이트와 낚시와 같습니다.
sevenseacat

1
작업중 인 랩톱이 손상되거나 분실되거나 도난 당했을 때도 마찬가지입니다. 따라서 로컬에서 중요한 것을 유지하지 않는 경향이 있습니다. 작은 기능의 경우에도 지점을 만들고 밀어 넣고 더 이상 유용하지 않은 후에 삭제하는 것이 더 좋습니다.

1

해당 원격 분기가없는 모든 로컬 분기를 나열하기 위해이 단일 라이너를 작성했습니다.

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

이 작업이 끝나면 다음과 같이 로컬 분기를 쉽게 삭제할 수 있습니다 xargs.

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d

이것은 나도 나열하고 master있으며 예상대로 작동하지 않습니다. 조심
Enrico

1

병합 된 로컬 브랜치를 제거하기 위해 그렇게합니다.

git branch -d $(git branch --merged)

존재하지 않는 추적도 제거하려는 경우 :

git pull --prune

1

브랜치를 푸시하고 마스터로 병합 한 경우 git bash에서 다음을 수행하십시오.

git branch -d branch_name_to_delete

당신이 현재 그 지점에 있다면 그것은 당신을 다시 마스터로 밀어 줄 것입니다. 이 시점에서

git pull

-2

투표 된 답변은 마스터를 삭제할 가능성이 있습니다. 아래 실제 예를 구성하십시오.

나는 hemen_README와 hemen_BASEBOX의 두 가지 기능 분기를 개발에 병합 한 다음 개발을 마스터로 병합했습니다. hemen_README 및 hemen_BASEBOX 기능 분기는 원격으로 삭제되었지만 여전히 로컬로 표시되었습니다. 또한 나는 로컬 마스터가 아니지만 개발 중입니다.

이 경우

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                      671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
        hemen_README                 ba87489 Updated Readme with considerable details
        master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
        remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
        remotes/origin/master        2f093ce Merged in develop (pull request #3)

따라서 위의 부분 명령을 실행하면

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

마스터도 표시되어 결국 삭제됩니다.

어쨌든 나는 그것을 할 수있었습니다. 내가 달성 한 방법에 대해 세션 로그를 공유하고 있습니다.

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README

방금 whay가 가지 치기를 한 다음 정리했습니다. 아래의 분기 명령을 살펴보면 리모컨을 관리했습니다.

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
        hemen_README           ba87489 Updated Readme with considerable details
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

이제 현지 지점을 삭제하십시오.

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).

이제는 가지가 원하는대로 좋습니다.

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

물론 마스터를 삭제할 가능성이 있습니다. 질문을주의 깊게 읽으십시오. 내가 말했듯이, 나는 지역의 물건을 정리할 방법이 필요했습니다. 이는 더 이상 원격에 존재하지 않는 모든 분기를 삭제하는 것을 의미합니다. 마스터가 더 이상 존재하지 않으면 로컬 컴퓨터에서도 사라집니다.
sf89
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.