Memeriksa tag Git mengarah ke "kondisi HEAD terlepas"

166

Saya sedang mengembangkan skrip penerapan untuk proyek git saya dan saya baru mulai menggunakan tag. Saya telah menambahkan tag baru bernama v2.0:

git tag -a v2.0 -m "Launching version 2.0"

Dan saya telah mendorong tag ini ke repositori jarak jauh

git push --tags

Ketika saya mencoba untuk mengeksekusi skrip penempatan dan memeriksa v2.0tag saya mendapatkan pesan ini:

Anda berada dalam kondisi 'HEAD terlepas'. Anda dapat melihat-lihat, membuat perubahan eksperimental, dan mengkomitnya, dan Anda dapat membuang semua komitmen yang Anda buat dalam kondisi ini tanpa memengaruhi cabang apa pun dengan melakukan checkout lain. Jika Anda ingin membuat cabang baru untuk mempertahankan komit yang Anda buat, Anda dapat melakukannya (sekarang atau nanti) dengan menggunakan -b dengan perintah checkout lagi. Contoh: git checkout -b new_branch_name HEAD sekarang di

Apakah itu normal? Repositori dalam limbo karena jika saya lakukan:

git branch

Saya mendapatkan hasil ini:

* (no branch)
  master

Maaf jika ini jelas tapi saya tidak bisa mengetahuinya.

Khriz
sumber
Ketika Anda mengatakan, "jalankan skrip penerapan dan periksa v2.0" apakah kode Anda terlihat seperti, "git checkout v2.0"? Saya mencoba mengubah naskah rilis saya dan ketika saya menjalankan "git checkout v2.0" dari mesin produksi saya, "error: pathspec 'v2.0' tidak cocok dengan file apa pun yang dikenal git." Meskipun saya sudah menjalankan, "git push origin --tags" pada mesin lokal saya sebelum melakukan "git checkout v2.0" pada produksi. Saya juga sudah mencoba menjalankan, "git pull --tags" dan "git fetch --tags" pada produksi sebelum memanggil "git checkout v2.0" dan itu tidak berhasil ... Saya masih mendapatkan kesalahan. Ada Ide?
John Erck
3
Saya hendak menghapus komentar di atas, tetapi kemudian berpikir untuk mempertahankannya mungkin dapat membantu orang lain. Saya mendapatkan kesalahan karena saya memiliki TYPO di nama tag saya ketika saya menjalankan, "git checkout v2.0". Namun, kesalahan ketik terkait adalah kesalahan yang sama persis yang akan Anda dapatkan jika Anda menjalankan, "git checkout v2.0" TANPA salah ketik SEBELUM berjalan, "git fetch --tags". Jadi, akhirnya, masalah saya diselesaikan dengan menjalankan, "git fetch --tags" PRIOR to running, "git checkout v2.0" tanpa kesalahan ketik. Fiuh!
John Erck
Bagus, ya, Anda perlu melakukan ambil --tags sebelumnya (atau git fetch yang akan menarik semua dari jarak jauh) sehingga git dapat checkout tag. Maaf saya baru saja melihat komentar Anda hari ini.
Khriz

Jawaban:

429

Oke, pertama-tama beberapa istilah sedikit terlalu disederhanakan.

Dalam git, tag(seperti banyak hal lainnya) adalah apa yang disebut treeish . Ini adalah cara merujuk titik dalam sejarah proyek. Treeishes dapat berupa tag, komit, penentu tanggal, penentu ordinal, atau banyak hal lainnya.

Sekarang branchseperti tag tetapi bergerak. Ketika Anda "di" cabang dan membuat komit, cabang dipindahkan ke komit baru yang Anda buat menunjukkan posisi itu saat ini.

Anda HEADadalah penunjuk ke cabang yang dianggap "saat ini". Biasanya ketika Anda mengkloning repositori, HEADakan menunjuk ke mastermana pada gilirannya akan menunjuk ke sebuah komit. Ketika Anda kemudian melakukan sesuatu seperti git checkout experimental, Anda beralih HEADke menunjuk ke experimentalcabang yang mungkin menunjuk ke komit yang berbeda.

Sekarang penjelasannya.

Ketika Anda melakukan git checkout v2.0, Anda beralih ke komit yang tidak ditunjukkan oleh a branch. The HEADsekarang "terpisah" dan tidak menunjuk ke cabang. Jika Anda memutuskan untuk membuat komit sekarang (seperti yang Anda bisa), tidak ada pointer cabang untuk memperbarui untuk melacak komit ini. Beralih kembali ke komit lain akan membuat Anda kehilangan komit baru yang Anda buat ini. Itulah yang disampaikan pesan itu kepada Anda.

Biasanya, yang bisa Anda lakukan adalah mengatakan git checkout -b v2.0-fixes v2.0. Ini akan membuat pointer cabang baru di komit yang ditunjuk oleh treeish v2.0(sebuah tag dalam kasus ini) dan kemudian menggeser Anda HEADke titik itu. Sekarang, jika Anda membuat komitmen, Anda dapat melacaknya (menggunakan v2.0-fixescabang) dan Anda dapat bekerja seperti biasanya. Tidak ada yang "salah" dengan apa yang telah Anda lakukan terutama jika Anda hanya ingin melihat v2.0kodenya. Namun, jika Anda ingin membuat perubahan di sana yang ingin Anda lacak, Anda memerlukan cabang.

Anda harus meluangkan waktu untuk memahami seluruh model DAG dari git. Ini sangat sederhana dan membuat semua perintah cukup jelas.

Noufal Ibrahim
sumber
Ok terima kasih, saya tidak perlu melakukan perubahan pada kode jadi saya pikir tidak apa-apa. Saya tidak perlu membuat cabang. Terima kasih banyak!
Khriz
1
Saya bingung saat pertama kali melihat jawaban ini, tetapi setelah saya membaca dokumentasi percabangan Git: http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is jauh lebih jelas. .
Tandai stiles
3
Jawaban yang luar biasa, tetapi boleh saya tambahkan mengenai: "Beralih ke komit lain akan membuat Anda kehilangan komit baru yang Anda buat." - Anda masih dapat menemukan komit di git reflog, yang merupakan perintah yang bagus untuk diketahui! Kecuali pengumpulan sampah telah terjadi, tampaknya "mustahil" kehilangan komit.
Dmitry Minkovsky
Komitmen yang tidak direferensikan dapat hilang oleh operasi pengumpulan sampah.
Noufal Ibrahim
1
Url salah karena mereka mengubah tata letak halaman.
jcubic
12

Ya itu normal. Ini karena Anda checkout komit tunggal, yang tidak memiliki kepala. Terutama itu (cepat atau lambat) bukan kepala cabang apa pun.

Tetapi biasanya tidak ada masalah dengan kondisi itu. Anda dapat membuat cabang baru dari tag, jika ini membuat Anda merasa lebih aman :)

KingCrunch
sumber
1
Ok, saya akan tetap seperti itu ... keamanannya sudah dilebih-lebihkan;)
Khriz
Seperti yang Anda komentari dalam jawaban Noufals (ini yang lebih baik, saya harus katakan;)): Selama Anda tidak mengubah apa pun, tidak ada yang perlu Anda khawatirkan. Namun, jika Anda berasumsi , bahwa Anda dapat mengubah sesuatu, Anda cukup membuat cabang, karena mereka murah di git dan Anda dapat menghapusnya (dan membuat ulang nanti dan seterusnya).
KingCrunch