Saya memiliki banyak cabang Git. Bagaimana cara saya menghapus cabang yang sudah digabung? Apakah ada cara mudah untuk menghapus semuanya alih-alih menghapusnya satu per satu?
git
github
version-control
branch
feature-branch
Nyambaa
sumber
sumber
git branch -D
menghapus cabang apa pun apakah itu telah digabung atau tidak.master
setiap cabang. Namun, klien lokal Anda masih akan mencantumkan cabang lama jika Anda menjalankangit branch -a
; gunakangit fetch --prune
untuk menghapusnya (sesuai jawaban ini ).git delete-merged --doit origin
orgit delete-merged --doit --local
rm -fr work && git clone http://example.com/work.git
selama bertahun-tahun telah menjadi cara termudah untuk keluar dari acar dengan git.Jawaban:
MEMPERBARUI:
Anda dapat menambahkan cabang lain untuk dikecualikan seperti master dan dev jika alur kerja Anda memiliki mereka sebagai leluhur yang mungkin. Biasanya saya bercabang dari tag dan master "sprint-start", dev dan qa bukan leluhur.
Pertama, daftarkan semua cabang yang digabungkan dalam jarak jauh.
Anda mungkin melihat beberapa cabang yang tidak ingin Anda hapus. kita dapat menambahkan beberapa argumen untuk melewati cabang-cabang penting yang tidak ingin kita hapus seperti master atau pengembangan. Perintah berikut akan melewati cabang master dan apa pun yang memiliki dev di dalamnya.
Jika Anda ingin melewati, Anda dapat menambahkannya ke perintah egrep seperti berikut ini. Cabang
skip_branch_name
tidak akan dihapus.Untuk menghapus semua cabang lokal yang sudah bergabung ke cabang yang sedang diperiksa:
Anda dapat melihat bahwa master dan dev dikecualikan jika mereka adalah leluhur.
Anda dapat menghapus cabang lokal gabungan dengan:
Jika tidak digabungkan, gunakan:
Untuk menghapusnya dari penggunaan jarak jauh:
Setelah Anda menghapus cabang dari jarak jauh, Anda dapat memangkas untuk menyingkirkan cabang pelacakan jarak jauh dengan:
atau pangkas cabang pelacakan jarak jauh individual, seperti yang disarankan jawaban lain, dengan:
Semoga ini membantu.
sumber
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
jika Anda tidak memiliki cabang yang harus dihapus. Untuk menghindari itu, Anda dapat meneruskan-r
kexargs
sehingga tidak akan berjalangit branch -d
jika stdin kosong. (Ini ekstensi GNU xargs, menurut halaman manual).Untuk menghapus semua cabang pada jarak jauh yang sudah digabungkan:
Di Git versi terbaru
UPDATE (oleh @oliver; karena tidak cocok dalam komentar, tetapi sudah cukup jawaban) : jika Anda berada di cabang ABC maka ABC akan muncul di hasil
git branch -r --merged
karena cabang tidak ditentukan, jadi cabang default ke cabang saat ini, dan cabang selalu memenuhi syarat sebagai digabungkan ke dirinya sendiri (karena tidak ada perbedaan antara cabang dan dirinya sendiri!).Jadi tentukan cabang:
ATAU master checkout pertama:
sumber
dev
jadi saya harus mengubahnya| grep origin
setelahgrep -v master
untuk mencegah mendorong cabang remote lainnya ke asal. Sangat merekomendasikan pengujian output sebelumnya, menggunakangit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
cabang juga.git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
. Sekarang ini ternyata alias saya.-r
argumen, yang saya tidak pernah lihat disebutkan di tempat lain. Dianggap begitu saja bahwa hanya cabang lokal yang layak melakukan pembersihan. Tapi remote juga penuh dengan sampah.myFeatureBranch
sana akan menghapusorigin/myFeatureBranch
. Mungkin yang terbaik adalah yanggit checkout master
pertama.Hanya sedikit memperluas jawaban Adam:
Tambahkan ini ke konfigurasi Git Anda dengan menjalankan
git config -e --global
Dan kemudian Anda dapat menghapus semua cabang gabungan lokal melakukan hal yang sederhana
git cleanup
.sumber
git branch --merged master
karena Anda ingin melihat apa yang telah digabung menjadi master, saat ini tidak memeriksa cabang?develop
ataudev
dan dalam hal itu perintah akan gagal denganfatal: malformed object name
lebih baik memiliki perintah generik dan Anda memiliki tanggung jawab untuk menjalankannya-r
kexargs
akan mencegah kesalahan yang tidak perlu (branch name required
) ketika menjalankan alias ini beberapa kali atau ketika tidak ada cabang yang tersisa untuk dihapus. Alias saya terlihat seperti ini:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
Ini juga berfungsi untuk menghapus semua cabang gabungan kecuali master.
sumber
master
di dalamnya. Cobagrep -v ^master$
untuk yang tengah.| grep -v '^\*'
untuk menghindari menghapus cabang saat ini jika Anda tidakgrep -v '^ master$'
. Jika Anda mengetiknya sendiri dan melewatkannya, Anda akan menghapusnyamaster
jika tidak ada.git branch
akan mencantumkan setiap nama cabang pada baris baru dengan dua spasi di sebelah kiri jika bukan cabang yang saat ini dicentang. Anda pada dasarnya telah menjamin bahwa siapa pun yang menjalankan perintah ini akan menghapus cabang master mereka kecuali jika itu adalah cabang yang sedang diperiksa.Anda ingin mengecualikan
master
&develop
cabang dari perintah itu.Git lokal jelas:
Remote git hapus:
Sinkronkan registry lokal dari cabang jarak jauh:
sumber
git config --global --add fetch.prune true
untuk memangkas secara otomatis saat mengambil atau menarik.git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
Bagi Anda yang ada di Windows dan lebih suka skrip PowerShell, berikut adalah yang menghapus cabang gabungan lokal:
sumber
git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B
(mendesah, ganti double-backquotes dengan single, saya tidak yakin bagaimana memformat literal yang berisi backquotes)Saya telah menggunakan jawaban Adam selama bertahun-tahun sekarang. Yang mengatakan, bahwa ada beberapa kasus di mana itu tidak berperilaku seperti yang saya harapkan:
1 & 2 langsung ditangani, hanya dengan perubahan pada regex. 3 tergantung pada konteks yang Anda inginkan (yaitu hanya menghapus cabang yang belum digabungkan menjadi master atau melawan cabang Anda saat ini). 4 berpotensi menjadi bencana (walaupun dapat dipulihkan dengan
git reflog
), jika Anda menjalankannya secara tidak sengaja dalam kondisi HEAD yang terlepas.Akhirnya, saya ingin semua ini berada dalam satu liner yang tidak memerlukan skrip (Bash | Ruby | Python) terpisah.
TL; DR
Buat alias git "sapuan" yang menerima
-f
bendera opsional :dan memohonnya dengan:
atau:
Jawaban panjang dan terperinci
Itu yang paling mudah bagi saya untuk membuat contoh git repo dengan beberapa cabang dan berkomitmen untuk menguji perilaku yang benar:
Buat git repo baru dengan komit tunggal
Buat beberapa cabang baru
Perilaku yang diinginkan: pilih semua cabang digabung kecuali: master, mengembangkan atau saat
Regex asli melewatkan cabang "masterful" dan "notmaster":
Dengan regex yang diperbarui (yang sekarang tidak termasuk "berkembang" daripada "dev"):
Beralih ke foo cabang, buat komit baru, lalu checkout cabang baru, foobar, berdasarkan foo:
Cabang saya saat ini adalah foobar, dan jika saya menjalankan kembali perintah di atas untuk mendaftar cabang yang ingin saya hapus, cabang "foo" dimasukkan walaupun belum digabung menjadi master:
Namun, jika saya menjalankan perintah yang sama pada master, cabang "foo" tidak termasuk:
Dan ini hanya karena
git branch --merged
default ke KEPALA cabang saat ini jika tidak ditentukan. Setidaknya untuk alur kerja saya, saya tidak ingin menghapus cabang lokal kecuali mereka telah digabungkan untuk dikuasai, jadi saya lebih suka varian berikut:Keadaan HEAD terlepas
Mengandalkan perilaku default
git branch --merged
memiliki konsekuensi yang bahkan lebih signifikan dalam keadaan HEAD terpisah:Ini akan menghapus cabang saya, "foobar" bersama dengan "foo", yang hampir pasti bukan hasil yang diinginkan. Namun, dengan perintah revisi kami:
Satu baris, termasuk penghapusan aktual
Semua dibungkus menjadi alias git "sapuan":
Alias menerima
-f
bendera opsional . Perilaku default adalah hanya menghapus cabang yang telah digabungkan ke master, tetapi-f
bendera akan menghapus cabang yang telah digabungkan ke cabang saat ini.sumber
git config
atom?!f(){ git branch ...
,. Ini adalah deklarasi fungsi, kan? Mengapa tidak memulai secara langsunggit branch ...
?git checkout master && git branch -d `git branch --merged` && git checkout -
Kecuali itu akan dihapusdevelop
, tetapi mungkin pendekatan yang lebih sederhana.Git Sapu melakukan pekerjaan yang baik ini.
sumber
Menggunakan Git versi 2.5.0:
sumber
master
cabang btw!master
.git branch -d $(git branch --merged | grep -v master)
Anda dapat menambahkan komit ke opsi --merged. Dengan cara ini Anda dapat memastikan hanya untuk menghapus cabang yang digabungkan ke dalam yaitu asal / master
Perintah berikut akan menghapus cabang gabungan dari asal Anda.
Anda dapat menguji cabang mana yang akan dihapus menggantikan asal git push --delete dengan gema
sumber
Saya menggunakan skrip Ruby berikut untuk menghapus cabang lokal dan jarak jauh saya yang sudah bergabung. Jika saya melakukannya untuk repositori dengan beberapa remote dan hanya ingin menghapus dari satu, saya hanya menambahkan pernyataan pilih ke daftar remote untuk hanya mendapatkan remote yang saya inginkan.
sumber
\/
di awal pernyataan tolak untukremote_branches
saluran tersebut. Apakah itu salah ketik atau apakah ada gunanya?b.split(/\//)
garis sekarangCara menghapus cabang yang digabungkan di konsol PowerShell
Jika Anda ingin mengecualikan master atau nama cabang lainnya, Anda dapat mem-pipe dengan PowerShell Select-String seperti ini dan meneruskan hasilnya ke
git branch -d
:sumber
* master
:)Jawaban kuboon tidak terjawab menghapus cabang yang memiliki kata master dalam nama cabang. Berikut ini meningkatkan jawabannya:
Tentu saja, itu tidak menghapus cabang "master" itu sendiri :)
sumber
Tidak ada perintah di Git yang akan melakukan ini untuk Anda secara otomatis. Tetapi Anda dapat menulis skrip yang menggunakan perintah Git untuk memberikan apa yang Anda butuhkan. Ini bisa dilakukan dalam banyak cara tergantung pada model percabangan apa yang Anda gunakan.
Jika Anda perlu tahu apakah cabang telah digabungkan menjadi master, perintah berikut tidak akan menghasilkan output jika myTopicBranch telah digabung (yaitu Anda dapat menghapusnya)
Anda bisa menggunakan perintah cabang Git dan mem-parsing semua cabang di Bash dan lakukan
for
perulangan di semua cabang. Dalam loop ini Anda memeriksa dengan perintah di atas apakah Anda dapat menghapus cabang atau tidak.sumber
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
akan menghapus semua cabang lokal kecuali cabang yang diperiksa saat ini dan / ataumaster
.Berikut artikel yang bermanfaat bagi mereka yang ingin memahami perintah-perintah ini: Git Clean: Hapus Cabang yang Sudah Digabung, oleh Steven Harman .
sumber
Catatan : Saya tidak senang dengan jawaban sebelumnya, (tidak bekerja pada semua sistem, tidak bekerja pada jarak jauh, tidak menentukan cabang --merged, tidak memfilter dengan tepat). Jadi, saya tambahkan jawaban saya sendiri.
Ada dua kasus utama:
Lokal
Anda ingin menghapus cabang lokal yang sudah bergabung ke cabang lokal lain . Selama penghapusan, Anda ingin menyimpan beberapa cabang penting, seperti master, mengembangkan, dll.
Catatan :
git branch output --format
".." adalah untuk menghapus spasi putih dan memungkinkan pencocokan grep yang tepatgrep -E
digunakan sebagai gantiegrep
, sehingga berfungsi juga dalam sistem tanpa egrep (yaitu: git for windows).grep -E -v '^master$|^feature/develop$'
adalah untuk menentukan cabang lokal yang tidak ingin saya hapusxargs -n 1 git branch -d
: melakukan penghapusan cabang lokal (itu tidak akan bekerja untuk yang jauh)Terpencil
Anda ingin menghapus cabang jarak jauh yang sudah bergabung ke cabang jarak jauh lain . Selama penghapusan, Anda ingin menyimpan beberapa cabang penting, seperti KEPALA, master, rilis, dll.
Catatan :
-r
opsi dan memberikan nama cabang lengkap :origin/master
grep -E -v '^*HEAD$|^*/master$|^*release'
adalah untuk mencocokkan cabang jarak jauh yang tidak ingin kita hapus.cut -d/ -f2-
: hapus awalan 'asal /' yang tidak dibutuhkan yang kalau tidak dicetak olehgit branch
perintah.xargs -n 1 git push --delete origin
: melakukan penghapusan cabang jarak jauh.sumber
Jika Anda menggunakan Windows, Anda dapat menggunakan Windows Powershell atau Powershell 7 dengan Out-GridView untuk memiliki daftar cabang yang bagus dan memilih dengan mouse mana yang ingin Anda hapus:
setelah mengklik OK Powershell akan meneruskan nama cabang ini ke
git branch -d
perintah dan menghapusnyasumber
Anda bisa menggunakan
git-del-br
alat .Anda dapat menginstalnya
pip
menggunakanPS: Saya pembuat alat. Ada saran / umpan balik.
sumber
Jika Anda ingin menghapus semua cabang lokal yang sudah digabung ke cabang tempat Anda saat ini, maka saya telah membuat perintah aman untuk melakukannya, berdasarkan jawaban sebelumnya:
Perintah ini tidak akan memengaruhi cabang Anda saat ini atau cabang master Anda. Ini juga akan memberi tahu Anda apa yang dilakukannya sebelum melakukannya, menggunakan flag -t xargs.
sumber
Versi terbaru dari jawaban Adam yang diperbarui :
Juga, lihat jawaban ini untuk tips praktis tentang melarikan diri alias kompleks.
sumber
Saya menggunakan skema penamaan esque git-flow, jadi ini bekerja sangat aman untuk saya:
Ini pada dasarnya mencari komit gabungan yang dimulai dengan string
fix/
ataufeature/
.sumber
Coba perintah berikut:
Dengan menggunakan
git rev-parse
akan mendapatkan nama cabang saat ini untuk mengecualikannya. Jika Anda mendapatkan kesalahan, itu berarti tidak ada cabang lokal untuk dihapus.Untuk melakukan hal yang sama dengan cabang jarak jauh (ubah
origin
dengan nama jarak jauh Anda), coba:Jika Anda memiliki beberapa remote, tambahkan
grep origin |
sebelumnyacut
untuk memfilter hanyaorigin
.Jika perintah di atas gagal, coba hapus cabang pelacakan jarak jauh yang digabungkan terlebih dahulu:
Kemudian
git fetch
remote lagi dan gunakangit push -vd
perintah sebelumnya lagi.Jika Anda sering menggunakannya, pertimbangkan untuk menambahkan alias ke blog Anda
~/.gitconfig
file .Jika Anda secara tidak sengaja menghapus beberapa cabang, gunakan
git reflog
untuk menemukan komit yang hilang.sumber
Berdasarkan beberapa jawaban ini saya membuat skrip Bash saya sendiri untuk melakukannya juga !
Menggunakan
git branch --merged
dangit branch -d
menghapus cabang yang telah digabungkan dan meminta Anda untuk masing-masing cabang sebelum menghapus.sumber
Kueri di bawah ini berfungsi untuk saya
dan ini akan menyaring cabang apa pun yang diberikan dalam pipa grep.
Bekerja dengan baik melalui http clone, tetapi tidak begitu baik untuk koneksi ssh.
sumber
Pada 2018.07
Tambahkan ini ke
[alias]
bagian Anda~/.gitconfig
:Sekarang Anda bisa menelepon
git sweep
untuk melakukan pembersihan yang diperlukan.sumber
Pada Windows dengan git bash terpasang egrep -v tidak akan berfungsi
di mana
grep -E -v
setara denganegrep -v
Gunakan
-d
untuk menghapus cabang yang sudah digabung atau-D
untuk menghapus cabang yang tidak dimergersumber
Saya telah menggunakan metode berikut untuk menghapus cabang lokal DAN remote dalam satu cmd.
Saya memiliki yang berikut ini di
bashrc
file saya :sumber asli
Ini tidak menghapus cabang master, tetapi menghapus cabang lokal DAN jarak jauh yang digabungkan . Setelah Anda memiliki ini di file rc Anda, jalankan saja
rmb
, Anda akan ditampilkan daftar cabang gabungan yang akan dibersihkan dan meminta konfirmasi tentang tindakan tersebut. Anda dapat memodifikasi kode untuk tidak meminta konfirmasi juga, tetapi mungkin baik untuk menyimpannya.sumber
Tulis skrip di mana Git memeriksa semua cabang yang telah digabungkan untuk dikuasai.
Lalu lakukan
git checkout master
.Akhirnya, hapus cabang yang digabungkan.
sumber
Solusi yang diterima cukup bagus, tetapi memiliki satu masalah yang juga menghapus cabang lokal yang belum digabungkan menjadi remote.
Jika Anda melihat outputnya Anda akan melihat sesuatu seperti
Cabang
bla
danissue_248
cabang lokal yang akan dihapus secara diam-diam.Tapi Anda juga bisa melihat kata itu
[gone]
, yang menunjukkan cabang yang telah didorong ke jarak jauh (yang sekarang hilang) dan dengan demikian menunjukkan cabang dapat dihapus.Dengan demikian, jawaban asli dapat diubah menjadi (dibagi menjadi multiline untuk panjang garis yang lebih pendek)
untuk melindungi cabang yang belum digabung. Juga grepping bagi master untuk melindunginya, tidak diperlukan, karena ini memiliki remote pada awalnya dan tidak muncul sebagai hilang.
sumber
Bagi saya
git branch --merged
tidak menunjukkan cabang yang digabungkan melalui GitHub PR. Saya tidak yakin alasannya, tetapi saya menggunakan baris berikut untuk menghapus semua cabang lokal yang tidak memiliki cabang pelacakan jarak jauh :Penjelasan:
git branch --format "%(refname:short)"
memberikan daftar cabang lokalgit branch -r | grep -v HEAD | cut -d/ -f2-
memberikan daftar cabang jauh, memfilterHEAD
diff <(...) <(...)
memberikan perbedaan keluaran dari dua perintah di dalam tanda kurunggrep '<'
memfilter cabang yang ada di daftar pertama, tetapi tidak di yang keduacut -c 3-
memberikan garis mulai dari karakter ke-3, sehingga menghilangkan awalan<
xargs git branch -D
dieksekusigit branch -D
terhadap setiap nama cabangAtau, Anda dapat menghindari
grep -v '<'
seperti ini:sumber