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.0
tag 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.
sumber
Jawaban:
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
branch
seperti tag tetapi bergerak. Ketika Anda "di" cabang dan membuat komit, cabang dipindahkan ke komit baru yang Anda buat menunjukkan posisi itu saat ini.Anda
HEAD
adalah penunjuk ke cabang yang dianggap "saat ini". Biasanya ketika Anda mengkloning repositori,HEAD
akan menunjuk kemaster
mana pada gilirannya akan menunjuk ke sebuah komit. Ketika Anda kemudian melakukan sesuatu sepertigit checkout experimental
, Anda beralihHEAD
ke menunjuk keexperimental
cabang yang mungkin menunjuk ke komit yang berbeda.Sekarang penjelasannya.
Ketika Anda melakukan
git checkout v2.0
, Anda beralih ke komit yang tidak ditunjukkan oleh abranch
. TheHEAD
sekarang "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 treeishv2.0
(sebuah tag dalam kasus ini) dan kemudian menggeser AndaHEAD
ke titik itu. Sekarang, jika Anda membuat komitmen, Anda dapat melacaknya (menggunakanv2.0-fixes
cabang) dan Anda dapat bekerja seperti biasanya. Tidak ada yang "salah" dengan apa yang telah Anda lakukan terutama jika Anda hanya ingin melihatv2.0
kodenya. 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.
sumber
git reflog
, yang merupakan perintah yang bagus untuk diketahui! Kecuali pengumpulan sampah telah terjadi, tampaknya "mustahil" kehilangan komit.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 :)
sumber