Saya ingin memiliki repositori lokal dan jarak jauh saya selalu sinkron dalam hal cabang.
Setelah ulasan Tarik Permintaan pada GitHub, saya menggabungkan dan menghapus cabang saya di sana (jarak jauh). Bagaimana saya bisa mengambil informasi ini di repositori lokal saya dan meminta Git untuk menghapus versi lokal cabang saya juga?
git ls-remote
dangit show-ref
.git symbolic-ref
dangit update-ref
.Jawaban:
Cara cepat
NB: jika Anda tidak aktif
master
, ini berpotensi menghapus cabang. Teruslah membaca untuk "cara yang lebih baik".Pastikan kita tetap menguasai
Anda dapat memastikan bahwa
master
, atau cabang lainnya dalam hal ini, tidak dihapus dengangrep
lebih. Dalam hal ini Anda akan pergi:Jadi jika kita ingin tetap
master
,develop
danstaging
misalnya, kita akan pergi:Jadikan ini sebagai alias
Karena agak panjang, Anda mungkin ingin menambahkan alias ke
.zshrc
atau.bashrc
. Tambang disebutgbpurge
(untukgit branches purge
):Kemudian muat ulang
.bashrc
atau.zshrc
:atau
sumber
branch
ini adalah porselen dan bukan perintah plumbing , waspadalah terhadap perubahan UI di versi Git yang akan merusaknya.master
akan dihapus.grep -Ev '(\*|master|important-branch)'
~/.gitconfig
sebagai gantinya, tambahkan berikut ini ke[alias]
bagian:gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"
(tidak perlu menggunakan () dalam ekspresi grep).Saya menggunakan aliran yang sama dengan GitHub, dan tidak menemukan jawaban sebelumnya memuaskan saya, karena
git branch --merged
daftar cabang yang digabung, tetapi tidak semua dari mereka dihapus dari jarak jauh dalam kasus saya. Jadi, ini berhasil bagi saya:git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
dimana:
git fetch --all -p
: perbarui status cabang lokalgit branch -vv
: daftar status cabang lokalgrep ": gone]"
: filter yang dihapusawk '{ print $1 }'
: ekstrak nama merekaxargs -n 1 git branch -d
: meneruskan nama ke perintah hapusCatatan: jika Anda mau, Anda bisa menggunakan -D bukannya -d, yang memberlakukan penghapusan.
Sebagai contoh:
Referensi:
http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches
sumber
git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d
Skrip dan penjelasan yang hebat, terima kasih untuk itu :)branch -vv
menunjukkan pesan komit terakhir dari cabang. Jika Anda telah "pergi" dalam pesan itu, makagrep gone
akan mengenai cabang itu juga. Jadi,grep ": gone]"
mungkin sedikit lebih aman untuk digunakan.awk '$3 $4 ~ /:gone]$/ { print $1 }'
-D
bukan-d
jawaban yang tepat!mencoba:
yang menghapus cabang lokal Anda, jika cabang jarak jauh yang terkait dihapus.
Diperbarui:
Pernyataan di atas tidak benar.
Bahkan, menjalankan hanya
git pull --prune
akan MEMINDAHKAN cabang pelacakan jarak jauh sepertiKemudian, Anda dapat menjalankan
git branch -r
untuk memeriksa cabang pelacakan jarak jauh yang tersisa di mesin Anda. Misalkan cabang kiri adalah:yang berarti cabang
origin/fff
dihapus.Jadi, setelah berlari
git pull --prune
, jalankan saja:git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
Anda dapat mengetahui semua cabang lokal yang:
lalu,
<the command above> | xargs git branch -d
bisa menghapus semuanya.sumber
--prune
bendera hanya akan menghapus remote pelacakan cabang, tidak cabang lokal.git fetch --prune
, itulah pilihan sayagit pull --prune
menghasilkan "Anda diminta menarik dari '--prune' jarak jauh, tetapi tidak menentukan cabang. Karena ini bukan remote yang dikonfigurasi secara default untuk cabang Anda saat ini, Anda harus menentukan cabang pada baris perintah. "Ini harus bekerja untuk menghindari penghapusan cabang master dan pengembangan dengan solusi yang diterima:
sumber
Untuk orang yang menggunakan PowerShell, ini setara dengan jawaban di atas :
git branch -D
masing-masing cabang yang ditemukansumber
Tak satu pun dari ini bekerja untuk saya. Anda dapat melihat jawaban saya yang lain di sini: https://stackoverflow.com/a/34969726/550454
Tetapi pada dasarnya, saya sekarang memiliki ini di
~/.gitconfig
:sumber
Solusi yang sangat sederhana: hapus repo lokal Anda dan kloning remote lagi. Mungkin tidak tampak sangat elegan, tetapi sederhana dan Anda akan mengerti apa yang Anda lakukan tanpa membaca halaman manual :-).
sumber
Saya telah menulis satu baris ini untuk mendaftar semua cabang lokal yang tidak memiliki cabang jarak jauh yang sesuai:
Setelah ini selesai, menghapus cabang-cabang lokal ini mudah dengan
xargs
:sumber
master
, tidak berfungsi seperti yang diharapkan; hatiSaya hanya melakukan itu untuk menghapus cabang lokal gabungan:
dan jika Anda ingin menghapus juga pelacakan yang tidak ada:
sumber
Jika Anda baru saja mendorong dan menggabungkan cabang Anda untuk dikuasai, maka lakukan hal berikut di git bash:
Jika Anda saat ini di cabang itu akan mendorong Anda kembali ke master. Pada titik ini lakukan tarik dengan
sumber
Jawaban yang dipilih memang berpotensi menghapus master. Perhatikan contoh praktis di bawah ini.
Saya memiliki dua cabang fitur hemen_README dan hemen_BASEBOX yang digabung menjadi berkembang, dan kemudian berkembang digabung menjadi master. Cabang fitur hemen_README dan hemen_BASEBOX dihapus dari jarak jauh tetapi masih muncul secara lokal. Juga saya tidak menguasai secara lokal, tetapi pada pengembangan.
Dalam hal itu
Jadi jika saya menjalankan perintah parsial di atas
Perhatikan bahwa itu menunjukkan master juga, yang pada akhirnya akan dihapus.
Bagaimanapun saya bisa melakukannya. Saya membagikan log sesi saya dengan Anda tentang bagaimana saya mencapai itu.
Saya baru saja memeriksa apa yang akan dipangkas dan kemudian memangkasnya. melihat perintah cabang di bawah ini kami telah mengurus remote
Sekarang lanjutkan dan hapus cabang lokal
Bagus sekarang cabang yang diinginkan.
sumber