2015-02-17 21 views
29

Tôi muốn xóa tất cả các chi nhánh mà được liệt kê trong đầu ra củaTôi có thể xóa tất cả các chi nhánh địa phương ngoại trừ chi nhánh hiện tại không?

$ git branch 

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

+1

có thể trùng lặp của [Xóa tất cả các nhánh git cục bộ] (http://stackoverflow.com/questions/10610327/delete-all-local-git-branches) –

+1

có thể trùng lặp của [Cách xóa tất cả các nhánh git cục bộ nhưng giữ master với một dòng lệnh?] (http://stackoverflow.com/questions/25112684/how-to-remove-all-local-git-branches-but-keep-master-with-one-command-line) – random

+0

Có thể bản sao của [Làm thế nào tôi có thể xóa tất cả các chi nhánh git đã được sáp nhập?] (https://stackoverflow.com/questions/6127328/how-can-i-delete-all-git-branches-which-have-been-merged) –

Trả lời

18

Dựa trên câu trả lời @pankijs, tôi thực hiện 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 bổ sung trong ~/.gitconfig


Và, như @torek chỉ ra:

Lưu ý rằng chữ thường -d sẽ không xóa cám "chưa được hợp nhất hoàn toàn" ch (xem tài liệu). Sử dụng -Dsẽ xóa các chi nhánh đó, ngay cả khi điều này khiến các cam kết trở thành "bị mất"; sử dụng điều này với sự chăm sóc tuyệt vời, vì điều này cũng xóa các chi nhánh, nên công cụ "khôi phục từ tình cờ xóa" thông thường cũng không hoạt động.

Về cơ bản, không bao giờ sử dụng phiên bản -force nếu bạn không chắc chắn 300% bạn sẽ không mất bất kỳ điều gì quan trọng. Bởi vì nó bị mất mãi mãi.

+1

cam kết với một chi nhánh đã bị xóa vẫn còn trong quá trình khôi phục một lúc. – CaptRespect

+0

Thật vậy, các cam kết sẽ ở lại trong quá trình tái cấu trúc. Nhưng không phải chính nhánh đó. Tôi thử nó, nhưng tôi đoán bạn có thể tìm thấy các cam kết của bạn, nhưng hãy quay trở lại trạng thái chi nhánh? Tôi nghi ngờ như vậy. chinh no. – Vadorequest

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

sẽ xóa tất cả các chi nhánh, trừ chủ, thay thế tổng thể với chi nhánh bạn muốn giữ lại (sẽ xóa thạc sĩ)

+13

Nếu bạn muốn giữ nhánh * hiện tại * sử dụng 'grep -v^*'. – Schwern

+2

Nhiều nguồn hiển thị cho tôi tập lệnh này, nhưng khi tôi chạy nó luôn cho tôi biết rằng không tìm thấy chi nhánh: ( – tucq88

+0

không chính xác, nó sẽ không xóa chi nhánh được gọi là 'bản sao chính', ví dụ – mvallebr

10

git branch -d (hoặc -D) cho phép nhiều tên chi nhánh, nhưng đó là một chút khó khăn để tự động cung cấp " tất cả các chi nhánh địa phương không bao gồm chi nhánh tôi đang thực hiện "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 thức đúng) là sử dụng git for-each-ref để có được những tên chi nhánh:

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

nhưng sau đó nó thậm chí còn khó khăn hơn để tìm ra những chi nhánh bạn đang ở trên (git symbolic-ref HEAD là "chính thức chính xác "phương pháp 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 địa phương của bạn trước hai dấu cách hoặc (cho nhánh hiện tại) bằng dấu hoa thị *. Vì vậy, hãy chạy này thông qua một cái gì đó để loại bỏ các phiên bản * và bạn đang trái với những cái tên không gian tách nhánh, sau đó bạn có thể vượt qua để git branch -d:

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

hay:

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

Lưu ý rằng chữ thường -d sẽ không xóa chi nhánh "chưa được hợp nhất hoàn toàn" (xem tài liệu). Sử dụng -D sẽ xóa các nhánh đó, ngay cả khi điều này làm cho các cam kết trở thành "bị mất"; sử dụng điều này với sự cẩn thận tuyệt vời, vì điều này sẽ xóa các chi nhánh reflogs là tốt, do đó, thông thường "phục hồi từ vô tình xóa" công cụ không hoạt động hoặc.

4

Để loại bỏ tất cả các chi nhánh sáp nhập (trừ hiện -v ‘*’):

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

tôi cũng thực hiện lệnh như vậy cho repo hoàn toàn sạch lên:

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ừ here.

Các vấn đề liên quan