Mengapa saya perlu mendorong cabang baru secara eksplisit?

180

Saya baru masuk gitdan sedang berlatih. Saya membuat cabang lokal tetapi saya melihat bahwa ketika saya melakukannya git push, cabang saya tidak diunggah ke repositori. Aku harus benar-benar melakukan: git push -u origin --all.
Kenapa ini? Bukankah cabang perubahan baru yang didorong secara default? Mengapa saya perlu menjalankan perintah kedua?

Cratylus
sumber
15
Perhatikan bahwa ini dapat dikonfigurasi (pengaturan push.default, lihat man git-config). Jika Anda melakukannya git config --add push.default current, maka git pushsecara otomatis akan membuat cabang di repo jarak jauh jika perlu. Mengapa ini bukan default dijelaskan dalam jawaban.
sleske
@sleske saya setuju. Untuk kebijakan lain ' current' dan ' upstream', lihat jawaban saya yang lebih lama stackoverflow.com/a/13751847/6309 .
VonC
Mengapa tidak menerima jawaban?
laike9m

Jawaban:

224

Alasan sebenarnya adalah bahwa, dalam repo baru (git init), tidak ada cabang (tidak master, tidak ada cabang sama sekali, nol cabang)

Jadi, ketika Anda mendorong untuk pertama kalinya ke repo hulu kosong (umumnya yang kosong ), repo hulu tidak memiliki cabang dengan nama yang sama.

Dan:

Dalam kedua kasus, karena repo kosong hulu tidak memiliki cabang:

  • belum ada cabang bernama yang cocok
  • tidak ada cabang hulu sama sekali (dengan atau tanpa nama yang sama! Pelacakan atau tidak)

Itu berarti dorongan lokal pertama Anda tidak tahu:

  • ke mana harus mendorong
  • apa yang harus didorong (karena tidak dapat menemukan cabang hulu dicatat sebagai cabang pelacakan jarak jauh, dan / atau memiliki nama yang sama)

Jadi, Anda setidaknya perlu melakukan:

git push origin master

Tetapi jika Anda hanya melakukan itu, Anda:

  • akan membuat mastercabang hulu di hulu (sekarang repo tidak kosong): bagus.
  • tidak akan mencatat bahwa cabang lokal ' master' perlu didorong ke hulu ( origin) ' master' (cabang hulu): buruk.

Itulah mengapa disarankan, untuk dorongan pertama, untuk melakukan:

git push -u origin master

Itu akan merekam origin/mastersebagai cabang pelacakan jarak jauh , dan akan memungkinkan dorongan berikutnya untuk secara otomatis mendorong masterke origin/master.

git checkout master
git push

Dan itu akan bekerja juga dengan kebijakan push ' current' atau ' upstream'.
Dalam setiap kasus, setelah inisial git push -u origin master, dorongan git yang sederhana akan cukup untuk terus mendorong master ke cabang hulu kanan.

VONC
sumber
2
Setelah titik ini, selanjutnya git pushjuga mengharapkan cabang sudah ada?
Cratylus
2
Iya. Ini akan mendorong setiap pembaruan ke cabang itu ke repositori hulu.
RyPeck
@Cratylus ya, karena kebijakan push default baru ' simple': push ke cabang upstream yang tercatat, jika cabang upstream itu memiliki nama yang sama dengan yang lokal. Sederhana git pushsaja sudah cukup.
VonC
1
@ButtleButkus Terima kasih. Saya telah memulihkan tautannya.
VonC
3
Untuk kasus yang lebih umum dari cabang baru 'new_branch', Anda akan menggunakan git push --set-upstream origin new_branchatau git push -u origin new_branchsingkatnya. The -allbahwa penanya digunakan dilewati penamaan cabang baru tertentu dengan termasuk semua cabang. Ini dicakup oleh + Klas Mellbourn dalam jawabannya.
Paul Masri-Stone
106

Anda tidak, lihat di bawah

Saya menemukan 'fitur' ini agak mengganggu karena saya tidak mencoba meluncurkan roket ke bulan, cukup dorong cabang sialan saya. Anda mungkin melakukannya juga atau Anda tidak akan ada di sini!

Ini adalah perbaikannya: jika Anda ingin secara implisit mendorong untuk cabang saat ini terlepas dari apakah cabang itu ada pada asal hanya mengeluarkan perintah ini sekali dan Anda tidak akan pernah harus lagi di mana saja:

git config --global push.default current

Jadi, jika Anda membuat cabang seperti ini:

git checkout -b my-new-branch

dan kemudian melakukan beberapa komitmen dan kemudian melakukan a

git push -u

untuk mengeluarkannya dari asal (berada di cabang itu) dan itu akan membuat cabang tersebut untuk Anda jika tidak ada.

Perhatikan bit -u memastikan mereka terhubung jika Anda menarik nanti dari cabang tersebut. Jika Anda tidak memiliki rencana untuk menarik cabang nanti (atau boleh saja dengan satu liner jika Anda melakukannya) -u tidak perlu.

John Culviner
sumber
3
Ketika saya melakukan ini, jika saya melakukan git pull, segera setelah - dua cabang tidak terhubung. :(
Alisso
ini adalah satu-satunya jawaban yang memperbaiki masalah saya.
Raymond Chenon
2
Untuk menghubungkan mereka, gunakangit push -u
Ben Creasy
Terima kasih! Jawaban ini harus diterima sebagai solusi cepat dan 'kotor'. Saya cukup yakin itu paling dekat dengan niat OP.
youngrrrr
3
> Saya tidak mencoba meluncurkan roket ke bulan. -- IYA.
VCavallo
39

Output git pushketika mendorong cabang baru

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

git pushAsumsi sederhana bahwa sudah ada cabang terpencil yang dilacak oleh cabang lokal saat ini. Jika tidak ada cabang jarak jauh seperti itu, dan Anda ingin membuatnya, Anda harus menentukan bahwa menggunakan flag -u(bentuk pendek --set-upstream).

Kenapa begitu? Saya kira para pelaksana merasa bahwa membuat cabang pada remote adalah suatu tindakan besar sehingga harus sulit melakukannya secara tidak sengaja. git pushadalah sesuatu yang Anda lakukan sepanjang waktu.

"Bukankah cabang perubahan baru yang didorong secara default?" Saya akan mengatakan bahwa "perubahan" di Git adalah komitmen. Cabang adalah pointer ke komit. Bagi saya lebih masuk akal untuk memikirkan dorongan sebagai sesuatu yang mendorong komitmen ke repositori lain. Komit mana yang didorong ditentukan oleh cabang mana Anda berada dan hubungan pelacakan dari cabang itu ke cabang di remote.

Anda dapat membaca lebih lanjut tentang melacak cabang di bab Cabang Jarak Jauh dari buku Pro Git .

Klas Mellbourn
sumber
Saya tidak mendapatkan fataltetapi saya sudah melakukan komit di cabang. Apakah hal ini?
Cratylus
@Cratylus tidak tidak masalah. Komit aman di repositori Anda, dan git push -u origindisalin ke repositori jarak jauh.
Klas Mellbourn
Tidak, maksud saya kenyataan bahwa saya tidak mendapatkan fatalpesan seperti yang Anda sebutkan dalam jawaban. Apakah perbedaan ini bergantung pada fakta bahwa saya melakukan sesuatu pada cabang?
Cratylus
@Cratylus Saya tidak tahu mengapa Anda tidak mendapatkan fatalpesan itu. Saya kira perbedaannya tergantung pada implementasi git yang Anda gunakan. Output saya dari 1.8.1.msysgit.1 berjalan di Windows 8.
Klas Mellbourn
Saya memiliki versi yang sama tetapi pada Vista
Cratylus
4

Saya tidak dapat menemukan alasan oleh pengembang asli ini secepat ini, tetapi saya dapat memberikan Anda tebakan yang dididik berdasarkan pengalaman Git selama beberapa tahun.

Tidak, tidak setiap cabang adalah sesuatu yang ingin Anda dorong ke dunia luar. Itu mungkin mewakili eksperimen pribadi.

Apalagi ke mana harus git pushmengirim semua cabang? Git dapat bekerja dengan beberapa remote dan Anda mungkin ingin memiliki set cabang yang berbeda pada masing-masing. Misalnya repo proyek pusat GitHub mungkin memiliki cabang rilis; garpu GitHub dapat memiliki cabang topik untuk ditinjau; dan server Git lokal mungkin memiliki cabang yang berisi konfigurasi lokal. Jika git pushakan mendorong semua cabang ke remote yang dilacak oleh cabang saat ini, skema semacam ini akan mudah dikacaukan.

Fred Foo
sumber
1). It might represent a private experimentOke tapi apa masalahnya? Cabang "utama" yang digunakan semua orang yaitu mastertidak terpengaruh. Kecuali Anda bermaksud menyembunyikan kode sumber 2) git push, without a remote, pushes to the current branch's remoteSaya kehilangan Anda di sini :(
Cratylus
@Cratylus: 1) dalam sebuah proyek dengan lusinan pengembang yang semuanya cabang iklan, Anda akan mendapatkan repo yang sangat berantakan. Saya mengerjakan proyek-proyek seperti itu, dan saya tidak ingin git fetchratusan cabang setengah bekerja setiap saat. 2) Saya mengacu pada git pushperilaku default. Ini mendorong ke remote yang dilacak oleh cabang saat ini, jika ada.
Fred Foo
3

HEAD adalah kependekan dari cabang saat ini sehingga git push -u asal HEAD berfungsi. Sekarang untuk menghindari pengetikan ini setiap kali saya menggunakan alias:

git config --global alias.pp 'push -u origin HEAD'

Setelah ini, setiap kali saya ingin mendorong cabang yang dibuat melalui cabang git -b saya bisa mendorongnya menggunakan:

git pp

Semoga ini menghemat waktu untuk seseorang!

Aurimas Rekštys
sumber
2

Pada pemeriksaan pertama

Langkah-1: git remote -v
// jika ditemukan git menginisialisasi kemudian hapus atau lewati langkah-2

Langkah-2: git remote rm origin
// Kemudian konfigurasikan alamat email Anda secara global git

Langkah-3: git config --global user.email "[email protected]"

Langkah-4: git initial

Langkah-5: git commit -m "Initial Project"
// Jika sudah menambahkan repo proyek maka lewati langkah-6

Langkah-6: git remote add origin %repo link from bitbucket.org%

Langkah-7: git push -u origin master

Ny. Milton
sumber
1

Saya baru saja mengalami permutasi lebih lanjut dari masalah ini.

Saya memiliki nama cabang feat/XYZ-1234-some-descriptionkarena saya mengerjakan Jira edisi 1234. Selama pekerjaan saya membuat masalah Jira baru untuk melacak bagian yang lebih kecil dari pekerjaan, dan ketika saya datang untuk mendorong saya memutuskan untuk mendorong ke nama cabang dengan nomor penerbitan baru ini. di:

git push -u origin feat/XYZ-5678-a-different-description # failed

Ini memberi saya kesalahan yang sedang dibahas di utas SO ini. Tetapi karena saya mencoba untuk mendorong ke nama cabang yang berbeda dari cabang saya saat ini, masalah saya berbeda dengan yang dijelaskan di sini. Saya akhirnya mengganti nama cabang lokal saya sebelum saya bisa mendorongnya:

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

Setelah sedikit lebih membaca sekitar saya menyadari bahwa saya bisa menetapkan srcpada git push, baik untuk nama cabang saat, atau hanya HEADjika sesuai:

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works
Mark Birbeck
sumber
-1

Jika Anda mengaktifkan untuk mendorong perubahan baru dari cabang baru Anda pertama kali. Dan mendapatkan kesalahan di bawah ini:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

Untuk mendorong cabang saat ini dan mengatur remote sebagai upstream, gunakan

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
Mukesh Kumar
sumber