Tôi có thể xóa tất cả các chi nhánh cục bộ ngoại trừ chi nhánh hiện tại không?


95

Tôi muốn xóa tất cả các nhánh được liệt kê trong kết quả đầu ra của ...

$ git branch

... nhưng vẫn giữ chi nhánh hiện tại, trong một bước . Điều đó có thể không? Nếu vậy, làm thế nào?


1
bản sao có thể có của Xóa tất cả các nhánh git cục bộ
Andrew C


Câu trả lời:


66

Dựa trên câu trả lời của @pankijs, tôi đã tạo hai bí danh 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"

Để được thêm vào ~/.gitconfig


Và, như @torek đã chỉ ra:

Lưu ý rằng chữ thường -dsẽ không xóa một nhánh "không được hợp nhất hoàn toàn" (xem tài liệu). Việc sử dụng -D sẽ xóa các nhánh như vậy , ngay cả khi điều này làm cho các cam kết bị "mất"; sử dụng điều này một cách cẩn thận , vì thao tác này cũng xóa các nhật ký nhánh, do đó, nội dung thông thường "khôi phục sau khi xóa ngẫu nhiên" cũng không hoạt động.

Về cơ bản, đừng bao giờ sử dụng -forcephiên bản nếu bạn không chắc chắn 300% rằng bạn sẽ không mất bất cứ thứ gì quan trọng. Vì nó đã mất vĩnh viễn .


2
cam kết đối với một nhánh đã bị xóa sẽ vẫn còn trong bản cập nhật trong một thời gian.
CaptRespect

Thật vậy, các cam kết sẽ ở trong bản cập nhật. Nhưng không phải chính chi nhánh. Tôi sẽ không thử nó, nhưng tôi đoán bạn có thể tìm thấy cam kết của mình, nhưng quay trở lại trạng thái nhánh? Tôi nghi ngờ như vậy. Cherry-pick có thể được sử dụng để truy xuất các cam kết trong một nhánh đã xóa, nhưng bạn sẽ không thể khôi phục chính nhánh đó.
Vadorequest

1
@Vadorequest bạn có thể tái tạo các chi nhánh chỉ một số cam kết bằng cách thực hiệngit branch branchname commitid
pqnet

@pqnet Tôi không biết điều đó sẽ tạo lại tất cả lịch sử cho chi nhánh đó, cảm ơn, rất tốt khi biết!
Vadorequest

1
@Vadorequest vì các đối tượng cam kết là không thể thay đổi (và được lập chỉ mục dưới dạng hàm băm), mọi chỉnh sửa yêu cầu tạo một đối tượng mới (với một hàm băm khác)
pqnet

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

sẽ xóa tất cả các nhánh ngoại trừ cái chính (thay thế cái chính bằng nhánh bạn muốn giữ lại, nhưng sau đó nó sẽ xóa cái chính)


30
Nếu bạn muốn giữ nguyên chi nhánh sử dụng hiện tạigrep -v ^* .
Schwern

2
Nhiều nguồn hiển thị cho tôi script này, nhưng khi tôi chạy nó luôn nói với tôi rằng không tìm thấy các nhánh :(
tucq88

1
điều này không chính xác, master-copyví dụ: nó sẽ không xóa một nhánh được gọi
mvallebr

2
Ví dụ: điều chỉnh regex nếu cầngrep -v "^ *master$"
Brad Koch

8
Nếu bạn muốn giữ hai nhánh sử dụng grep -v "master\|my-other-branch".
Derek Soike

18

đầu tiên (chuyển sang nhánh bạn muốn giữ> ví dụ : master ):

git checkout master

thứ hai (đảm bảo rằng bạn đang làm chủ )

git branch -D $(git branch)

3
rất nhanh chóng và dễ dàng. Tại sao cái này không được ủng hộ?
PrincebillyGK

1
Đó là câu trả lời đơn giản và tốt nhất đối với tôi.
Saleh Enam Shohag

1
Nếu bạn đang sử dụng PowerShell, hãy sử dụng git branch -D $(git branch).Trim().
NatoBoram

13

git branch -d(hoặc -D) cho phép nhiều tên chi nhánh, nhưng hơi khó khăn khi tự động cung cấp "tất cả các chi nhánh cục bộ trừ chi nhánh hiện tại tôi đang ở" mà không cần viết ít nhất một chút mã.

Phương pháp "tốt nhất" (chính xác) là sử dụng git for-each-refđể lấy tên nhánh:

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

nhưng sau đó thậm chí còn khó hơn để biết bạn đang ở nhánh nào ( git symbolic-ref HEADlà phương pháp "chính thức" cho việc này, nếu bạn muốn viết một kịch bản ưa thích).

Thuận tiện hơn, bạn có thể sử dụng git branch, in tên chi nhánh cục bộ của bạn trước hai dấu cách hoặc (đối với chi nhánh hiện tại) bằng dấu hoa thị *. Vì vậy, hãy chạy điều này qua một cái gì đó để xóa *phiên bản và bạn chỉ còn lại tên nhánh được phân tách bằng dấu cách, sau đó bạn có thể chuyển đến git branch -d:

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

hoặc là:

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

Lưu ý rằng chữ thường -dsẽ không xóa một nhánh "không được hợp nhất hoàn toàn" (xem tài liệu). Việc sử dụng -Dsẽ xóa các nhánh như vậy, ngay cả khi điều này làm cho các cam kết bị "mất"; sử dụng điều này một cách cẩn thận, vì thao tác này cũng xóa các nhật ký nhánh, do đó, nội dung thông thường "khôi phục sau khi xóa ngẫu nhiên" cũng không hoạt động.


Nó nên được git branch -D $(git branch | grep -v '^*'), nếu bạn muốn xóa những nhánh đã hợp nhất.
Pratik Singhal

@PratikSinghal: xóa tất cả các nhánh khác, không chỉ các nhánh mà Git coi là "đã hợp nhất". Đây hiếm khi là một ý tưởng hay. Tôi đã chỉ ra cả hai mục này trong câu trả lời của mình.

12

Để xóa tất cả các nhánh đã hợp nhất (ngoại trừ hiện tại -v ‘*’):

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

Ngoài ra, tôi đã thực hiện lệnh như vậy để dọn dẹp hoàn toàn repo:

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

lấy từ đây .


1
Thao tác này chỉ xóa các nhánh đã hợp nhất.
Pratik Singhal

10

Xóa tất cả các nhánh ngoại trừ một nhánh cụ thể :

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

Xóa tất cả các nhánh cục bộ ngoại trừ phát triểnlàm chủ

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

6

Đối với Windows, sử dụng Powershell:

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

4

Xóa cục bộ tất cả chi nhánh đã hợp nhất:

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

Xóa tất cả các nhánh ngoại trừ một nhánh cụ thể :

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

Xóa tất cả các nhánh cục bộ ngoại trừ phát triểnlàm chủ

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

3

Tôi đã từng tạo cấu trúc này cho môi trường Windows của mình. Có thể nó sẽ giúp ích cho người khác. Trong quá trình thực thi, nhánh chính và nhánh hiện tại không bị xóa . Tất cả các chi nhánh đã hợp nhất khác sẽ bị xóa bất kể.

@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

Để xóa tất cả các nhánh ngoại trừ nhánh hiện tại trong một bước:

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


2

Giả sử git branchhiển thị nhánh hiện tại có tiền tố là *; Sử dụng Powershell một lớp lót sau sẽ xóa tất cả các nhánh không bắt đầu bằng *.

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

? = Where-Object

% = Foreach-Object


1

Vì vậy, tôi thấy rất nhiều tên nhánh được mã hóa cứng ở đây ... Và tôi nghĩ câu trả lời của tôi ở đây chính xác hơn cho phần "nhánh hiện tại" của câu hỏi trong khi vẫn giữ nó một dòng và dễ đọc đối với những người mới như tôi. Chỉ cần đặt tín dụng đến hạn, câu trả lời rõ ràng là cũng dựa trên câu trả lời của @ pankijs.

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

và tôi có bí danh nó trên một dòng trong .bash_aliases của tôi trong debian cũng vậy.

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

(Mặc dù tôi nghĩ rằng một số tính năng bash cần được kích hoạt để lệnh phụ chạy trên một số dòng lệnh)


1

Tôi sử dụng điều này vì tôi có thể lựa chọn nhiều hơn trong những gì tôi không muốn xóa. Lệnh dưới đây loại bỏ mọi nhánh ngoại trừ nhánh chính, phát triển và nhánh hiện tại.

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

Vì vậy, tôi đặt cái này vào ~/.zshrc

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

alias cleanup_branches=delete_branches

0

IMHO, cách an toàn nhất để loại bỏ các nhánh cục bộ là:

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

Ngoài ra, bạn có thể tìm thấy thêm thông tin liên quan đến chủ đề này Xóa tất cả các nhánh git cục bộ


để in các goneđiểm đánh dấu bạn nên sử dụng -vv(verbose hai lần), trong khi -asẽ không giúp bạn (nó cũng liệt kê các chi nhánh từ xa)
pqnet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.