github branch 생성 - 병합 된 모든 Git 브랜치는 어떻게 삭제합니까?





15 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
변경 전환 remote

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




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

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" )} |
    ForEach-Object { 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



다음 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()}

Windows 용 GitHub 보기




저는 몇 년 동안 아담의 대답을 사용했습니다. 즉, 예상대로 작동하지 않는 경우가 있습니다.

  1. 마스터 브랜치가 아니라 "마스터"라는 단어가 포함 된 브랜치는 무시되었습니다 (예 : "notmaster"또는 "masterful").
  2. "dev"라는 단어가 포함 된 가지는 무시되었습니다. 예를 들어 dev 브랜치가 아니라 "dev-test"
  3. 현재 분기의 HEAD에서 도달 할 수있는 분기 삭제 (즉, 반드시 마스터 일 필요는 없음)
  4. 분리 된 HEAD 상태에서 현재 커밋에서 도달 할 수있는 모든 분기 삭제

1과 2는 정규식을 변경하기 만하면 간단합니다. 3은 원하는 컨텍스트에 따라 달라집니다 (즉, 마스터 또는 현재 분기에 병합되지 않은 분기 만 삭제). 4는 의도하지 않게 분리 된 HEAD 상태에서 실행하면 재앙이 될 가능성이 있습니다 ( git reflog 복구 할 수 있음).

마지막으로, 나는이 스크립트를 별도의 (Bash | Ruby | Python) 스크립트가 필요없는 한 줄짜리로 만들고 싶었습니다.

TL, DR

선택적 -f 플래그를 허용하는 git 별명 "sweep"을 작성하십시오.

git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

그것을 다음과 같이 호출하십시오 :

git sweep

또는:

git sweep -f

길고 상세한 대답

일부 브랜치와 함께 git repo 예제를 작성하고 올바른 동작을 테스트하는 것이 가장 쉽습니다.

단일 커밋으로 새로운 자식 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

원하는 동작 : 마스터, 개발 또는 현재를 제외한 모든 병합 분기 선택

원래의 정규 표현식은 "masterful"과 "notmaster"라는 가지를 놓치게됩니다.

git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
  bar

업데이트 된 정규 표현식 ( "dev"보다는 "development"을 제외 함) :

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

그러나 master에서 동일한 명령을 실행하면 "foo"브랜치가 포함되지 않습니다.

git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

이것은 단순히 git branch --merged 다른 이유로 지정되지 않은 경우 현재 분기의 HEAD로 기본 설정되기 때문입니다. 최소한 워크 플로의 경우 마스터에 병합되지 않은 경우 로컬 브랜치를 삭제하지 않으므로 다음 변형을 선호합니다.

git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

분리 된 HEAD 상태

git branch --merged 의 기본 동작을 사용하면 분리 된 HEAD 상태에서 훨씬 더 중요한 결과가 발생합니다.

git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  foobar
  masterful
  notmaster

이렇게하면 "foo"와 함께 "foobar"라는 브랜치가 삭제되었을 것입니다. 이는 거의 확실하게 원하는 결과가 아닙니다. 그러나 우리의 수정 된 명령으로 :

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 '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

별명은 선택적 -f 플래그를 허용합니다. 기본 동작은 master에 병합 된 분기 만 삭제하는 것이지만 -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-del-br tool 사용할 수 있습니다.

git-del-br -a

당신은 pip 를 통해 그것을 설치할 수 있습니다.

pip install git-del-br

추신 : 저는이 도구의 저자입니다. 모든 제안 / 피드백을 환영합니다.




현재 병합 된 지점에 이미 병합 된 모든 지점을 삭제하려면 이전 답변을 바탕으로 안전한 명령을 내 렸습니다.

git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d

이 명령은 현재 분기 또는 마스터 분기에 영향을 미치지 않습니다. 그것은 또한 xargs의 -t 플래그를 사용하여 그것이 수행되기 전에 무엇을하는지 알려줄 것입니다.




이 답변 중 일부를 기반으로 나는 Bash 스크립트를 만들었 습니다 .

git branch --mergedgit 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
}



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

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 연결에는 적합하지 않습니다.




허용 된 솔루션은 꽤 좋지만 아직 원격에 병합되지 않은 로컬 브랜치를 삭제한다는 한 가지 문제가 있습니다.

당신이 당신의 출력을 보면 당신은 비슷한 것을 볼 수 있습니다.

$ 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)

브랜치 blaissue_248 은 자동으로 삭제되는 로컬 브랜치입니다.

그러나 리모컨으로 푸시 된 브랜치 (이제 사라짐)를 나타내는 단어 [gone] 볼 수 있으므로 브랜치를 삭제할 수 있음을 나타냅니다.

따라서 원래의 답은 (줄 길이가 짧은 경우에는 여러 줄로 나뉘어집니다)

git branch --merged master -v | \
     grep  "\\[gone\\]" | \
     sed -e 's/^..//' -e 's/\S* .*//' | \
      xargs git branch -d

병합되지 않은 지점을 보호합니다. 또한 마스터를 보호하기위한 그레이핑은 필요하지 않습니다. 이는 원산지가 원격이며 사라진 것처럼 보이지 않기 때문입니다.




2018.07 기준

~/.gitconfig[alias] 섹션에 다음을 추가하십시오.

sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"

이제 필요한 정리 작업을 수행하기 위해 git sweep 을 호출 할 수 있습니다.




마스터 브랜치에 병합 된 브랜치를 삭제하려면 다음 별칭 ( 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. 메시지는 현재의 체크 아웃이 마스터 브랜치와 다릅니다.




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

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




Related