Mengapa "origin / HEAD" ditampilkan saat menjalankan "git branch -r"?

160

Ketika Anda menjalankan git branch -rmengapa api itu daftar origin/HEAD? Sebagai contoh, ada repo jarak jauh di GitHub, katakanlah, dengan dua cabang: master dan fitur-mengagumkan. Jika saya lakukan git cloneuntuk mengambilnya dan kemudian masuk ke direktori baru saya dan daftar cabang, saya melihat ini:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

Atau apa pun urutannya (alpha? Saya memalsukan contoh ini untuk menjaga identitas repo yang tidak bersalah). Jadi, apa HEADbisnisnya? Apakah apa yang orang terakhir yang pushharus mereka HEADmenunjuk pada saat mereka mendorong? Bukankah itu selalu menjadi apa pun yang mereka lakukan push? HEADAda yang bergerak ... mengapa saya peduli dengan apa yang seseorang HEADtunjuk pada komputer lain?

Saya hanya bisa menangani pelacakan jarak jauh dan semacamnya, jadi ini adalah kebingungan yang masih ada. Terima kasih!

EDIT: Saya mendapat kesan bahwa repo jarak jauh yang didedikasikan (seperti GitHub di mana tidak ada yang akan ssh dan bekerja pada kode itu, tetapi hanya menarik atau mendorong, dll) tidak dan tidak boleh memiliki KEPALA karena ada, pada dasarnya, tidak ada copy pekerjaan. Tidak begitu?

Ben Hamill
sumber

Jawaban:

140

@robinst benar.

Di git, Anda dapat memilih cabang mana yang diperiksa secara default (yaitu ketika Anda mengkloning). Secara default, origin/HEADakan menunjuk pada itu.

Pada GitHub, Anda dapat mengubahnya di pengaturan Admin untuk repo GitHub Anda. Anda juga dapat melakukannya dari command-line via

git remote set-head origin trunk

atau hapus semuanya melalui

git remote set-head origin -d

Contoh . Lihatlah drop-down 'Switch Branches'. trunkdicentang, jadi origin/HEADikuti trunk.

cdunn2001
sumber
Saya mengganti nama remote lain menjadi origindan otherremote/HEAD -> mastermengganggu saya. Menjalankan perintah Anda memperbaikinya untuk saya.
Felipe Alvarez
59

Alasan repositori telanjang dapat memiliki HEAD, adalah karena repositori menentukan cabang mana yang awalnya diperiksa setelah klon repositori.

Biasanya, HEAD menunjuk ke master, dan itu adalah cabang yang diperiksa ketika orang mengkloning repositori. Menyetelnya ke cabang lain (dengan mengedit HEAD dalam repositori kosong) menghasilkan cabang yang sedang diperiksa di clone.

robinst
sumber
2
Karena dimungkinkan untuk menghapus referensi ini tanpa mendorong, origin/HEADapakah referensi lokal benar? Apakah menghapusnya berpengaruh pada origin?
Zach Posten
@ zposten: Tidak, dengan cara yang sama menghapus origin/mastertidak mempengaruhi remote.
robinst
Itu berarti bahwa setelah mengkloning referensi hanyalah sepotong informasi yang tidak berguna.
Bachsau
@Bachsau referensi tidak dikloning.
robinst
27

Saya mendapat kesan bahwa repo jarak jauh khusus (seperti GitHub di mana tidak ada yang akan ssh dan bekerja pada kode itu, tetapi hanya menarik atau mendorong, dll) tidak dan tidak boleh memiliki KEPALA karena pada dasarnya tidak ada pekerjaan menyalin. Tidak begitu?

Saya memiliki kesan yang sama persis seperti yang Anda katakan.

Dan saya bahkan tidak bisa menghapus asal / HEAD cabang pelacakan jarak jauh yang diklon dari github dengan melakukan

git branch -d -r origin/HEAD

Ini tidak berpengaruh.

Dapatkah seseorang memberi tahu saya cara menghapus cabang pelacakan jarak asal / HEAD itu?

memperbarui

Meskipun saya tidak menemukan mengapa ada asal / KEPALA dibuat ketika klon dari github, saya menemukan cara untuk menghapusnya.

Versi baru dari git menyediakan

git remote set-head <name> -d

untuk menghapus pointer HEAD yang tidak berguna dari cabang pelacakan jarak jauh.

Dan kita juga bisa mengubah nama default 'asal' bodoh menjadi apa pun yang kita inginkan dengan menggunakan

git remote rename origin <new_name>

Semoga ini bisa membantu. :)

boblu
sumber
Saya mengalami masalah yang sama (bahkan di GitHub), dan set-head tidak berfungsi. Haruskah saya menjalankan 'git remote set-head HEAD -d'?
Joost Schuur
5
@ Joost: inigit remote set-head origin -d
znq
13

Anda benar bahwa mendorong repo jarak jauh bekerja lebih baik ketika mereka 'telanjang', yaitu ketika mereka tidak memiliki direktori yang berfungsi. Arsitektur Git dirancang untuk memperbarui oleh tambalan atau pull( fetch), yang masuk akal dalam VCS yang didistribusikan. Seperti yang dikatakan dokumen di suatu tempat, mendorong ke cabang yang saat ini diperiksa dapat menghasilkan "hasil yang tidak terduga" .

HEAD adalah bagian dari persyaratan untuk repositori yang valid. Tata Letak Repositori Git mengatakan, sebagian:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

Jadi, Anda akan melihat KEPALA sebagai bagian dari daftar cabang, bahkan jika "itu tidak berarti banyak ..."

Paul
sumber
Ini tidak masuk akal. Repositori mulai terbuka tetapi begitu Anda mendorong sesuatu ke mereka, mereka tidak lagi kosong dan jika Anda menjalankan "git branch" pada mereka, mereka akan menunjukkan cabang yang saat ini sudah diperiksa.
geoidesic
@geoidesic Sebuah repositori bisa kosong meskipun Anda telah mendorongnya. Berikut ini: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "[email protected]"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareoutput benar. Juga tidak ada salinan yang berfungsi dari file terdorong di repo foobar atas perintah tersebut.
Anders Lindén
@geoidesic Sebuah repositori bisa kosong meskipun Anda telah mendorongnya. Berikut ini: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "[email protected]"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareoutput benar. Juga tidak ada salinan yang berfungsi dari file terdorong di repo foobar atas perintah tersebut.
Anders Lindén
@geoidesic A --bit git repo hanya berarti repo tanpa pohon yang berfungsi, yaitu repo yang hanya berisi direktori .git, tetapi tidak dapat memiliki file yang diperiksa sama sekali. Karena tidak dapat memeriksa file, maka sebenarnya tidak memiliki direktori .git, hanya menempatkan semua file .git langsung di direktori utama. Buat satu dan Anda akan melihat!
00prometheus
5

Jika "origin" adalah repositori jarak jauh, maka origin / HEAD mengidentifikasi cabang default pada repositori jarak jauh itu.

Contoh:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: [email protected]:walkerh/pipe-o-matic.git
  Push  URL: [email protected]:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Perhatikan baris yang mengatakan "KEPALA cabang: master". Di sinilah repositori jarak jauh memungkinkan klien mengetahui cabang mana yang akan checkout secara default.

Walker Hale IV
sumber
1

Selalu ada KEPALA yang menunjuk ke cabang yang sedang diperiksa di repo jarak jauh (yang mungkin atau mungkin tidak menjadi master). Bahkan repositori jarak jauh memiliki cabang saat ini. Biasanya itu adalah master, dan dari atas kepala saya, saya tidak bisa memikirkan alasan mengapa seseorang ingin mengubahnya, tetapi itu bisa diubah.

codelogic
sumber
2
repo github tidak memeriksa cabang. Saya tidak mengerti mengapa ini berlaku.
Dustin
Repositori jarak jauh TIDAK boleh memiliki direktori yang berfungsi. Repositori jarak jauh harus --bare dan karenanya tidak dapat memiliki cabang yang sedang diperiksa.
n4rzul
-14

Dugaan saya adalah seseorang mendorong cabang dan menyebutnya KEPALA:

git push origin HEAD
Dustin
sumber
Bisakah saya mendapatkan komentar tentang apa yang salah dengan ini? Jika Anda ingin asal / KEPALA di github, itulah satu-satunya cara saya tahu untuk mendapatkannya di sana.
Dustin
Remote HEAD adalah ref simbolik (biasanya untuk ref / head / master). Anda akan mengganti ref simbolik dengan hash id dari commit dari cabang Anda saat ini.
Daniel Fanjul
2
Bukankah seharusnya tebakan didiskusikan dalam komentar alih-alih menjadi jawaban yang tidak tepat?
Luciano