Bisakah saya menghapus semua cabang lokal kecuali yang sekarang?

98

Saya ingin menghapus semua cabang yang terdaftar di output ...

$ git branch

... tetapi mempertahankan cabang saat ini, dalam satu langkah . Apakah itu mungkin? Jika ya, bagaimana caranya?

sensorario
sumber

Jawaban:

67

Berdasarkan jawaban @pankijs, saya membuat dua alias 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"

Untuk ditambahkan ~/.gitconfig


Dan, seperti yang dikatakan @torek:

Perhatikan bahwa huruf kecil -dtidak akan menghapus cabang "tidak digabungkan sepenuhnya" (lihat dokumentasi). Menggunakan -D akan menghapus cabang tersebut , bahkan jika ini menyebabkan komit menjadi "hilang"; gunakan ini dengan sangat hati-hati , karena ini juga menghapus reflog cabang, sehingga hal-hal "memulihkan dari penghapusan tidak disengaja" yang biasa juga tidak berfungsi.

Pada dasarnya, jangan pernah menggunakan -forceversi tersebut jika Anda tidak 300% yakin Anda tidak akan kehilangan sesuatu yang penting. Karena itu hilang selamanya .

Vadorequest
sumber
2
komit ke cabang yang dihapus masih harus berada di reflog untuk sementara waktu.
CaptRespect
Memang, komitmen akan tetap dalam reflog. Tapi bukan cabangnya sendiri. Saya tidak akan mencobanya, tetapi saya rasa Anda mungkin menemukan komitmen Anda, tetapi kembali ke status cabang? Saya ragu begitu. Cherry-pick dapat digunakan untuk mengambil komit di cabang yang dihapus, tetapi Anda tidak akan dapat memulihkan cabang itu sendiri.
Vadorequest
1
@Vadorequest Anda dapat membuat ulang cabang yang menunjuk komit tertentu dengan melakukangit branch branchname commitid
pqnet
@pqnet Saya tidak tahu itu akan membuat ulang semua sejarah untuk cabang itu, terima kasih, senang mengetahuinya!
Vadorequest
1
@Vadorequest karena objek komit tidak dapat diubah (dan diindeks sebagai hash), setiap pengeditan memerlukan pembuatan objek baru (dengan hash yang berbeda)
pqnet
190
$ git branch | grep -v "master" | xargs git branch -D 

akan menghapus semua cabang kecuali master (ganti master dengan cabang yang ingin Anda simpan, tetapi kemudian master akan dihapus)

pankijs
sumber
31
Jika Anda ingin tetap menggunakan cabang saat inigrep -v ^* .
Schwern
2
Banyak sumber menunjukkan kepada saya skrip ini, tetapi ketika saya menjalankannya selalu beri tahu saya bahwa cabang tidak ditemukan :(
tucq88
1
ini tidak akurat, ini tidak akan menghapus cabang yang dipanggil master-copy, misalnya
mvallebr
2
Sesuaikan regex seperlunya, misalnyagrep -v "^ *master$"
Brad Koch
9
Jika ingin tetap menggunakan dua cabang grep -v "master\|my-other-branch".
Derek Soike
24

pertama (alihkan ke cabang yang ingin Anda pertahankan> ex : master ):

git checkout master

kedua ( pastikan Anda berada di master )

git branch -D $(git branch)
KhogaEslam
sumber
3
sangat cepat dan mudah. Mengapa ini tidak mendapat suara positif?
princebillyGK
1
Ini adalah jawaban paling sederhana dan terbaik untuk saya.
Saleh Enam Shohag
3
Jika Anda menggunakan PowerShell, gunakan git branch -D $(git branch).Trim().
NatoBoram
apakah kita harus memberikan $(git branch)tanda kutip? Ini tidak berhasil: error: branch '$ (git' not found. Error: branch 'branch)' not found.
saran3h
1
Jawaban terbaik dari yang banyak, harus diberi suara positif,
xelber
13

git branch -d(atau -D) memungkinkan beberapa nama cabang, tetapi agak sulit untuk secara otomatis menyediakan "semua cabang lokal kecuali yang saya gunakan sekarang" tanpa menulis setidaknya sedikit kode.

Metode "terbaik" (benar secara formal) digunakan git for-each-refuntuk mendapatkan nama cabang:

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

tetapi lebih sulit lagi untuk mencari tahu di cabang mana Anda berada ( git symbolic-ref HEADapakah metode yang "secara formal benar" untuk ini, jika Anda ingin menulis skrip mewah).

Lebih mudahnya, Anda dapat menggunakan git branch, yang mencetak nama cabang lokal Anda diawali dengan dua spasi atau (untuk cabang saat ini) dengan tanda bintang *. Jadi, jalankan ini melalui sesuatu untuk menghapus *versi dan Anda ditinggalkan dengan nama cabang yang dipisahkan spasi, yang kemudian dapat Anda teruskan ke git branch -d:

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

atau:

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

Perhatikan bahwa huruf kecil -dtidak akan menghapus cabang "tidak digabungkan sepenuhnya" (lihat dokumentasi). Menggunakan -Dakan menghapus cabang seperti itu, bahkan jika ini menyebabkan komit menjadi "hilang"; gunakan ini dengan sangat hati-hati, karena ini juga menghapus reflog cabang, sehingga hal-hal "memulihkan dari penghapusan tidak disengaja" yang biasa juga tidak berfungsi.

torek
sumber
Seharusnya git branch -D $(git branch | grep -v '^*'), jika Anda ingin menghapus cabang-cabang yang telah digabungkan.
Pratik Singhal
@PratikSinghal: yang menghapus semua cabang lain, tidak hanya cabang yang dianggap "digabung" oleh Git. Ini jarang merupakan ide yang bagus. Saya sudah menunjukkan kedua item ini dalam jawaban saya.
torek
12

Untuk menghapus semua cabang yang digabungkan (kecuali yang sekarang -v ‘*’):

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

juga saya membuat perintah seperti itu untuk pembersihan lengkap repo:

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

diambil dari sini .

Stepan Suvorov
sumber
1
Ini hanya menghapus cabang yang digabungkan.
Pratik Singhal
10

Hapus semua cabang kecuali cabang tertentu :

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

Hapus semua cabang lokal kecuali develop dan master

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Asad Manzoor
sumber
6

Untuk Windows, dalam penggunaan Powershell:

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

Saya pernah membuat konstruksi ini untuk lingkungan Windows saya. Mungkin itu akan membantu orang lain. Selama eksekusi, master dan cabang saat ini tidak dihapus . Semua cabang gabungan lainnya akan dihapus.

@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
George Maharis
sumber
3

Untuk menghapus semua cabang kecuali cabang saat ini dalam satu langkah:

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

Dan Dye
sumber
2

Hapus semua cabang yang digabungkan secara lokal:

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

Hapus semua cabang kecuali cabang tertentu :

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

Hapus semua cabang lokal kecuali develop dan master

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Asad Manzoor
sumber
2

Dengan asumsi git branchmenunjukkan cabang saat ini diawali dengan *; Menggunakan Powershell, satu liner berikut akan menghapus semua cabang yang tidak dimulai *.

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

? = Dimana-Objek

% = Objek-depan

Aaron
sumber
1

Jadi saya melihat banyak nama cabang yang dikodekan dengan keras di sini ... Dan saya pikir jawaban saya di sini lebih akurat untuk bagian "cabang saat ini" dari pertanyaan sambil menjaganya tetap satu baris dan dapat dibaca untuk menjelekkan pemula seperti saya. Hanya untuk menempatkan kredit di tempat yang seharusnya, jawabannya agak jelas juga berdasarkan jawaban @ pankijs.

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

dan saya memilikinya alias di satu baris di .bash_aliases saya di debian juga.

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

(Meskipun saya pikir beberapa fitur bash perlu diaktifkan agar sub perintah dapat berjalan pada beberapa baris perintah)

NullifiedWarp
sumber
1

Saya menggunakan ini karena saya menjadi lebih selektif dalam hal yang tidak ingin saya hapus. Perintah di bawah ini menghapus setiap cabang kecuali master, develop dan cabang saat ini.

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

Jadi saya taruh ini di saya ~/.zshrc

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

alias cleanup_branches=delete_branches
Justin Rice
sumber
0

IMHO, cara paling aman untuk menghapus cabang lokal adalah:

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

Juga, info lebih lanjut terkait dengan topik ini Anda dapat menemukan Hapus semua cabang git lokal

elbik
sumber
untuk mencetak gonepenanda Anda harus menggunakan -vv(verbose dua kali), sementara -atidak akan membantu Anda (daftar juga cabang jarak jauh)
pqnet