Saya memiliki cabang yang dibentuk untuk melacak referensi yang berasal. git checkout <branchname>
beralih ke cabang itu, dan surat git status
wasiat menunjukkan kepada saya seberapa jauh ke depan atau di belakang cabang saya dari asal, tapi saya terkejut bahwa origin/HEAD
masih menunjuk origin/master
, dan tidakorigin/<branchname>
Jadi pertanyaan saya adalah, dalam kondisi apa asal / HEAD dipindahkan?
EDIT:
Saya menghargai jawaban tentang bagaimana memindahkan asal / KEPALA, tapi saya tertarik dengan apa yang "organik" memindahkannya, di luar saya secara eksplisit mengatakannya untuk melakukannya.
Sebagai contoh, ketika saya beralih cabang, git membuat titik HEAD di cabang yang saya periksa, jadi saya terkejut bahwa asal / HEAD tidak bergerak dengan cara yang sama.
refs/origin/HEAD
. Ini bukan tentang bagaimana referensi simbolis repositori sendiriHEAD
akan ditetapkan.Jawaban:
Perhatikan dulu bahwa pertanyaan Anda menunjukkan sedikit kesalahpahaman. origin / HEAD mewakili cabang default pada remote , yaitu HEAD yang ada di repositori jauh yang Anda panggil asal. Saat Anda mengganti cabang di repo Anda, Anda tidak memengaruhi itu. Hal yang sama berlaku untuk cabang yang jauh; Anda mungkin memiliki
master
danorigin/master
dalam repo Anda, di manaorigin/master
merupakan salinan lokalmaster
cabang di repositori jarak jauh.KEPALA asal hanya akan berubah jika Anda atau orang lain benar-benar mengubahnya di repositori jarak jauh , yang pada dasarnya seharusnya tidak pernah terjadi - Anda ingin cabang default repo publik tetap konstan, pada cabang stabil (mungkin master). origin / HEAD adalah ref lokal yang mewakili salinan HEAD lokal dalam repositori jarak jauh. (Nama lengkapnya adalah ref / remote / origin / HEAD.)
Saya pikir jawaban di atas menjawab apa yang sebenarnya ingin Anda ketahui, tetapi untuk terus maju dan menjawab pertanyaan yang Anda tanyakan secara eksplisit ... asal / KEPALA diatur secara otomatis ketika Anda mengkloning repositori, dan hanya itu. Anehnya, itu tidak diatur oleh perintah seperti
git remote update
- Saya percaya satu-satunya cara itu akan berubah adalah jika Anda mengubahnya secara manual. (Dengan perubahan yang saya maksud arahkan ke cabang yang berbeda; jelas komit itu menunjuk ke perubahan jika cabang itu berubah, yang mungkin terjadi saat mengambil / menarik / memperbarui jarak jauh.)Sunting : Masalah yang dibahas di bawah ini diperbaiki di Git 1.8.4.3 ; lihat pembaruan ini .
Ada peringatan kecil. KEPALA adalah ref simbolik, menunjuk ke cabang bukannya langsung ke komit, tetapi protokol transfer jarak jauh git hanya melaporkan komit untuk ref. Jadi Git tahu SHA1 dari commit yang ditunjuk oleh HEAD dan semua referensi lainnya; kemudian harus menyimpulkan nilai KEPALA dengan menemukan cabang yang menunjuk ke komit yang sama. Ini berarti bahwa jika dua cabang kebetulan menunjuk ke sana, itu ambigu. (Saya percaya itu mengambil master jika memungkinkan, kemudian kembali ke alfabet pertama.) Anda akan melihat ini dilaporkan dalam output dari
git remote show origin
:Anehnya, walaupun gagasan HEAD yang dicetak dengan cara ini akan berubah jika segalanya berubah pada remote (mis. Jika foo dihapus), itu sebenarnya tidak memperbarui
refs/remotes/origin/HEAD
. Ini dapat menyebabkan situasi yang sangat aneh. Katakan bahwa dalam contoh di atas asal / KEPALA sebenarnya menunjuk ke foo, dan cabang foo asal itu kemudian dihapus. Kami kemudian dapat melakukan ini:Jadi meskipun remote show tahu HEAD adalah master, ia tidak memperbarui apa pun. Cabang basi foo dipangkas dengan benar, dan KEPALA menjadi menggantung (menunjuk ke cabang tidak ada), dan itu masih tidak memperbaruinya untuk menunjuk ke master. Jika Anda ingin memperbaiki ini, gunakan
git remote set-head origin -a
, yang secara otomatis menentukan HEAD asal seperti di atas, dan kemudian benar-benar menetapkan asal / HEAD untuk menunjuk ke cabang jarak jauh yang sesuai.sumber
git remote set-head origin -a
melakukan pekerjaan untuk sayaIni adalah pengaturan Anda sebagai pemilik repo lokal Anda. Ubah seperti ini:
Dan asal / KEPALA akan menunjuk ke cabang Anda, bukan master. Ini kemudian akan berlaku untuk repo Anda saja dan tidak untuk orang lain. Secara default, ini akan menunjuk ke master, kecuali ada sesuatu yang telah dikonfigurasi pada repo jarak jauh.
Entri manual untuk set-head jarak jauh menyediakan beberapa informasi bagus tentang ini.
Sunting: untuk menekankan: tanpa Anda menyuruhnya, satu-satunya cara ia akan "pindah" akan menjadi kasus seperti mengganti nama cabang master , yang saya pikir tidak dianggap "organik". Jadi, saya katakan secara organik itu tidak bergerak.
sumber
Apa yang bergerak asal / KEPALA "organik"?
git clone
menyetelnya sekali ke tempat asal HEADgit clone
Mewakili apa KEPALA asal?
git clone
menggunakannya sedemikian rupaApa yang mengatur asal / KEPALA?
git clone
mengambil dan mengaturnyagit fetch
memperbaruinya seperti referensi lain, tetapi tidakgit remote set-head origin -a
mengambil dan mengaturnyaHal sepele
origin/HEAD
juga dapat diatur ke nilai lain apa pun tanpa menghubungi remote:git remote set-head origin <branch>
sumber
origin/HEAD
dan solusi Anda membantu. Terima kasih!git fetch
memperbaruinya, karena memungkinkan untuk mengkonfigurasi pintasan (lokal). Mengutip dokumen: "Memiliki cabang default untuk remote tidak diperlukan, tetapi memungkinkan nama remote ditentukan sebagai pengganti cabang tertentu". Akan aneh jika perubahan jarak jauh akan memperbarui pintasan yang dikonfigurasi secara lokal.origin/HEAD
adalah nama yang buruk. Dan itugit clone
menggunakan nama jarak jauh sebagai default untuk "cabang yang dikonfigurasikan secara lokal" juga bertentangan dengan itu. Pada repositori non-telanjang, bahkan tidak masuk akal untuk menggunakan remote saat iniHEAD
.Penafian : ini adalah pembaruan untuk jawaban Jefromi , yang saya tulis untuk menghemat waktu yang penasaran.
Saya mencoba mereplikasi (dalam Git 2.0.1) dengan sia-sia
remote HEAD is ambiguous
pesan yang Jefromi sebutkan dalam jawabannya; jadi saya melakukan sedikit penggalian (dengan mengkloning https://github.com/git/git dan mencari log). Dulu itu(Commit
4229f1fa325870d6b24fe2a4c7d2ed5f14c6f771
, tanggal 27 Feb 2009, ditemukan bersamagit log --reverse --grep="HEAD is ambiguous"
)Namun, ambiguitas yang dipermasalahkan telah diangkat :
(Berkomitmen
9196a2f8bd46d36a285bdfa03b4540ed3f01f671
, tertanggal 8 November 2013, ditemukan dengangit log --grep="ambiguous" --grep="HEAD" --all-match
)Edit (terima kasih kepada torek ):
Ini berarti bahwa, jika Anda menggunakan Git v1.8.4.3 atau lebih baru , Anda seharusnya tidak mengalami masalah ambigu-remote-HEAD.
sumber
Ingat ada dua repo git independen yang sedang kita bicarakan. Repo lokal Anda dengan kode Anda dan kendali jarak jauh berjalan di tempat lain.
Anda benar, ketika Anda mengubah cabang, KEPALA menunjuk ke cabang Anda saat ini. Semua ini terjadi pada git repo lokal Anda. Bukan repo jarak jauh, yang bisa dimiliki oleh pengembang lain, atau duduk di bagian di kantor Anda, atau github, atau direktori lain di sistem file, atau dll ...
Komputer Anda (repo lokal) tidak memiliki urusan mengubah pointer HEAD pada repo git jarak jauh. Itu bisa dimiliki oleh pengembang yang berbeda misalnya.
Satu hal lagi, apa yang komputer Anda sebut sebagai asal / XXX adalah pemahaman komputer Anda tentang keadaan remote pada saat pengambilan terakhir.
Jadi apa yang "organik" akan memperbarui asal / KEPALA? Ini akan menjadi aktivitas pada repo git jarak jauh. Bukan repo lokal Anda.
Orang-orang menyebutkan
Biasanya, itu digunakan ketika ada repo git pusat bersama pada server untuk digunakan oleh tim pengembangan. Itu akan menjadi perintah yang dijalankan di komputer jarak jauh. Anda akan melihat ini sebagai aktivitas pada repo git jarak jauh.
sumber
Jalankan perintah berikut dari git CLI:
sumber