Apa itu "git remote add ..." dan "git push origin master"?

288

Cukup sering, Git dan Rails terlihat seperti sihir ... seperti pada bab pertama buku Tutorial Rails 3 , ia berbicara tentang Git:

git remote add origin [email protected]:peter/first_app.git
git push origin master

dan cukup banyak mengatakan "itu hanya bekerja" tanpa mengatakan terlalu banyak tentang apa mereka dan mulai berbicara tentang percabangan. Pencarian di internet menunjukkan bahwa git remote addmenambahkan "nama pendek", seperti origin, dan itu bisa berupa nama apa pun, yang seperti alias ke URL. Dan originadalah jalan yang biasa di mana repo remote menunjuk ke. (di http://git-scm.com/book/en/Git-Basics-Working-with-Remotes di bawah "Menambahkan Repositori Jarak Jauh")

Jadi mengapa URL bukan git://[email protected]/peter/first_app.gittetapi di sintaks lain - sintaks apa itu? Kenapa harus diakhiri .git? Saya mencoba tidak menggunakan .gitpada akhirnya dan berfungsi juga. Jika tidak .git, apa lagi itu? The gitdi [email protected]tampaknya menjadi akun pengguna di server git?

Juga, mengapa itu perlu sangat verbose untuk digunakan git push origin master? Tidak bisakah defaultnya menjadi asal dan master? Saya menemukan bahwa pertama kali, origin masterdiperlukan, tetapi setelah mengedit kecil dan komit, maka git pushsemua itu perlu (tidak perlu origin master). Bisakah seseorang yang tahu apa yang sedang terjadi memberikan perincian?

Kadang-kadang rasanya seperti banyak sihir tanpa penjelasan ... dan kadang-kadang orang yang menggunakannya begitu percaya diri dan ketika ditanya mengapa, tidak bisa menjelaskannya, dan merespons dengan sesuatu seperti "begitulah adanya". Terkadang sangat praktis dan pragmatis. Tidak buruk untuk menjadi praktis, tetapi mungkin tidak praktis sampai tidak tahu apa yang sedang terjadi.

nonopolaritas
sumber

Jawaban:

344

gitseperti UNIX. User friendly tetapi pilih-pilih tentang teman-temannya. Ini tentang yang kuat dan ramah pengguna seperti pipa shell.

Yang sedang berkata, setelah Anda memahami paradigma dan konsepnya, ia memiliki kejelasan seperti zen seperti yang saya harapkan dari alat baris perintah UNIX. Anda harus mempertimbangkan meluangkan waktu untuk membaca salah satu dari banyak tutorial git yang baik yang tersedia secara online. Buku Pro Git adalah tempat yang baik untuk memulai.

Untuk menjawab pertanyaan pertama Anda.

  1. apa yang git remote add ...

    Seperti yang mungkin Anda ketahui, gitadalah sistem kontrol versi terdistribusi. Sebagian besar operasi dilakukan secara lokal. Untuk berkomunikasi dengan dunia luar, gitgunakan apa yang disebut remotes. Ini adalah repositori selain yang ada di disk lokal tempat Anda dapat pushmengubahnya (sehingga orang lain dapat melihatnya) atau pulldari (sehingga Anda bisa mendapatkan perubahan orang lain). Perintah git remote add origin [email protected]:peter/first_app.gitmembuat remote baru yang disebut originterletak di [email protected]:peter/first_app.git. Setelah Anda melakukan ini, dalam perintah push Anda, Anda bisa mendorong untuk originbukannya mengetikkan seluruh URL.

  2. apa yang git push origin master

    Ini adalah perintah yang mengatakan "tekan komit di cabang lokal bernama masterke remote bernama origin". Setelah ini dijalankan, semua hal yang terakhir Anda sinkronkan dengan asal akan dikirim ke repositori jarak jauh dan orang lain akan dapat melihatnya di sana.

Sekarang tentang transportasi (yaitu apa git://artinya). URL repositori jarak jauh dapat terdiri dari banyak jenis ( file://, https://dll.). Git hanya bergantung pada mekanisme otentikasi yang disediakan oleh transportasi untuk mengurus izin dan barang-barang. Ini berarti bahwa untuk file://URL, itu akan menjadi izin file UNIX, dll. git://Skema ini meminta git untuk menggunakan protokol transport internalnya sendiri, yang dioptimalkan untuk mengirimkan perubahan git ke sekeliling. Adapun URL yang tepat, memang seperti itu karena cara github mengatur gitservernya.

Sekarang verbositasnya. Perintah yang Anda ketikkan adalah perintah umum. Mungkin memberitahu git sesuatu seperti "cabang yang dipanggil masterdi sini adalah cermin lokal dari cabang yang dipanggil foodengan nama panggilan bar". Dalam git, ini berarti master melacak bar/foo . Saat Anda mengkloning untuk pertama kalinya, Anda akan mendapatkan cabang yang dipanggil masterdan panggilan jarak jauh origin(dari mana Anda dikloning) dengan master lokal yang disetel untuk melacak master pada awalnya. Setelah ini diatur, Anda dapat dengan mudah mengatakan git pushdan itu akan melakukannya. Perintah yang lebih panjang tersedia jika Anda membutuhkannya (mis. git pushMungkin mendorong ke repo publik resmi dan git push review masterdapat digunakan untuk mendorong ke remote terpisah yang digunakan tim Anda untuk meninjau kode). Anda dapat mengatur cabang Anda menjadi cabang pelacakan menggunakan--set-upstreamopsi git branchperintah.

Saya merasa git (tidak seperti kebanyakan aplikasi lain yang saya gunakan) lebih baik dipahami dari dalam ke luar. Setelah Anda memahami bagaimana data disimpan dan dipelihara di dalam repositori, perintah dan apa yang dilakukannya menjadi sangat jelas. Saya setuju dengan Anda bahwa ada beberapa elitisme di antara banyak gitpengguna tetapi saya juga menemukan bahwa dengan pengguna UNIX pada suatu waktu, dan ada baiknya membajak melewati mereka untuk mempelajari sistem. Semoga berhasil!

Noufal Ibrahim
sumber
8
Anda mungkin ingin menambahkan catatan di paragraf Anda tentang transport yang menjelaskan bahwa itu [email protected]:peter/first_app.gitadalah scpsintaks gaya untuk URL ssh di git. Satu hal lain adalah bahwa, secara default, konfigurasi hulu mastertidak memengaruhi perilaku git push kecuali jika Anda telah push.defaultmenyetel ke tracking(atau upstreamdalam versi yang lebih baru) - Saya melakukan posting blog tentang sumber kebingungan ini: longair.net/blog/2011 /
02/27
1
Sebuah koreksi kecil untuk komentar itu - tanpa push.defaultkonfigurasi hulu akan digunakan untuk menemukan remote default saat Anda gunakan git push, tetapi tidak akan memengaruhi pemetaan referensi.
Mark Longair
1
Saya bertanya-tanya mengapa "luar dalam", seperti biasanya, "kotak hitam" sangat mudah dipelajari ... itu seperti pendekatan top down, dengan atas - antarmuka - apa yang Anda input dan apa yang Anda dapatkan, sangat jelas dan mudah-mudahan sederhana juga. Semua pengguna perlu peduli adalah "Antarmuka", dan benar-benar tidak perlu tahu apa yang ada di dalamnya. Jika pengguna ingin tahu lebih banyak, cara khusus implementasi, itu baik untuk diketahui, tetapi biasanya opsional.
nonopolaritas
3
Memuaskan boxen hitam vs dalam ke luar. Git adalah hal pertama yang saya temui yang sebenarnya lebih mudah untuk dipelajari dari dalam daripada dari "antarmuka". Apakah itu cara yang benar atau tidak, masih bisa diperdebatkan. Saya hanya mengatakan bahwa dalam ke luar lebih efektif ketika datang ke git.
Noufal Ibrahim
9
"git seperti UNIX. User friendly tetapi pilih-pilih tentang teman-temannya." Ini sangat mengagumkan, saya ingin dicetak pada t-shirt.
Proflux
41

Pembaruan: perhatikan bahwa jawaban yang saat ini diterima melanggengkan kesalahpahaman umum tentang perilaku git push, yang belum diperbaiki meskipun ada komentar yang menunjukkannya.

Ringkasan Anda tentang apa itu remote - seperti nama panggilan untuk URL repositori - benar.

Jadi mengapa URL tidak git: //[email protected]/peter/first_app.git tetapi di sintaks lain - sintaks apa itu? Kenapa harus diakhiri dengan .git? Saya mencoba tidak menggunakan .git pada akhirnya dan berhasil juga. Jika tidak. Git, apa lagi yang bisa terjadi? Git di pemula sepertinya adalah akun pengguna di git server?

Dua URL yang Anda sebutkan menunjukkan bahwa dua protokol transport yang berbeda harus digunakan. Yang diawali dengan git://adalah untuk protokol git, yang biasanya hanya digunakan untuk akses read-only ke repositori. Yang lain [email protected]:peter/first_app.git,, adalah salah satu cara berbeda untuk menentukan akses ke repositori melalui SSH - ini adalah "scp-style syntax" yang dijelaskan dalam dokumentasi . Bahwa nama pengguna dalam sintaks scp-style gitadalah karena cara GitHub berurusan dengan mengidentifikasi pengguna - pada dasarnya nama pengguna tersebut diabaikan, dan pengguna diidentifikasi berdasarkan pada pasangan kunci SSH yang mereka gunakan untuk otentikasi.

Adapun verbositas git push origin master, Anda telah memperhatikan bahwa setelah dorongan pertama, Anda bisa melakukannya git push. Ini karena serangkaian default yang sulit diingat tetapi umumnya membantu :)

  • Jika tidak ada remote yang ditentukan, remote yang dikonfigurasi untuk cabang saat ini (dalam remote.master.urlkasus Anda) digunakan. Jika itu tidak diatur, maka origindigunakan.
  • Jika tidak ada "refspec" (mis master. master:my-experiment, Dll.) Yang ditentukan, maka git default untuk mendorong setiap cabang lokal yang memiliki nama yang sama dengan cabang pada remote. Jika Anda hanya memiliki cabang bernama mastersama antara repositori dan yang jauh, itu akan sama dengan mendorong Anda masterke remote master.

Secara pribadi, karena saya cenderung memiliki banyak cabang topik (dan seringkali beberapa remote) saya selalu menggunakan formulir:

git push origin master

... untuk menghindari sengaja mendorong cabang lain.


Dalam membalas komentar Anda pada salah satu jawaban yang lain, kedengarannya bagi saya seolah-olah sedang belajar tentang git dengan cara top-down sangat efektif - Anda telah menemukan bahwa default bekerja, dan pertanyaan Anda bertanya tentang mengapa;) Untuk lebih serius, git bisadigunakan pada dasarnya hanya sebagai SVN, tetapi mengetahui sedikit tentang remote dan cabang berarti Anda dapat menggunakannya jauh lebih fleksibel dan ini benar-benar dapat mengubah cara Anda bekerja menjadi lebih baik. Komentar Anda tentang kursus semester membuat saya memikirkan sesuatu yang dikatakan Scott Chacon dalam wawancara podcast - siswa diajarkan tentang semua jenis alat dasar dalam ilmu komputer dan rekayasa perangkat lunak, tetapi sangat jarang mengontrol versi. Sistem kontrol versi terdistribusi seperti git dan Mercurial sekarang sangat penting, dan sangat fleksibel, sehingga layak untuk mengajarkan kursus pada mereka untuk memberi orang landasan yang baik.

Pandangan saya adalah bahwa dengan git, kurva pembelajaran ini benar-benar layak - bekerja dengan banyak cabang topik, menggabungkannya dengan mudah, dan mendorong dan menariknya di antara repositori yang berbeda akan sangat berguna sekali setelah Anda menjadi percaya diri dengan sistem. Sangat disayangkan bahwa:

  • Dokumentasi utama untuk git sangat sulit diurai untuk pendatang baru. (Meskipun saya berpendapat bahwa jika Anda Google untuk hampir semua pertanyaan git, materi tutorial bermanfaat (atau jawaban Stack Overflow :)) muncul saat ini.)
  • Ada beberapa perilaku aneh di git yang sulit diubah sekarang karena banyak skrip yang mengandalkannya, tetapi membingungkan bagi orang.
Mark Longair
sumber
Saya pikir buku pro git adalah sumber yang bagus dan mudah dimengerti bagi pendatang baru. Memperlancar kurva pembelajaran secara signifikan. Juga, saya berpikir bahwa mencoba "memetakan" SVN dan konsep terpusat lainnya ke git akan membuat jalan lebih sulit daripada mulus. Reset lengkap adalah cara yang lebih cepat dan mudah dalam pengalaman saya.
Noufal Ibrahim
@Noufal Ibrahim: Saya menyetujui semua poin Anda. Saya tidak mencoba menyarankan "memetakan" konsep SVN ke konsep git, karena saya tahu kebingungan mengerikan yang dapat menyebabkan - ada cara yang lebih baik untuk mengajar git dari atas ke bawah.
Mark Longair
9

Lihat sintaks untuk menambahkan repo jarak jauh.

git remote add origin <url_of_remote repository>

Contoh:

git remote add origin [email protected]:peter/first_app.git

Mari kita membedah perintah:

git remote ini digunakan untuk mengelola server Pusat Anda untuk hosting repositori git Anda.

Mungkin Anda menggunakan Github untuk hal-hal repositori pusat Anda. Saya akan memberikan contoh dan menjelaskan git add terpencil asal perintah

Misalkan saya bekerja dengan GitHub dan BitBucket untuk server pusat untuk repositori git dan telah membuat repositori pada kedua situs web untuk proyek aplikasi pertama saya .

Sekarang jika saya ingin mendorong perubahan saya ke kedua server git ini maka saya perlu memberi tahu git bagaimana mencapai repositori sentral ini. Jadi saya harus menambahkan ini,

Untuk GitHub

git remote add gh_origin https://github.com/user/first-app-git.git

Dan Untuk BitBucket

git remote add bb_origin https://[email protected]/user/first-app-git.git

Saya telah menggunakan dua variabel (sejauh ini mudah bagi saya untuk memanggil mereka variabel) gh_origin (gh FOR GITHUB) dan bb_origin (bb untuk BITBUCKET) hanya untuk menjelaskan Anda, kami dapat memanggil asal apa pun yang kami inginkan.

Sekarang setelah membuat beberapa perubahan, saya harus mengirim (mendorong) semua perubahan ini ke repositori pusat sehingga pengguna lain dapat melihat perubahan ini. Jadi saya menelepon

Mendorong ke GitHub

git push gh_origin master

Mendorong ke BitBucket

git push bb_origin master

gh_origin memegang nilai https://github.com/user/first-app-git.git dan bb_origin memegang nilai https: //[email protected]/user/first-app-git.git

Dua variabel ini membuat hidup saya lebih mudah

karena setiap kali saya perlu mengirim perubahan kode saya, saya perlu menggunakan kata-kata ini alih-alih mengingat atau mengetik URL untuk hal yang sama.

Sebagian besar waktu Anda tidak akan melihat apa pun kecuali dari asal karena sebagian besar kali Anda akan berurusan dengan hanya satu repositori pusat seperti Github atau BitBucket misalnya.

Pak Suryaa Jha
sumber
5
  1. Di .gitakhir nama repositori hanyalah sebuah konvensi. Biasanya, pada repositori server git disimpan dalam direktori yang bernama project.git. Klien dan protokol git menghormati konvensi ini dengan menguji project.gitkapan hanya projectditentukan.

  2. git://[email protected]/peter/first_app.gitbukan url git yang valid. repositori git dapat diidentifikasi dan diakses melalui berbagai skema url yang ditentukan di sini . [email protected]:peter/first_app.git adalah sshurl yang disebutkan di halaman itu.

  3. gitfleksibel. Ini memungkinkan Anda untuk melacak cabang lokal Anda terhadap hampir semua cabang repositori apa pun. Sementara master(cabang default lokal Anda) pelacakan origin/master(cabang default jauh) adalah situasi yang populer, itu tidak universal. Sering kali Anda mungkin tidak ingin melakukan itu. Inilah sebabnya mengapa yang pertama git pushbegitu verbose. Ini memberitahu git apa yang harus dilakukan dengan mastercabang lokal ketika Anda melakukan a git pullatau a git push.

  4. Default untuk git pushdan git pullberfungsi dengan remote cabang saat ini. Ini adalah standar yang lebih baik daripada master asal. Cara git push menentukan ini dijelaskan di sini .

git cukup elegan dan mudah dipahami tetapi ada kurva belajar yang harus dijalani.

anshul
sumber
1
Seperti yang saya komentari pada jawaban yang lain, dalam konfigurasi default git, git pushtidak menggunakan variabel konfigurasi yang diatur git branch/checkout --trackuntuk menentukan remote ref mana yang harus ditekan. Anda benar bahwa git pull memang menggunakan ini.
Mark Longair
0

Git remote tambahkan asal:

Ini memusatkan kode sumber Anda ke proyek lain. Ini dikembangkan berdasarkan Linux, menyelesaikan open source dan membuat kode Anda berguna bagi pengguna git lain. Kami menyebutnya sebagai referensi

Dorong kode Anda ke repositori git menggunakan url jarak jauh dari hub git.

SaiPutta
sumber