Situasi saya adalah ini ... seseorang yang mengerjakan repo yang sama telah menghapus cabang dari repo lokal & jauh ...
Sebagian besar orang yang bertanya tentang masalah seperti ini di Stack Overflow, atau situs lain memiliki masalah cabang yang masih ditampilkan di daftar cabang pelacakan jarak jauh mereka git branch -a
di bagian bawah:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
Namun, dalam situasi SAYA cabang yang seharusnya tidak ada, adalah lokal:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
Ketika saya melakukan salah satu dari yang berikut ini, itu tidak bisa dihapus secara lokal:
$ git prune
Saya juga mencoba:
$ git remote prune origin
$ git fetch --prune
Info lebih berguna: Ketika saya memeriksa git remote show origin
ini tampilannya:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
Perhatikan bahwa ini hanya ada di bagian berjudul Local branches configured for 'git pull':
Mengapa?
git
remote-branch
gogogadgetinternet
sumber
sumber
git branch -d the_local_branch
x/y
): sudah diperbaiki (lihat jawaban saya di bawah )Jawaban:
Saya tidak menyalahkan Anda karena frustrasi tentang hal ini. Cara terbaik untuk melihatnya adalah ini. Ada berpotensi tiga versi dari setiap cabang jarak jauh:
(mis. Repo jarak jauh di https://example.com/repo.git ,
refs/heads/master
)refs/remotes/...
)(mis. Repo lokal,
refs/remotes/origin/master
)(misalnya, repo lokal,
refs/heads/master
)Mari kita mulai
git prune
. Ini menghapus objek yang tidak lagi direferensikan, itu tidak menghapus referensi. Dalam kasus Anda, Anda memiliki cabang lokal. Itu berarti ada seorang wasit bernamarandom_branch_I_want_deleted
yang merujuk pada beberapa objek yang mewakili sejarah cabang itu. Jadi, menurut definisi,git prune
tidak akan menghapusrandom_branch_I_want_deleted
. Sungguh,git prune
adalah cara untuk menghapus data yang telah terakumulasi di Git tetapi tidak dirujuk oleh apa pun. Secara umum, itu tidak mempengaruhi pandangan Anda tentang cabang apa pun.git remote prune origin
dangit fetch --prune
keduanya beroperasi pada referensi di bawahrefs/remotes/...
(saya akan merujuk ini sebagai referensi jarak jauh). Itu tidak mempengaruhi cabang lokal. Thegit remote
Versi ini berguna jika Anda hanya ingin menghapus referensi terpencil di bawah remote tertentu. Kalau tidak, keduanya melakukan hal yang persis sama. Jadi, singkatnya,git remote prune
dangit fetch --prune
beroperasi pada nomor 2 di atas. Misalnya, jika Anda menghapus cabang menggunakan GUI web GUI dan tidak ingin itu muncul di daftar cabang lokal Anda lagi (git branch -r
), maka ini adalah perintah yang harus Anda gunakan.Untuk menghapus cabang lokal, Anda harus menggunakan
git branch -d
(atau-D
jika tidak digabung di mana saja). FWIW, tidak ada perintah git untuk secara otomatis menghapus cabang pelacakan lokal jika cabang jarak jauh menghilang.sumber
xargs git branch -D
, tetapi perhatikan bahwa setiap cabang baru yang Anda buat tetapi tidak pernah didorong ke server akan dihapus, jadi injak dengan hati-hati:git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
packed-refs
file di.git
area), jadi itu tidak selalu masalah sederhana menghapusnya melalui file explorer. Lebih baik menggunakan perintah untuk memastikan keduanya diurus dengan benar.git remote prune
dangit fetch --prune
lakukan hal yang sama: menghapus referensi ke cabang yang tidak ada pada remote, seperti yang Anda katakan. Perintah kedua terhubung ke remote dan mengambil cabang-cabangnya saat ini sebelum pemangkasan.Namun itu tidak menyentuh cabang lokal yang sudah Anda periksa, yang bisa Anda hapus dengan
Ganti
-d
dengan-D
jika cabang tidak digabung di tempat laingit prune
melakukan sesuatu yang berbeda, membersihkan objek yang tidak terjangkau, komit yang tidak dapat dijangkau di cabang atau tag apa pun, dan karenanya tidak diperlukan lagi.sumber
git prune
tidak hanya mencari cabang dan tag, tetapi semua referensi lainnya juga.git remote prune
)Jika ada orang yang tertarik. Berikut skrip shell cepat yang akan menghapus semua cabang lokal yang tidak dilacak dari jarak jauh. Peringatan: Ini akan menyingkirkan cabang apa pun yang tidak dilacak dari jarak jauh terlepas dari apakah itu digabung atau tidak.
Jika kalian melihat ada masalah dengan ini, beri tahu saya dan saya akan memperbaikinya (dll.)
Simpan di file bernama
git-rm-ntb
(panggil saja)PATH
dan jalankan:git-rm-ntb <remote1:optional> <remote2:optional> ...
sumber
Perhatikan bahwa satu perbedaan antara
git remote --prune
dangit fetch --prune
sedang diperbaiki, dengan commit 10a6cc8 , oleh Tom Miller (tmiller
) (untuk git 1.9 / 2.0, Q1 2014):Jadi: ketika repo hulu memiliki cabang ("frotz") dengan nama yang sama dengan hierarki cabang ("frotz / xxx", kemungkinan konvensi penamaan cabang ),
git remote --prune
berhasil (dalam membersihkan cabang pelacakan jarak jauh dari repo Anda) , tetapigit fetch --prune
gagal.Tidak lagi:
sumber