Saya melakukan beberapa pekerjaan di repositori saya dan melihat ada file yang memiliki perubahan lokal. Saya tidak ingin mereka lagi jadi saya menghapus file, berpikir saya bisa checkout salinan baru. Saya ingin melakukan yang setara dengan Git
svn up .
Penggunaan git pull
tampaknya tidak berhasil. Beberapa pencarian acak menuntun saya ke situs tempat seseorang merekomendasikan untuk melakukannya
git checkout HEAD^ src/
( src
adalah direktori yang berisi file yang dihapus).
Sekarang saya tahu saya memiliki kepala yang terpisah. Saya tidak tahu apa itu. Bagaimana saya bisa membatalkan?
git checkout master
akan membuat Anda kembali di cabang utama. Jika Anda ingin menghapus semua perubahan copy pekerjaan, Anda mungkin ingin melakukannyagit reset --hard
.git checkout -- src/
create temp branch - checkout temp branch - checkout master - delete temp branch
working copy changes
? Apakah Anda merujuk pada perubahan yang Anda buat ke file setelah memeriksa komit lain (yaitu, perubahan yang Anda buat saat dalam kondisi head terpisah)?Jawaban:
Kepala yang terlepas berarti Anda tidak lagi berada di cabang, Anda telah memeriksa satu komit dalam sejarah (dalam hal ini komit sebelum HEAD, yaitu HEAD ^).
Jika Anda ingin menghapus perubahan yang terkait dengan HEAD yang terlepas
Anda hanya perlu checkout cabang tempat Anda berada, mis
Lain kali Anda telah mengubah file dan ingin mengembalikannya ke status di indeks, jangan hapus file terlebih dahulu, lakukan saja
Ini akan mengembalikan file foo ke status dalam indeks.
Jika Anda ingin menyimpan perubahan yang terkait dengan HEAD yang terlepas
git branch tmp
- ini akan menyimpan perubahan Anda di cabang baru yang disebuttmp
.git checkout master
master
, jalankangit merge tmp
darimaster
cabang. Anda harus berada dimaster
cabang setelah berlarigit checkout master
.sumber
Previous HEAD position was 7426948...
Jika Anda telah mengubah file yang tidak ingin hilang, Anda bisa mendorongnya. Saya telah mengkomitnya dalam mode terpisah dan setelah itu Anda dapat pindah ke cabang sementara untuk diintegrasikan kemudian di master.
Diekstrak dari:
Apa yang harus dilakukan dengan komit dibuat di kepala yang terpisah
sumber
git stash
? Karena itu adalah hal pertama yang muncul di pikiran saya. membuat cabang baru akan menjadi kerja keras.git rebase my-temporary-work
dan kemudian menghapus cabanggit branch -d my-temporary-work
sehingga tampak seolah-olah Anda berkomitmen untuk cabang yang tepat di tempat pertama.git stash
kedengarannya seperti alat yang sempurna untuk kasus ini. Bisakah Anda menulis jawaban dengan langkah-langkah yang disarankan untuk mencapai itu?Solusi tanpa membuat cabang sementara.
Cara keluar ("fix") terlepas dari status HEAD ketika Anda telah mengubah sesuatu dalam mode ini dan, secara opsional, ingin menyimpan perubahan Anda:
Komit perubahan yang ingin Anda pertahankan. Jika Anda ingin mengambil alih salah satu perubahan yang Anda buat dalam status HEAD yang terlepas, lakukan itu. Suka:
Buang perubahan yang tidak ingin Anda simpan. Hard reset akan membuang semua perubahan yang tidak dikomit yang Anda buat dalam status HEAD terpisah:
(Tanpa ini, langkah 3 akan gagal, mengeluh tentang modifikasi file yang tidak dikomit di HEAD terpisah.)
Lihatlah cabang Anda. Keluar dari status HEAD yang terlepas dengan memeriksa cabang tempat Anda bekerja sebelumnya, misalnya:
Ambil alih komitmen Anda. Anda sekarang dapat mengambil alih komit yang Anda buat dalam keadaan HEAD terpisah dengan memetik ceri, seperti yang ditunjukkan dalam jawaban saya untuk pertanyaan lain .
sumber
git reset --hard
adalah persis itu yang saya butuhkan, karena saya ingin hulu menjadi sumber dan perubahan lokal harus dihapus.Kepala terpisah berarti:
Jika Anda tidak memiliki perubahan: Anda dapat beralih ke master dengan menerapkan perintah berikut
Jika Anda memiliki perubahan yang ingin Anda pertahankan:
Jika HEAD terlepas, komit berfungsi seperti biasa, kecuali tidak ada cabang bernama yang diperbarui. Untuk mendapatkan cabang master diperbarui dengan perubahan yang dilakukan, buat cabang sementara di tempat Anda berada (dengan cara ini cabang sementara akan memiliki semua perubahan yang dilakukan pada HEAD yang dilepaskan), kemudian beralih ke cabang master dan gabungkan cabang sementara dengan tuan.
sumber
Inilah yang baru saja saya lakukan setelah saya menyadari bahwa saya berada di kepala yang terpisah dan telah membuat beberapa perubahan.
Saya melakukan perubahan.
Saya ingat hash (1fe56ad) dari commit. Kemudian saya memeriksa cabang yang seharusnya.
Akhirnya saya menerapkan perubahan komit ke cabang.
Saya pikir ini sedikit lebih mudah daripada membuat cabang sementara.
sumber
git cherry-pick <hash>
.Jika Anda melakukan beberapa perubahan dan kemudian menyadari bahwa Anda berada di kepala yang terpisah, ada solusi sederhana untuk itu: simpanan -> checkout master -> simpanan pop:
Anda akan memiliki perubahan tanpa komitmen dan KEPALA "terlampir" yang normal, seperti tidak ada yang terjadi.
sumber
Ketika Anda memeriksa komit tertentu
git
, Anda berakhir dalam keadaan kepala terpisah ... yaitu, copy pekerjaan Anda tidak lagi mencerminkan keadaan referensi yang dinamai (seperti "master"). Ini berguna untuk memeriksa status repositori masa lalu, tetapi bukan yang Anda inginkan jika Anda benar-benar mencoba mengembalikan perubahan.Jika Anda telah membuat perubahan pada file tertentu dan Anda hanya ingin membuangnya, Anda dapat menggunakan
checkout
perintah seperti ini:Ini akan membuang perubahan yang tidak dikomit dan mengembalikan file ke status apa pun yang ada di kepala cabang Anda saat ini. Jika Anda ingin membuang perubahan yang sudah Anda lakukan, Anda mungkin ingin menggunakan
reset
perintah. Sebagai contoh, ini akan mengatur ulang repositori ke keadaan dari komit sebelumnya, membuang semua perubahan selanjutnya:Namun, jika Anda berbagi repositori dengan orang lain, a
git reset
dapat mengganggu (karena menghapus sebagian dari sejarah repositori). Jika Anda sudah berbagi perubahan dengan orang lain, Anda biasanya ingin melihatnyagit revert
sebagai gantinya, yang menghasilkan "antikomit" - artinya, membuat komit baru yang "membatalkan" perubahan yang dimaksud.Buku Git memiliki detail lebih lanjut.
sumber
git checkout path/to/foo
bisa bertentangan dengangit checkout some-branch
, jadi akan lebih baik digunakangit checkout -- path/to/foo
untuk menghindari konflik ini.KEPALA ada di pointer, dan sebagai hasilnya itu menunjuk - langsung atau tidak langsung - ke komit tertentu:
HEAD Terlampir berarti terpasang ke beberapa cabang (yaitu menunjuk ke cabang). HEAD
terlepas berarti bahwa ia tidak dilampirkan ke cabang mana pun, yaitu menunjuk langsung ke beberapa komit.
Dengan kata lain:
Untuk lebih memahami situasi dengan HEAD yang terpasang / terlepas, mari tunjukkan langkah-langkah yang mengarah ke quadruplet gambar di atas.
Kita mulai dengan keadaan repositori yang sama (gambar di semua kuadran adalah sama):
Sekarang kami ingin melakukan
git checkout
- dengan target berbeda di masing-masing gambar (perintah di atasnya redup untuk menekankan bahwa kami hanya akan menerapkan perintah itu):Ini adalah situasi setelah melakukan perintah-perintah itu:
Seperti yang Anda lihat, poin KEPALA ke sasaran dari
git checkout
perintah - ke cabang (pertama 3 gambar dari quadruplet), atau (langsung) ke komit (gambar terakhir dari quadruplet yang).Isi direktori kerja juga diubah, agar sesuai dengan komit yang sesuai (snapshot), yaitu dengan komit menunjuk (langsung atau tidak langsung) oleh HEAD.
Jadi kita sekarang berada dalam situasi yang sama seperti pada awal jawaban ini:
sumber
Karena "kondisi kepala terpisah" membuat Anda menggunakan temp temp, gunakan saja
git checkout -
yang menempatkan Anda pada cabang terakhir yang Anda gunakan .sumber
git reflog
dan dapat diambil alih ke cabang baru atau melaluigit cherry-pick
cabang yang sudah ada. Lihat pertanyaan ini .Untuk lebih memperjelas jawaban @Philippe Gerber, ini dia:
Sebelumnya
cherry-pick
, agit checkout master
diperlukan dalam kasus ini. Selain itu, hanya dibutuhkan dengancommit
indetached head
.sumber
Tambahan
Jika cabang yang ingin Anda kembalikan adalah checkout terakhir yang Anda buat, Anda bisa menggunakannya
checkout @{-1}
. Ini akan membawa Anda kembali ke checkout sebelumnya.Lebih lanjut, Anda bisa menggunakan perintah ini dengan, misalnya,
git global --config alias.prev
sehingga Anda hanya perlu mengetikgit prev
untuk beralih kembali ke checkout sebelumnya.sumber
Berada di "kepala terpisah" berarti bahwa KEPALA mengacu pada komit tertentu yang tidak disebutkan namanya (sebagai lawan dari cabang bernama) (lih: https://git-scm.com/docs/git-checkout bagian Kepala terpisah ) Kepala terpisah
Untuk memperbaiki masalah, Anda hanya perlu memilih cabang yang dipilih sebelumnya oleh
git checkout @{-1}
sumber
Ketika Anda berada dalam situasi kepala terpisah dan membuat file baru, pertama pastikan bahwa file-file baru ini ditambahkan ke indeks, misalnya dengan:
Tetapi jika Anda hanya mengubah atau menghapus file yang ada, Anda dapat menambahkan (-a) dan melakukan dengan pesan (-m) secara bersamaan melalui:
Kemudian Anda cukup membuat cabang baru dengan status Anda saat ini dengan:
Anda akan memiliki cabang baru dan semua penyesuaian Anda akan ada di cabang baru itu. Anda kemudian dapat terus mendorong ke remote dan / atau checkout / pull / merge sesuka hati.
sumber
Git mengatakan kepada saya bagaimana melakukannya.
jika Anda mengetik:
Simpan status
Kemudian:
sumber
Saya ingin menjaga perubahan saya jadi, saya hanya memperbaiki ini melakukan ...
itu bekerja untuk saya
sumber
Biasanya
HEAD
menunjuk ke cabang. Ketika itu tidak menunjuk ke cabang sebaliknya ketika menunjuk ke hash komit seperti69e51
itu berarti Anda memiliki KEPALA terpisah. Anda harus menunjuk dua cabang untuk memperbaiki masalah. Anda dapat melakukan dua hal untuk memperbaikinya.hash
sumber
Kepala terpisah berarti Anda belum memeriksa cabang Anda dengan benar atau Anda baru saja memeriksa satu komit.
Jika Anda mengalami masalah seperti itu, pertama-tama simpanan perubahan lokal Anda sehingga Anda tidak akan kehilangan perubahan Anda.
Setelah itu ... checkout cabang yang Anda inginkan menggunakan perintah:
Katakanlah Anda ingin cabang MyOriginalBranch:
git checkout -b asal beberapaNama / MyOriginalBranch
sumber
Anda mungkin melakukannya
git reset --hard origin/your-branch
.Coba saja
git checkout your-branch
sumber
bekerja untukku. Itu hanya tentang memberi nama jarak jauh dan cabang secara eksplisit.
sumber
Dalam kasus saya, saya lari
git status
dan saya melihat bahwa saya memiliki beberapa file yang tidak terlacak pada direktori kerja saya.Saya hanya perlu membersihkannya (karena saya tidak membutuhkannya) untuk menjalankan rebase yang ingin saya lakukan.
sumber
Ini berfungsi untuk saya, Ini akan menugaskan cabang baru untuk kepala terpisah:
git checkout new_branch_name detached_head_garbage_name
sumber
KEPALA yang terlepas berarti bahwa Anda saat ini tidak berada di cabang mana pun. Jika Anda ingin MENJAGA perubahan Anda saat ini dan cukup membuat cabang baru, inilah yang Anda lakukan:
Setelah itu, Anda berpotensi ingin menggabungkan cabang baru ini dengan cabang lain. Selalu membantu adalah perintah git "seekor anjing" :
sumber