Mengapa saya bisa checkout cabang yang dihapus di GitHub?


26

Dalam repositori GitHub kami, seorang rekan kerja menghapus cabang bernama release. Tetapi ketika saya menjalankan git checkout releasesecara lokal, saya selalu mendapatkan cabang yang dihapus release. Sama, bahkan ketika saya memeriksa cabang lain, menghapus releasecabang dengan git branch -D releasedan berlari lagi git checkout release.

Apakah ada sesuatu untuk diperbaiki pada repositori GitHub, atau haruskah saya memperbaiki sesuatu secara lokal?


1
Apa git branch --remoteoutput, setelah berjalan git fetch? Anda mungkin harus memangkas git fetch -puntuk melupakan cabang jarak jauh yang dihapus.
Stephen Kitt

2
Jika cabang itu pernah didorong ke GitHub, dan Anda menarik setelah itu, maka Anda juga memiliki salinan cabang itu. Setiap repositori git selesai dengan sendirinya, kecuali jika Anda menggunakan klon yang dangkal atau semacamnya.
muru

@StephenKitt: Terima kasih. git branch --remotekeluaran origin/release. Apakah Anda bermaksud menjalankan git fetch -ptanpa argumen tambahan, dan apakah akan memangkas semua cabang jarak jauh yang dihapus?
Tim

1
Ya, git fetch -ptanpa argumen tambahan akan memangkas semua cabang jarak jauh yang dihapus.
Stephen Kitt

1
Selamat datang di dunia kontrol versi terdistribusi!
chrylis -pada mogok-

Jawaban:


24

Setelah menghapus cabang di sisi jarak jauh, Anda mungkin masih melihat cabang jarak jauh yang sebelumnya diambil secara lokal, lihat:

$ git branch -a
[...]
release
remotes/origin/release
[...]

Anda hanya menghapus "rilis" tetapi tidak "remote / origin / release". Hapus seperti ini:

$ git branch -rd origin/release

Atau hapus semua cabang yang diambil yang tidak ada lagi di sisi jarak jauh:

$ git remote prune origin 

Terima kasih. Dalam git branch -rd origin/release, apa -rartinya? Apakah -dartinya sama dengan -D? Bisakah git branch -rd origin/releasediganti git branch -d remotes/origin/release?
Tim

@Tim: Dari manual; r: List or delete (if used with -d) the remote-tracking branches.; -D:Shortcut for --delete --force.
looper

Terima kasih. Bisakah git branch -rd origin/releasediganti git branch -d remotes/origin/release?
Tim

@Tim no -rmerujuk ke cabang jarak jauh , itu diperlukan. Cabang lokal dan jauh disimpan di direktori yang berbeda, bandingkan ls -l .git/refs/headsdan ls -l .git/refs/remotes. Anda juga bisa memiliki cabang lokal yang dipanggil remotes/origin/releaseyang akan dihapus tanpa -r. Ini mungkin terdengar membingungkan tetapi Anda bisa bermain-main, membuat cabang dengan nama-nama aneh dan melihat bagaimana tampilannya .git/.
rudimeier

15

Ketika cabang dihapus dari jarak jauh, Anda perlu memangkas repositori lokal Anda - cara termudah untuk melakukannya adalah dengan

git fetch -p

Ini akan memperbarui repositori lokal Anda dengan semua perubahan yang dibuat pada repositori jarak jauh, tetapi tanpa memperbarui cabang lokal Anda. Setelah menjalankan ini,

git branch --remote

tidak akan lagi menampilkan cabang jarak jauh yang dihapus.

repositori git selesai, baik di sistem Anda sendiri atau di server. Jadi ketika Anda pertama kali mengkloning repositori, Anda mendapatkan salinan lengkap, dan git lokal Anda "tahu" tentang semua cabang jarak jauh serta cabang lokal Anda. Informasi ini tidak disinkronkan secara otomatis, jadi ketika kolega Anda menghapus releasecabang di server, repositori git lokal Anda tidak kehilangan anggapannya tentang releasecabang jarak jauh . Menyinkronkan dengan git fetchmemperbarui semua informasi lokal di cabang jarak jauh sehingga cocok dengan keadaan di server (secara tegas, repositori jarak jauh, di mana pun itu), tetapi tanpa menghapus informasi lokal di cabang jauh. Pemangkasan dengan git fetch -p(atau git fetch --prune, atau git remote prune) menghilangkan informasi lokal pada cabang jarak jauh yang telah dihapus.


Terima kasih. "perbarui repositori lokal Anda dengan semua perubahan yang dibuat pada repositori jarak jauh, tetapi tanpa memperbarui cabang lokal Anda". Pembaruan apa itu, mengingat itu bukan pembaruan cabang lokal saya?
Tim

Itu semua pembaruan jarak jauh. Repositori git lokal Anda membedakan cabang lokal Anda dan cabang jarak jauh, tetapi cabang jarak jauh tidak secara ajaib disinkronkan dengan server - mereka ada secara lokal juga (seperti di, disimpan dalam repositori git lokal Anda). Mengambil sinkronisasi repositori lokal Anda dengan repositori jarak jauh, dan memperbarui keadaan cabang jarak jauh; secara default cabang jarak jauh yang dihapus tidak dihapus dari informasi lokal di cabang jarak jauh, -p( --prune) memaksa itu.
Stephen Kitt

Terima kasih. Mengapa tidak menghapus releasecabang git branch -D releasesebelum git checkout releasemembuat git checkout releaseberhenti mendapatkan releasecabang?
Tim

1
Karena git checkout releasesecara otomatis akan membuat kembali cabang jika ada cabang jarak jauh dengan nama itu.
Stephen Kitt

Dengan "cabang jarak jauh", maksud Anda cabang di repositori lokal saya atau repositori Github? Jika sebelumnya, git branch -D releasesudah menghapus releasecabang di repositori lokal saya; Jika yang terakhir, seorang rekan kerja telah menghapus releasecabang di GitHub; Jadi saya masih tidak yakin mengapa "secara otomatis akan membuat kembali cabang jika ada cabang jarak jauh dengan nama itu"?
Tim

3

Tim: Git didistribusikan VCS, jadi ketika Anda mengkloning repo dari jarak jauh ke lokal Anda mengkloning semuanya (history). Jadi, ketika Anda mengkloning repo Anda, itu cabang yang disebut rilis. Karena kolega Anda menghapus cabang rilis dari jarak jauh, sampai Anda melakukan pemangkasan git fetch -patau menghapus cabang itu secara eksplisit, cabang lokal Anda akan memiliki cabang itu.


3
Bagaimana jawaban ini berbeda dari jawaban yang sudah ada?
Stephen Rauch

1

Mungkin agak singgung tetapi perspektif situs ini mungkin membantu untuk memahami topik umum menghapus cabang:

http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositor//

Ada tumpang tindih dengan beberapa dari apa yang telah dibahas di sini tetapi fokusnya adalah pada pemeliharaan rumah tangga: menghapus cabang, jarak jauh dan lokal, yang tidak lagi diperlukan dalam lingkungan kolaboratif. Khususnya git branch --mergedperintah tersebut mengidentifikasi cabang yang aman untuk dihapus karena digabungkan ke jalur utama Anda (atau cabang apa pun yang Anda pedulikan). Jika Anda berkolaborasi, beberapa skrip mini yang lebih bagus seperti ini akan menyajikan hal-hal dalam format yang bagus dan mudah dicerna dengan tanggal dan penulis.

for branch in `comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r

(Sayangnya "bagus, dapat dicerna" tidak berlaku untuk pemformatan skrip itu sendiri.)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.