Pertanyaan yang bagus dan sederhana - apakah fungsi "git fetch" adalah sub-set yang ketat git fetch --tags
?
Yaitu kalau saya lari git fetch --tags
, adakah alasan untuk segera lari git fetch
lurus sesudahnya?
Bagaimana dengan git pull
dan git pull --tags
? Situasi yang sama?
Jawaban:
Catatan: dimulai dengan git 1.9 / 2.0 (Q1 2014) ,
git fetch --tags
mengambil tag di samping apa yang diambil oleh baris perintah yang sama tanpa opsi.Lihat commit c5a84e9 oleh Michael Haggerty (mhagger) :
Karena Git 2.5 (Q2 2015)
git pull --tags
lebih kuat:Lihat komit 19d122b oleh Paul Tan (
pyokagan
) , 13 Mei 2015.(Digabung oleh Junio C Hamano -
gitster
- dalam komit cc77b99 , 22 Mei 2015)Dengan Git 2.11+ (Q4 2016)
git fetch
lebih cepat.Lihat komit 5827a03 (13 Okt 2016) oleh Jeff King (
peff
) .(Digabung oleh Junio C Hamano -
gitster
- dalam komit 9fcd144 , 26 Okt 2016)Itu hanya berlaku untuk situasi di mana:
Git 2.21 (Februari 2019) tampaknya telah memperkenalkan regresi ketika config
remote.origin.fetch
adalah tidak satu standar ('+refs/heads/*:refs/remotes/origin/*'
)Git 2.24 (Q4 2019) menambahkan optimasi lain.
Lihat commit b7e2d8b (15 Sep 2019) oleh Masaya Suzuki (
draftcode
) .(Digabung oleh Junio C Hamano -
gitster
- dalam commit 1d8b0df , 07 Okt 2019)sumber
git fetch <remote> <branch>
untuk mengikuti tag otomatis (karena sudah memperbarui pelacakan jarak jauh MELAWAN niat asli): public-inbox.org/git/…Catatan: jawaban ini hanya berlaku untuk git v1.8 dan lebih lama.
Sebagian besar ini telah dikatakan dalam jawaban dan komentar lain, tetapi inilah penjelasan singkatnya:
git fetch
mengambil semua kepala cabang (atau semua yang ditentukan oleh opsi konfigurasi remote.fetch), semua melakukan yang diperlukan untuk mereka, dan semua tag yang dapat dijangkau dari cabang-cabang ini. Dalam kebanyakan kasus, semua tag dapat dijangkau dengan cara ini.git fetch --tags
mengambil semua tag, semua komitmen diperlukan untuk mereka. Itu tidak akan memperbarui kepala cabang, bahkan jika mereka dapat dijangkau dari tag yang diambil.Ringkasan: Jika Anda benar-benar ingin mendapatkan informasi terkini, hanya menggunakan pengambilan, Anda harus melakukan keduanya.
Ini juga tidak "dua kali lebih lambat" kecuali jika Anda bermaksud mengetikkan perintah-baris, dalam hal ini alias memecahkan masalah Anda. Pada dasarnya tidak ada overhead dalam membuat dua permintaan, karena mereka meminta informasi yang berbeda.
sumber
git remote update
sebenarnya bukan pengganti untukgit fetch
dangit fetch --tags
.git remote update
tidak akan memperbarui tag yang ada yang telah berubah, meskipun akan membawa tag baru. Hanyagit fetch --tags
akan memperbarui tag yang sudah ada.Saya akan menjawab ini sendiri.
Saya telah menentukan bahwa ada perbedaan. "git fetch --tags" mungkin membawa semua tag, tetapi itu tidak menghasilkan komitmen baru!
Ternyata seseorang harus melakukan ini agar benar-benar "terkini", yaitu mereplikasi "git pull" tanpa penggabungan:
Ini memalukan, karena ini dua kali lebih lambat. Andai saja "git fetch" memiliki opsi untuk melakukan apa yang biasanya ia lakukan dan membawa semua tag.
sumber
git remote update myRemoteRepo
': apakah itu akan mengambil konten dan tag jarak jauh ?git fetch
semua waktu dan secara konsisten menarik setiap komitmen baru dan tag baru. Git versi apa yang Anda jalankan?git fetch
tidak akan mengambil tag yang tidak ada di log komit cabang. Misalnya jQuery UI melakukan ini pada tag rilis. Kami melakukangit checkout -b temp-branch
, melakukan rilis kami, menambahkan file yang diperlukan untuk rilis, memperbarui versi, dll,git commit -m "1.10.x" ; git tag 1.10.x; git push --tags
lalu kami menghapus cabang temp lokal kami. Tidak ada cabang jarak jauh yang mencapai tag itu, dangit fetch
tidak akan pernah mengunduhnya.Masalah umum di sini adalah yang
git fetch
akan diambil+refs/heads/*:refs/remotes/$remote/*
. Jika salah satu dari komit ini memiliki tag, tag tersebut juga akan diambil. Namun, jika ada tag yang tidak dapat dijangkau oleh cabang mana pun di remote, mereka tidak akan diambil.The
--tags
pilihan switch refspec untuk+refs/tags/*:refs/tags/*
. Anda bisa memintagit fetch
untuk mengambil keduanya. Saya cukup yakin hanya melakukangit fetch && git fetch -t
Anda akan menggunakan perintah berikut:Dan jika Anda ingin menjadikan ini sebagai standar untuk repo ini, Anda dapat menambahkan refspec kedua ke pengambilan default:
Ini akan menambahkan
fetch =
baris kedua.git/config
untuk remote ini.Saya menghabiskan waktu mencari cara untuk menangani proyek ini. Inilah yang saya pikirkan.
Dalam kasus saya, saya ingin fitur ini
refs/*:refs/*
+
sebelum refspec-u
-p
-f
sumber
--tags
Opsi mengalihkan refspec ke+refs/tags/*:refs/tags/*
". Meskipun,,man git-fetch
tampaknya menentukan refspec tanpa yang memimpin+
(refs/tags/*:refs/tags/*
).remote.origin.fetch
default untuk+refs/heads/*:refs/remotes/origin/*
, yaitu+
versi, bukan? (Itu artinya, asal / cabang akan ditimpa, tidak peduli di mana asal / cabang sekarang secara lokal.)git --tags
- baru ini sedang mengambil tag di samping yang lainnya. Lihat jawaban @VonC.Dalam kebanyakan situasi,
git fetch
lakukan apa yang Anda inginkan, yaitu 'dapatkan sesuatu yang baru dari repositori jarak jauh dan letakkan di salinan lokal Anda tanpa bergabung ke cabang lokal Anda'.git fetch --tags
tidak persis seperti itu, kecuali itu tidak mendapatkan apa-apa kecuali tag baru.Dalam arti itu,
git fetch --tags
sama sekali bukan supersetgit fetch
. Sebenarnya justru sebaliknya.git pull
, tentu saja, tidak lain adalah pembungkus untukgit fetch <thisrefspec>; git merge
. Dianjurkan agar Anda terbiasa melakukan manualgit fetch
dangit merge
ing sebelum Anda melakukan lompatangit pull
hanya karena itu membantu Anda memahami apagit pull
yang dilakukan di tempat pertama.Konon, hubungannya persis sama dengan
git fetch
.git pull
adalah superset darigit pull --tags
.sumber
git pull
tidak tidak mendapatkan semua tag tetapi hanya mereka dicapai dari kepala cabang saat ini. Namun,git pull --tags
mengambil semua tag dan tampaknya setara dengangit fetch --tags
.berfungsi dengan baik, itu hanya akan mendapatkan tag baru dan tidak akan mendapatkan basis kode lainnya.
sumber
upstream
biasa disebutorigin
. Saya pikirupstream
adalah nama yang digunakan oleh GitHub. Bagaimanapun, nama yang digunakan adalah yang ditunjukkan olehgit remote
.