Git - Apa perbedaan antara push.default "matching" dan "simple"

285

Saya telah menggunakan git untuk sementara waktu sekarang, tetapi saya tidak pernah harus membuat repo jarak jauh baru sendiri dan saya ingin tahu melakukannya. Saya telah membaca tutorial dan saya bingung bagaimana cara "git push" bekerja.

Jika saya hanya menggunakannya git pushmeminta saya untuk melihat cabang default (?) Untuk menunjuk ke? Apa perbedaan antara dua opsi yang disediakannya untuk saya?

git config --global push.default matching
git config --global push.default simple

Matching hanya mendorong cabang apa pun yang saya miliki di repo lokal saya, dan jika mereka tidak cocok saya harus kemudian secara manual mengatakannya untuk mendorong cabang lokal baru apa pun yang saya miliki, benar? Apakah ini praktik terbaik untuk digunakan atau sederhana terbaik?

Josh
sumber
1
Sekarang, jika hanya pull.defaulttersedia untuk memperbarui semua cabang tersebut secara lokal
Nogurenn

Jawaban:

367

git push dapat mendorong semua cabang atau satu bergantung pada konfigurasi ini:

Dorong semua cabang

git config --global push.default matching

Ini akan mendorong semua cabang ke cabang jarak jauh dan akan menggabungkannya. Jika Anda tidak ingin mendorong semua cabang, Anda hanya bisa mendorong cabang saat ini.

Dorong hanya cabang saat ini

git config --global push.default simple

Jadi, menurut saya, lebih baik menggunakan opsi ini dan mendorong cabang kode Anda dengan cabang. Lebih baik mendorong cabang secara manual dan individual.

Lalit Sachdeva
sumber
16
Saya menyukai push.default currentjawaban dari @UpAndAdam. Tidak tahu tentang itu.
alanjds
4
Perhatikan bahwa simpletidak ada lagi opsi. Di 1.7.8.4(dan sebelumnya?) Itu menghasilkan kesalahan ketika Anda mencoba untuk mendorong. tetapi currentmasih tersedia
sixty4bit
@ sixty4bit: Saya menggunakan git versi 1.7.1. Saya menggunakan tracking-> mendorong cabang saat ini ke cabang hulu.
kevinarpe
@ sixty4bit Tidak, itu termasuk dalam Versi Git yang lebih baru, saya tidak tahu yang mana tetapi (1.7) sudah sangat tua, bahkan untuk 2016. Saya tidak akan merekomendasikan menggunakan Versi lama sama sekali.
Schmoudi
Diturunkan. Maaf, namun uraian halaman yang ditautkan simpletidak masuk akal, bertentangan dengan jawaban ini, dan salah - yang membuat jawaban ini membingungkan. Halaman yang ditautkan mengatakan simple"akan mendorong cabang satu per satu. Sebagian besar terhubung dengan cabang saat ini." Apakah itu berarti akan mendorong cabang secara berurutan dibandingkan secara paralel? Apa yang dimaksud "sebagian besar terhubung"? Kemudian, deskripsi untuk simpleselanjutnya mengutip deskripsi untuk matching, yang menurut orang berarti deskripsi untuk matchingjuga berlaku untuk simple. Tapi jelas itu tidak benar.
tvanc
91

Dari dokumentasi GIT: Git Docs

Di bawah ini memberikan informasi lengkap. Singkatnya, simplehanya akan mendorong current working branchdan itupun hanya jika itu juga memiliki nama yang sama pada remote. Ini adalah pengaturan yang sangat bagus untuk pemula dan akan menjadi default diGIT 2.0

Sedangkan matchingakan mendorong semua cabang secara lokal yang memiliki nama yang sama di remote. (Tanpa memperhatikan cabang kerja Anda saat ini). Ini berarti kemungkinan banyak cabang yang berbeda akan didorong, termasuk yang mungkin Anda tidak ingin bagikan.

Dalam penggunaan pribadi saya, saya biasanya menggunakan opsi yang berbeda: currentyang mendorong cabang kerja saat ini, (karena saya selalu bercabang untuk setiap perubahan). Tapi untuk pemula saya sarankansimple

push.default
Menentukan aksi yang harus diambil git jika tidak ada refspec yang diberikan secara eksplisit. Nilai yang berbeda cocok untuk alur kerja tertentu; misalnya, dalam alur kerja yang murni terpusat (yaitu sumber pengambilan sama dengan tujuan push), hulu mungkin adalah yang Anda inginkan. Nilai yang mungkin adalah:

tidak ada - jangan mendorong apa pun (kesalahan keluar) kecuali jika refspec secara eksplisit diberikan. Ini terutama dimaksudkan untuk orang yang ingin menghindari kesalahan dengan selalu bersikap eksplisit.

saat ini - tekan cabang saat ini untuk memperbarui cabang dengan nama yang sama di sisi penerima. Bekerja di alur kerja pusat dan non-sentral.

upstream - mendorong cabang saat ini kembali ke cabang yang perubahannya biasanya diintegrasikan ke dalam cabang saat ini (yang disebut @ {upstream}). Mode ini hanya masuk akal jika Anda mendorong ke repositori yang sama yang biasanya Anda tarik (yaitu alur kerja pusat).

sederhana - dalam alur kerja terpusat, bekerja seperti hulu dengan keamanan tambahan untuk menolak mendorong jika nama cabang hulu berbeda dari yang lokal.

Saat mendorong ke remote yang berbeda dengan remote yang biasanya Anda tarik, bekerjalah seperti saat ini. Ini adalah opsi teraman dan cocok untuk pemula.

Mode ini akan menjadi default di Git 2.0.

cocok - dorong semua cabang dengan nama yang sama di kedua ujungnya. Hal ini membuat repositori yang Anda dorong untuk mengingat kumpulan cabang yang akan didorong keluar (mis. Jika Anda selalu mendorong maint dan menguasai di sana dan tidak ada cabang lain, repositori yang Anda dorong akan memiliki dua cabang ini, dan Maint and master lokal Anda akan didorong ke sana).

Untuk menggunakan mode ini secara efektif, Anda harus memastikan semua cabang yang Anda dorong keluar siap untuk didorong keluar sebelum menjalankan git push, karena seluruh poin dari mode ini adalah untuk memungkinkan Anda mendorong semua cabang sekaligus. Jika Anda biasanya menyelesaikan pekerjaan hanya pada satu cabang dan mendorong hasilnya, sementara cabang lainnya belum selesai, mode ini bukan untuk Anda. Mode ini juga tidak cocok untuk dimasukkan ke repositori pusat bersama, karena orang lain dapat menambahkan cabang baru di sana, atau memperbarui ujung cabang yang ada di luar kendali Anda.

Ini saat ini default, tetapi Git 2.0 akan mengubah default menjadi sederhana.

UpAndAdam
sumber
ya, tapi saya berasumsi bahkan dengan pengaturan push.default bahwa jika Anda melakukan "$ git push origin master ", itu hanya akan mendorong cabang saat ini ke asal ke cabang asal dengan nama yang sama ... kan? Anda harus menyebutkan bahwa ada juga remote standar
Alexander Mills
1
Saya tidak yakin saya mengerti apa yang Anda maksud. Dalam MODE APA PUN jika Anda mengatakan git push origin masterakan melakukan hal yang sama. Inti dari mode dan default umumnya adalah apa yang terjadi ketika Anda hanya mengatakan git pushdan Anda tidak mengatakannya remote atau cabang. Pengaturan default apa? maksud Anda pengaturan default push.default? pengaturan default di mana versi git ... jika Anda tidak mendapatkannya, komentar Anda sangat kabur.
UpAndAdam
'push.default Menentukan tindakan yang harus dilakukan git push jika tidak ada refspec yang diberikan secara eksplisit' jika Anda mengatakan git push master asal Anda memberinya lebih banyak informasi dan masih mungkin tidak melakukan apa yang Anda gambarkan; tergantung pada refspec yang Anda atur .. git-scm.com/book/en/v2/Git-Internals-The-Refspec
UpAndAdam
2

Catatan Rilis Git v2.0

Catatan kompatibilitas mundur

Ketika git push [$there]tidak mengatakan apa yang harus ditekan, kami telah menggunakan semantik "pencocokan" tradisional sejauh ini (semua cabang Anda dikirim ke remote selama sudah ada cabang dengan nama yang sama di sana). Di Git 2.0, standarnya sekarang adalah semantik "sederhana", yang mendorong:

  • hanya cabang saat ini ke cabang dengan nama yang sama, dan hanya ketika cabang saat ini diatur untuk berintegrasi dengan cabang jarak jauh itu, jika Anda mendorong ke jarak jauh yang sama dengan yang Anda ambil; atau

  • hanya cabang saat ini ke cabang dengan nama yang sama, jika Anda mendorong ke remote yang bukan tempat Anda biasanya mengambil.

Anda dapat menggunakan variabel konfigurasi "push.default" untuk mengubahnya. Jika Anda adalah old-timer yang ingin tetap menggunakan semantik "cocok", Anda dapat mengatur variabel ke "cocok", misalnya. Baca dokumentasi untuk kemungkinan lain.

Ketika git add -udan git add -Adijalankan di dalam subdirektori tanpa menentukan jalur mana yang akan ditambahkan pada baris perintah, mereka beroperasi di seluruh pohon untuk konsistensi dengan git commit -adan perintah lainnya (perintah ini digunakan untuk beroperasi hanya pada subdirektori saat ini). Katakan git add -u .atau git add -A .jika Anda ingin membatasi operasi ke direktori saat ini.

git add <path>sama seperti git add -A <path>sekarang, sehingga git add dir/akan melihat jalur yang Anda hapus dari direktori dan merekam penghapusan. Dalam versi Git yang lebih lama, git add <path>digunakan untuk mengabaikan kepindahan. Anda dapat mengatakan git add --ignore-removal <path>menambahkan hanya jalur yang ditambahkan atau diubah <path>, jika Anda benar-benar menginginkannya.

Panduan Kode
sumber