Apa KEPALA di git?

232

Tampaknya ada perbedaan antara komit terakhir, KEPALA dan keadaan file yang dapat saya lihat di direktori saya.

Apa itu KEPALA, apa yang bisa saya lakukan dengannya dan kesalahan apa yang harus saya hindari?

e-satis
sumber
1
Dimulai dengan Git v1.8.4, semua jawaban di bawah ini digunakan yang HEADatau headsekarang dapat menggunakan @di tempat HEADsebaliknya. Lihat jawaban ini (bagian terakhir) untuk mempelajari mengapa Anda bisa melakukan itu.
3
Dari git-scm : HEAD di Git adalah pointer ke referensi cabang saat ini, yang pada gilirannya adalah pointer ke komit terakhir yang Anda buat atau komit terakhir yang diperiksa ke direktori kerja Anda. Itu juga berarti itu akan menjadi induk dari komit berikutnya yang Anda lakukan. Biasanya paling mudah untuk menganggapnya sebagai HEAD adalah cuplikan dari komit terakhir Anda.
Quazi Irfan
3
Kemungkinan duplikat dari What is HEAD in Git?
Buts

Jawaban:

185

KEPALA adalah referensi untuk komit terakhir di cabang saat ini check-out.


Ada pengecualian kecil untuk ini, yaitu KEPALA lepas. Sebuah KEPALA terpisah adalah situasi Anda berakhir di setiap kali Anda memeriksa komit (atau tag) bukan cabang. Dalam hal ini, Anda harus membayangkan ini sebagai cabang sementara tanpa nama; jadi alih-alih memiliki referensi cabang bernama, kami hanya memiliki KEPALA. Ini masih memungkinkan Anda untuk membuat komitmen (yang akan memperbarui HEAD), jadi definisi singkat di atas masih benar jika Anda menganggap HEAD terpisah sebagai cabang sementara tanpa nama.

menyodok
sumber
1
Jadi mengapa Anda memiliki dua kepala?
e-satis
1
@ e-satis: kadang-kadang Anda akan melihat cabang yang disebut sebagai kepala - disimpan di refs/heads. Namun, huruf kecil berbeda HEAD. Jawaban saya sedikit memperjelas hal ini.
Cascabel
7
@ e-satis: Itu bukan regex. Itu ^hanya notasi git untuk "commit sebelum" - itulah komit sebelum yang sekarang. (Jika saat ini merupakan penggabungan, ia menggunakan induk pertama.)
Cascabel
1
@ e-satis: Lihat bagian revisi yang menentukan dari halaman manual untuk git-rev-list untuk informasi lebih lanjut tentang semua cara untuk menentukan komit - ini hanya satu bagian kecil. kernel.org/pub/software/scm/git/docs/…
Cascabel
1
Tidak, ketika rev dan HEAD menunjuk ke komit yang sama, tidak ada perbedaan. Dan Anda bahkan dapat menulis id komit (nilai SHA-1) alih-alih rev atau KEPALA. Dan jangan khawatir, Anda tidak mengganggu kami dengan pertanyaan :) (setidaknya saya: P)
menyodok
87

HEAD adalah referensi (referensi) ke komit yang sedang diperiksa.

Dalam kondisi normal, sebenarnya itu adalah referensi simbolis ke cabang yang telah Anda periksa - jika Anda melihat isi dari .git / HEAD Anda akan melihat sesuatu seperti "ref: refs / head / master". Cabang itu sendiri adalah referensi ke komit di ujung cabang. Oleh karena itu, dalam keadaan normal, HEADsecara efektif mengacu pada komit di ujung cabang saat ini.

Dimungkinkan juga untuk memiliki "KEPALA terpisah". Ini terjadi ketika Anda memeriksa sesuatu selain cabang (lokal), seperti cabang jarak jauh, komit tertentu, atau tag. Tempat paling umum untuk melihat ini adalah selama rebase interaktif, ketika Anda memilih untuk mengedit komit. Dalam keadaan HEAD terpisah, KEPALA Anda adalah referensi langsung ke sebuah komit - isi .git / HEAD akan menjadi hash SHA1.

Secara umum, KEPALA hanyalah nama yang mudah untuk berarti "apa yang telah Anda periksa" dan Anda tidak perlu terlalu khawatir tentang hal itu. Berhati-hatilah dengan apa yang telah Anda periksa, dan ingat bahwa Anda mungkin tidak ingin melakukan jika Anda tidak berada di cabang (keadaan HEAD terpisah) kecuali Anda tahu apa yang Anda lakukan (misalnya dalam rebase interaktif) .

Cascabel
sumber
6
Ini adalah sesuatu yang saya tidak mengerti. Jika Anda checkout cabang jarak jauh, mengapa Anda berakhir dengan "HEAD terpisah". Mengapa Anda tidak melompat secara otomatis di cabang dalam repo lokal Anda yang sesuai dengan remote Anda?
e-satis
3
@ e-satis: Jika Anda menginginkan cabang lokal, periksa cabang lokal. Ingat bahwa keduanya tidak harus sama - Anda harus memberi tahu yang lokal untuk menggabungkan yang jauh (atau menarik). Pelacakannya hanya supaya ia tahu yang mana yang akan ditarik secara otomatis saat Anda bertanya. Alasannya terlepas adalah bahwa cabang jarak jauh dimaksudkan untuk menjadi penunjuk ke lokasi cabang yang terakhir dilihat dalam repo jarak jauh. Jika Anda mencoba komit untuk itu, repo jarak jauh tidak berubah, jadi cabang jarak jauh juga tidak boleh.
Cascabel
1
OK, itu yang tidak saya dapatkan: memiliki cabang lokal dengan cara tertentu tidak menyiratkan itu sama dengan cabang jarak jauh. Sangat sulit didapat di awal karena saya berasal dari latar belakang SVN :-) Terima kasih kawan. BTW, bagaimana Anda memindahkan KEPALA tanpa kepala ke cabang lokal untuk melakukan itu di sini?
e-satis
3
@ e-satis: Jawaban umumnya adalah git rebase <branch> HEAD. Ini akan menemukan leluhur bersama terakhir dari <branch>dan HEAD, dan kemudian mengambil semua komitmen dari sana untuk HEADdan menerapkannya (rebase) <branch>. Ini pada dasarnya melakukan ini dengan menerapkannya sebagai tambalan, jadi jika dua cabang benar-benar berbeda, mungkin ada konflik. Tetapi jika <branch>merupakan leluhur HEAD(yaitu Anda berada di tempat yang tepat, lupakan saja Anda telah terlepas HEAD) rebase hanyalah penggabungan maju-cepat.
Cascabel
3
Ini adalah salah satu deskripsi git HEAD yang paling jelas dan akurat yang pernah saya lihat, setelah mencari beberapa saat.
LarsH
21

Saya selalu berpikir HEAD~5berarti GO to 5 commit sebelumnya. Tapi itu tidak membawa bagian GO dari perintah. Itu hanya membawa referensi / 'ke mana' bagian dari perintah.

Dalam istilah awam, kata itu digunakan untuk menjawab pertanyaan: DI MANA saya harus pergi? Untuk yang berkomitmen?

  • HEAD berarti (referensi ke) komit saat ini
  • HEAD~1 berarti (referensi ke) 1 komit sebelumnya
  • HEAD~ JUGA berarti (referensi ke) 1 komit sebelumnya
  • HEAD~87 berarti (referensi ke) 87 dilakukan sebelumnya

Pemakaian:

  • git checkout HEAD~1 akan benar-benar GO / checkout ke 1 commit / referensi sebelumnya
  • git reset HEAD~3 akan membatalkan komitmen 3 terakhir - tanpa menghapus perubahan, yaitu Anda dapat melihat semua perubahan yang dilakukan dalam 3 commit terakhir, menghapus apa pun yang tidak Anda sukai atau menambahkannya lalu komit semuanya lagi.
  • git reset --hard HEAD~3akan membatalkan komitmen terakhir Anda dan menghapus perubahannya . Itu benar-benar akan menghapus perubahan itu. Untuk lebih lanjut lihat di sini .
  • git diff HEAD~3 untuk memeriksa perubahan dalam 3 komitmen terakhir
Madu
sumber
3
kembali ke jawaban saya sendiri :)
Sayang
15

Penunjuk HEAD di Git

Git memelihara variabel referensi yang disebut HEAD. Dan kami menyebut variabel ini sebagai pointer, karena tujuannya adalah untuk referensi, atau menunjuk ke, komit tertentu dalam repositori. Saat kita membuat commit baru, pointer akan berubah atau pindah ke arahkan ke komit baru. KEPALA selalu menunjuk ke ujung cabang saat ini di repositori kami. Sekarang, ini ada hubungannya dengan repositori kami, bukan indeks pementasan kami, atau direktori kerja kami.

Cara lain untuk memikirkannya adalah keadaan terakhir dari repositori kami atau apa yang terakhir kali diperiksa, dan karena di situlah repositori ditinggalkan atau status terakhir, Anda juga dapat mengatakan bahwa HEAD menunjuk ke induk dari komit berikutnya atau itu di mana penulisan komit akan dilakukan.

Saya pikir metafora yang baik untuk dipikirkan adalah pemutaran dan pencatatan kepala pada kaset. Saat kami mulai merekam audio, kaset bergerak melewati kepala, dan merekam ke dalamnya. ketika kita menekan Stop tempat di mana record head dihentikan adalah tempat itu akan mulai merekam lagi ketika kita menekan Record kedua kalinya. Sekarang kita bisa bergerak, kita bisa memindahkan head ke tempat yang berbeda, tetapi di mana pun head diposisikan ketika kita menekan Rekam lagi di situlah ia akan mulai merekam.

Pointer HEAD di Git sangat mirip, menunjuk ke tempat di mana kita akan mulai merekam selanjutnya. Ini adalah tempat di mana kami tinggalkan di repositori kami untuk hal-hal yang telah kami lakukan.

Suhail Gupta
sumber
0

Secara sederhana, HEAD adalah referensi ke komit terakhir di cabang yang saat ini sedang check-out.

Pikirkan KEPALA sebagai "cabang saat ini". Ketika Anda mengganti cabang dengan checkout git, revisi HEAD berubah untuk menunjuk ke ujung cabang baru.

Anda dapat melihat apa yang ditunjuk HEAD dengan melakukan:

cat .git/HEAD

Dimungkinkan HEAD untuk merujuk pada revisi spesifik yang tidak terkait dengan nama cabang. Situasi ini disebut HEAD terpisah.

Testilla
sumber