Apa perbedaan antara git push.default = current dan push.default = upstream?

89

Halaman manual untuk git-config mencantumkan opsi ini untuk push.default:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

Dalam kebanyakan kasus, saya akan berasumsi bahwa mendorong ke cabang hulu cabang akan sama dengan mendorong ke cabang dengan nama yang sama, karena cabang hulu biasanya memiliki nama yang sama, dan karena cabang dengan nama yang sama ("saat ini" ) biasanya (atau selalu, menurut definisi?) upstream. Lalu apa bedanya?

PEMBARUAN : Halaman manual untuk git-config telah diperbarui (seperti yang diharapkan), jadi perbedaan yang dibuat di sana mungkin jauh lebih jelas sekarang.

iconoclast
sumber
2
bagi para pengembang memang menjengkelkan untuk membedakannya, jadi 'sederhana' diperkenalkan, dan akan menjadi bahasa default untuk git-push. sebenarnya ini muncul di git 1.7.11
xhlwill
14
Untuk informasi lebih lanjut tentang peringatan git baru-baru ini push.default is unset; its implicit value is changing in Git 2.0dan tentang matchingvs, simplelihat stackoverflow.com/questions/13148066/…
Nate
iconoclaust: Saya rasa suntingan saya tidak mengubah integritas pertanyaan sama sekali, dan informasi lama hanya perlu diperbaiki. Mengapa membuat pengguna melakukan pekerjaan ekstra dengan mengklik link?
Flimm

Jawaban:

72

Anda telah meringkas perbedaan dalam pertanyaan Anda. upstreammendorong ke cabang hulu yang dikonfigurasi , sementara currentmengasumsikan cabang hulu memiliki nama yang sama dengan cabang lokal saat ini , dan mendorong ke nama spesifik tersebut. Pada kenyataannya, tidak ada alasan untuk menganggap cabang pelacakan hulu cabang lokal memiliki nama yang sama dengan cabang lokal itu sendiri.

Misalnya, jika Anda bekerja di beberapa repositori atau di banyak remote developer bersama, Anda sering kali akhirnya melacak cabang berbeda dari cabang yang sama, seperti allen-masteratau susan-master, keduanya melacak mastercabang di repositori Allen dan Susan. Dalam kasus ini, currentakan menjadi pengaturan yang salah, karena nama cabang tersebut tidak ada di remote mereka. upstream, bagaimanapun, akan bekerja dengan baik.

Contoh yang lebih praktis mungkin melacak a developmentdan productionrepositori. Alur kerja Anda mungkin menggunakan cabang jalur utama yang berbeda untuk masing-masing, tetapi itu mungkin membingungkan. Misalkan Anda adalah integrator kode dan ingin melacak mastercabang kedua repositori secara terpisah.

git checkout -b production --track production/master
git checkout -b development --track development/master

Sekarang Anda memiliki dua cabang yang melacak repositori masing-masing, tidak ada yang menggunakan masterkonvensi penamaan sama sekali. Ada sedikit kebingungan tentang nama cabang: Mereka secara eksplisit menjelaskan apa yang mereka lacak. Namun demikian, push.default = currenttidak masuk akal karena tidak ada remote yang berisi developmentatau productioncabang.

Christopher
sumber
6
Anda memberikan dua contoh kapan upstreamlebih disukai daripada current. Saya pikir ini cukup jelas, jadi Anda sebaiknya memberi contoh untuk kasus sebaliknya.
AndreKR
1
@AndreKR AFAIK currentlebih baik jika Anda adalah pengembang baru karena Anda tidak perlu git configterlalu banyak terutama jika Anda telah mengkloning dari suatu tempat. currentmendorong atau membuat-kemudian-mendorong-ke cabang homonymous pada repo jarak jauh untuk Anda jika mereka belum ada, sedangkan simpleakan menolak untuk melakukan ini secara langsung ketika cabang dengan nama yang sama belum ada. upstreammemiliki perilaku yang sama dalam kasus ini kecuali cabang upstream telah ditetapkan secara eksplisit atau ditetapkan seperti yang disebutkan dalam jawaban Yawar .
Jarang 'Where's Monica' Needy
6

current akan mendorong cabang saat ini ke cabang dengan nama yang sama pada repo jarak jauh.

upstream akan mendorong cabang saat ini ke cabang hulu.

Cabang upstream adalah cabang yang secara eksplisit atau implisit didefinisikan sebagai upstream dari cabang Anda saat ini. Itu berarti push dan pull secara default akan disinkronkan dengan cabang ini. Cabang hulu mungkin dalam repo yang sama dengan cabang saat ini itu sendiri. Anda dapat melakukan hal-hal menarik seperti menyiapkan cabang master lokal Anda sebagai upstream dari cabang fitur (topik) lokal Anda , dan mendorong dan menarik di antaranya.

Penyiapan upstream implisit dilakukan melalui nilai branch.autosetupmergeconfig. Anda dapat menemukan dokumentasi di git confighalaman bantuan. Penyiapan upstream eksplisit dilakukan dengan -uopsi ke git branchperintah. Lihat halaman bantuan untuk detailnya.

Yawar
sumber
Saya tidak berpikir branch.autoSetupMergemelakukan hal yang sama dengan -u/ --set-upstream. Setidaknya, saya tidak melihat apa pun dalam dokumentasi yang menyiratkan bahwa itu membuat git push berperilaku seolah-olah dipanggil -usecara default, yang menurut saya seperti yang Anda katakan. Bisakah Anda menjelaskan apa yang Anda maksud?
waldyrious
@yammaulidina saat Anda memeriksa cabang pelacakan jarak jauh, branch.autoSetupMergekonfigurasi secara default membuat cabang lokal baru dan menyetel hulu sebagai cabang pelacakan jarak jauh. Tindakan implisit ini dapat dilakukan secara eksplisit dengan menggunakan flag -t( --track) atau -u ...( --set-upstream-to=...), yang melakukan hal yang sama dengan sintaks yang sedikit berbeda.
Yawar
1
Saya melihat apa yang terjadi di sini - karena pertanyaan ini adalah tentang git push, saya (secara keliru) berasumsi bahwa Anda berbicara tentang -uopsi git push, bukan -uopsi git branch. Maaf atas kebingungannya :)
waldyrious