Git remote branch dihapus, tetapi tetap saja muncul di 'branch -a'

552

Katakanlah saya memiliki cabang yang bernama coolbranchdi repositori saya.

Sekarang, saya memutuskan untuk menghapusnya (baik jarak jauh dan lokal) dengan:

git push origin :coolbranch
git branch -D coolbranch

Bagus! Sekarang cabang benar-benar dihapus.

Tapi ketika saya lari

git branch -a

Saya masih mendapatkan:

remotes/origin/coolbranch

Sesuatu yang perlu diperhatikan, adalah bahwa ketika saya mengkloning repositori baru, semuanya baik-baik saja dan git branch -atidak menunjukkan cabang.

Saya ingin tahu - apakah ada cara untuk menghapus cabang dari branch -adaftar tanpa mengkloning instance baru?

yonix
sumber
58
Jika Anda git fetch -p(atau git pull -p) maka cabang jarak jauh akan dipangkas.
yoyo

Jawaban:

688

git remote prune origin, seperti yang disarankan dalam jawaban lain, akan menghapus semua cabang basi tersebut. Mungkin itulah yang Anda inginkan dalam kebanyakan kasus, tetapi jika Anda ingin menghapus cabang pelacakan jarak jauh tertentu, Anda harus melakukannya:

git branch -d -r origin/coolbranch

( -rMudah dilupakan ...)

-rdalam hal ini akan "Mendaftar atau menghapus (jika digunakan dengan -d) cabang pelacak jarak jauh." menurut dokumentasi Git yang ditemukan di sini: https://git-scm.com/docs/git-branch

Mark Longair
sumber
11
git remote prune originatau segala bentuk git fetch --prunepenandaan tidak berfungsi untuk saya dalam kasus saya. ... Tapi git branch -d -r origin/feature/branch-nameberhasil. Saya tidak yakin apakah itu ada hubungannya dengan itu berada di bawah featurenamespace (git flow) tapi itulah caranya turun, kalau-kalau ada googler menemukan itu terjadi pada mereka.
Misterparker
8
Apakah ada alasan mengapa ini perlu? Tampaknya sangat buruk untuk meninggalkan nama cabang yang tidak ada ini dalam daftar dan tidak secara otomatis memangkasnya.
akronymn
296

Mencoba:

git remote prune origin

Dari dokumentasi jarak jauh Git :

memangkas

Menghapus semua cabang pelacakan jarak jauh basi di bawah <name>. Cabang-cabang basi ini telah dihapus dari repositori jarak jauh yang dirujuk oleh <name>, tetapi masih tersedia secara lokal di "remote / <nama>".

Dengan opsi --dry-run, laporkan cabang apa yang akan dipangkas, tetapi tidak benar-benar memangkasnya.

Brian Phillips
sumber
1
Untuk kelengkapan: harus mirip dengan yang git pull --prunedisebutkan di stackoverflow.com/a/17983126/94687 Dan:git remote update --prune
imz - Ivan Zakharyaschev
230

Jangan lupakan yang mengagumkan

git fetch -p

yang mengambil dan memangkas semua asal.

orip
sumber
Untuk kelengkapan: harus sama git remote prune origindan mirip dengan yang git pull --prunedisebutkan di stackoverflow.com/a/6127884/94687 dan stackoverflow.com/a/17983126/94687 . Dan:git remote update --prune
imz - Ivan Zakharyaschev
2
Tetapi cabang akan tetap terlihat jika Anda menjalankangit branch -a
Nikhil Sahu
1
@NikhilSahu: Saya tidak melihat cabang-cabang jauh yang telah dihapus lagi dengangit branch -a
user276648
20

Dalam kasus khusus kami, kami menggunakan Stash sebagai repositori remote Git kami. Kami mencoba semua jawaban sebelumnya dan tidak ada yang berhasil. Kami akhirnya harus melakukan hal berikut:

git branch –D branch-name (delete from local)
git push origin :branch-name (delete from remote)

Kemudian ketika pengguna pergi untuk melakukan perubahan, mereka perlu melakukan hal berikut:

git fetch -p
Shadowvail
sumber
git branch -d branch-namebekerja untukku. Pemberitahuan -Duntuk -d. Bahkan ketika saya mencoba dengan huruf besar D -Ditu membuat cabang baru dengan nama -D
RP-
1
"-D" adalah cara untuk memaksa penghapusan terlepas dari status push atau gabungannya. Jelas berhati-hati menggunakannya, tetapi dalam banyak kasus, itu perlu.
Shadowvail
19

Menggunakan:

git remote prune <remote>

Di mana <remote>nama sumber jarak jauh seperti asal atau hulu .

Contoh: git remote prune origin

likaiguo.happy
sumber
3
untuk pembaca masa depan, inilah perbedaan antara git remote prune, git prune,git fetch --prune .
Emile Bergeron