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?
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?
Jawaban:
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
-d
tidak 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 -force
versi tersebut jika Anda tidak 300% yakin Anda tidak akan kehilangan sesuatu yang penting. Karena itu hilang selamanya .
git branch branchname commitid
$ 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)
grep -v ^*
.
master-copy
, misalnya
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
pertama (alihkan ke cabang yang ingin Anda pertahankan> ex : master ):
git checkout master
kedua ( pastikan Anda berada di master )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
$(git branch)
tanda kutip? Ini tidak berhasil: error: branch '$ (git' not found. Error: branch 'branch)' not found.
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-ref
untuk 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 HEAD
apakah 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 -d
tidak akan menghapus cabang "tidak digabungkan sepenuhnya" (lihat dokumentasi). Menggunakan -D
akan 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.
git branch -D $(git branch | grep -v '^*')
, jika Anda ingin menghapus cabang-cabang yang telah digabungkan.
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 .
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
Untuk Windows, dalam penggunaan Powershell:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
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
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
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)
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
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
gone
penanda Anda harus menggunakan -vv
(verbose dua kali), sementara -a
tidak akan membantu Anda (daftar juga cabang jarak jauh)