병합 된 모든 Git 브랜치는 어떻게 삭제합니까?


Answers

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

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
Question

나는 많은 Git 지점이있다. 이미 병합 된 분기는 어떻게 삭제합니까? 하나씩 삭제하는 대신 모두 삭제하는 쉬운 방법이 있습니까?




Git 버전 2.5.0 사용 :

git branch -d `git branch --merged`



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

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



for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \ 
git branch -D $b; done && git fetch -p



나는 git-flow esque 명명 스키마를 사용하기 때문에 매우 안전하게 작동한다.

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

기본적으로 문자열 fix/ 또는 feature/ 시작하는 병합 된 커밋을 찾습니다.




git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d 는 현재 체크 아웃 된 분기 및 / 또는 master 제외한 모든 로컬 분기를 삭제합니다.

다음은 이러한 명령을 이해하려는 사람들을위한 유용한 문서입니다. Git Clean : 이미 병합 된 지점 삭제, Steven Harman




마스터 브랜치에 병합 된 브랜치를 삭제하려면 다음 별칭 ( git config -e --global )을 사용하고 있습니다 :

cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D"

error: The branch 'some-branch' is not fully merged. 를 피하기 위해 git branch -D 를 사용하고 있습니다 error: The branch 'some-branch' is not fully merged. 메시지는 현재의 체크 아웃이 마스터 브랜치와 다릅니다.




다음 명령을 시도하십시오.

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 | origin 만 필터링하기 전에 cut 냅니다.

위의 명령이 실패하면 병합 된 원격 추적 분기를 먼저 삭제하십시오.

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

그런 다음 리모컨을 다시 git fetch 이전의 git push -vd 명령을 다시 사용하십시오.

자주 사용하는 경우 ~/.gitconfig 파일에 별칭을 추가하는 것이 좋습니다.

실수로 일부 브랜치를 제거한 경우, git reflog 를 사용하여 손실 된 커밋을 찾으십시오.




HubFlow 또는 GitFlow와 같은 분기 모델을 사용하는 경우이 명령을 사용하여 병합 된 기능 분기를 제거 할 수 있습니다.

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




PowerShell 콘솔에서 병합 된 분기를 삭제하는 방법

git branch --merged | %{git branch -d $_.Trim()}

Windows 용 GitHub 보기




아래 쿼리는 저에게 효과적입니다.

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 clone보다 잘 작동하지만 ssh 연결에는 적합하지 않습니다.




내 Bash 스크립트 기여 는 mmrobin의 대답 에 느슨하게 기반합니다.

include 및 excludes를 지정하거나 두 가지 대신 로컬 또는 원격 브랜치만을 검사 / 제거하는 데 유용한 매개 변수가 필요합니다.

#!/bin/bash

# exclude branches regex, configure as "(branch1|branch2|etc)$"
excludes_default="(master|next|ag/doc-updates)$"
excludes="__NOTHING__"
includes=
merged="--merged"
local=1
remote=1

while [ $# -gt 0 ]; do
  case "$1" in
  -i) shift; includes="$includes $1" ;;
  -e) shift; excludes="$1" ;;
  --no-local) local=0 ;;
  --no-remote) remote=0 ;;
  --all) merged= ;;
  *) echo "Unknown argument $1"; exit 1 ;;
  esac
  shift   # next option
done

if [ "$includes" == "" ]; then
  includes=".*"
else
  includes="($(echo $includes | sed -e 's/ /|/g'))"
fi

current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
  echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching branches...\n"

git remote update --prune
remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
  echo "No existing branches have been merged into $current_branch."
else
  echo "This will remove the following branches:"
  if [ "$remote" == 1 -a -n "$remote_branches" ]; then
    echo "$remote_branches"
  fi
  if [ "$local" == 1 -a -n "$local_branches" ]; then
    echo "$local_branches"
  fi
  read -p "Continue? (y/n): " -n 1 choice
  echo
  if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
    if [ "$remote" == 1 ]; then
      remotes=$(git remote)
      # Remove remote branches
      for remote in $remotes
      do
        branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n')
        git push $remote $branches
      done
    fi

    if [ "$local" == 1 ]; then
      # Remove local branches
      locals=$(echo "$local_branches" | sed 's/origin\///g' | tr -d '\n')
      if [ -z "$locals" ]; then
        echo "No branches removed."
      else
        git branch -d $(echo "$locals" | tr -d '\n')
      fi
    fi
  fi
fi



별칭의 아담 업데이트 답변 :

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

또한 복잡한 별칭을 이스케이프 처리하는 데 유용한 팁을 보려면 이 대답 을 참조하십시오.




--merged 옵션에 커밋을 추가 할 수 있습니다. 이 방법을 사용하면 병합 된 분기 즉 원본 / 마스터 만 제거 할 수 있습니다.

다음 명령은 원본에서 병합 된 분기를 제거합니다.

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



Windows에서 PowerShell 스크립트를 선호하는 사용자는 다음과 같이 로컬 병합 분기를 삭제합니다.

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



Links