Pesan kesalahan yang membingungkan dari git

94

Saya mendapat pesan ini dari Git:

Anda diminta untuk menarik dari 'asal' jarak jauh, tetapi tidak menentukan cabang. Karena ini bukan remote terkonfigurasi default untuk cabang Anda saat ini, Anda harus menentukan cabang pada baris perintah.

Adakah yang bisa menjelaskannya? dan yang lebih penting bagaimana cara memperbaikinya?

cinek
sumber

Jawaban:

94

Anda harus memberi tahu git cabang mana yang ingin Anda tarik dari remote repo "origin".

Saya kira Anda ingin cabang default (master) jadi git pull origin masterharus memperbaiki masalah Anda.

Lihat git help branch, git help pulldan git help fetch untuk informasi lebih lanjut.

p4bl0
sumber
2
untuk membuatnya bekerja saya harus checkout "master" cabang (tidak ada cabang yang dipilih) dan tarik, yang memperbaiki masalah.
cinek
@cinek: Ya, git pullmenarik dan menggabungkan dengan cabang saat ini sehingga perilakunya sepenuhnya tergantung pada cabang mana yang diperiksa, dan dengan HEAD yang terpisah (tidak ada cabang yang diperiksa), tidak mungkin ia dapat mengetahui cabang mana yang harus ditarik.
Cascabel
@cinek: Saya kira Anda baru mengenal git, jadi saya akui bahwa Anda berada dalam keadaan standar total pada master cabang, saya buruk :-).
p4bl0
86

Untuk memperbaikinya, dengan asumsi Anda berada di mastercabang dan ingin menarik mastercabang dari originjarak jauh, dalam versi Git yang cukup baru (1.8 atau lebih baru):

git branch -u origin/master master

(Secara analogi untuk cabang dan / atau remote lain.)

Jika Anda dapat menggabungkan ini dengan dorongan, itu bahkan lebih pendek:

git push -u origin master

Setelah itu, polos git pull/ git pushakan melakukan apa yang Anda harapkan.


Selama seri Git 1.7, git branchtidak ada -usakelar (hanya ada git push), dan sebaliknya Anda harus menggunakan lebih lama --set-upstream:

git branch --set-upstream master origin/master

Perhatikan pembalikan argumen dibandingkan dengan -u. Saya meraba-raba pesanan ini lebih dari sekali.


Semua ini, omong-omong, adalah singkatan untuk melakukan hal berikut, yang masih dapat Anda lakukan secara eksplisit:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Sebelum 1.7, Anda harus melakukannya dengan cara ini.

Aristoteles Pagaltzis
sumber
Saya berpikir bahwa perintah di atas (setidaknya dalam versi Git saya) mengatur upstream dari cabang yang disebut "origin" menjadi "origin / master". Jika cabang Anda secara lokal disebut "master", saya rasa Anda akan menginginkan:git branch --set-upstream master origin/master
Evan Donovan
Menariknya, -uopsi ini tidak terdokumentasi git branchdalam versi saya, 1.8.5.3, membuat dokumentasi Anda di sini menjadi lebih penting. Dan, sebagai catatan Anda, opsi tersebut tidak tersedia di versi 1.7. *. Karena -usingkatnya --set-upstream, bukankah urutan argumennya harus dibalik seperti yang Anda lakukan --set-upstreamkarena komentar @ EvanDonovan?
kompor
Namun, ketika saya menggunakan perintah yang Anda tampilkan ( git branch -u origin/master master) , perintah itu berfungsi seperti yang diharapkan / dimaksudkan untuk saya: "Master cabang disiapkan untuk melacak master cabang jarak jauh dari asal."
kompor
1
@hobs: itu sebenarnya adalah penyimpangan dari Git. The -uswitch sebenarnya tidak bentuk pendek dari --set-upstream. Urutan argumennya secara efektif dibalik dari urutan untuk --set-upstream. Saya pikir itu baru kemudian --set-upstream-to(perhatikan "-untuk") diperkenalkan, yang -usekarang sebenarnya merupakan bentuk singkat dari.
Aristoteles Pagaltzis
Wow! Memang membingungkan. Terima kasih telah menguraikannya untuk saya.
kompor pada
3

Pesan mengatakan dengan tepat tentang apa itu. Cabang Anda saat ini tidak terkait dengan (tidak melacak) cabang mana pun di asalnya . Jadi git tidak tahu harus menarik apa.

Apa yang harus dilakukan? Itu tergantung...

Dalam situasi yang paling umum Anda mengerjakan beberapa cabang lokal xyz yang bercabang dari master yang dikloning dari master asal . Cara yang biasa untuk mengatasinya adalah dengan beralih ke master dan pull untuk menyinkronkannya dengan origin lalu kembali ke xyz dan rebase master.

Tetapi dalam situasi Anda, Anda mungkin ingin melakukan sesuatu yang lain. Kami tidak dapat mengetahuinya tanpa mengetahui detail cabang dan remote Anda dan bagaimana Anda bermaksud menggunakannya.

Tomek Szpakowicz
sumber