Pertanyaan Perbaiki kepala terpisah Git?


Saya melakukan beberapa pekerjaan di repositori saya dan melihat sebuah file memiliki perubahan lokal. Saya tidak menginginkannya lagi jadi saya menghapus file tersebut, berpikir saya hanya dapat memeriksa salinan baru. Saya ingin melakukan hal yang sama

svn up .

Menggunakan git pull tampaknya tidak berhasil. Beberapa pencarian acak membawa saya ke situs di mana seseorang menyarankan 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 membatalkannya?


982
2018-04-19 13:07


asal


Jawaban:


Kepala yang terlepas berarti Anda tidak lagi berada di cabang, Anda telah memeriksa satu commit dalam sejarah (dalam hal ini commit sebelumnya ke HEAD, yaitu HEAD ^).

Jika Anda menghendaki menghapus perubahan Anda terkait dengan HEAD yang terpisah

Anda hanya perlu checkout di cabang tempat Anda berada, mis.

git checkout master

Lain kali Anda telah mengubah file dan ingin mengembalikannya ke keadaan di indeks, jangan hapus file terlebih dahulu, cukup lakukan

git checkout -- path/to/foo

Ini akan mengembalikan file foo ke keadaan di indeks.

Jika Anda menghendaki menjaga perubahan Anda terkait dengan HEAD yang terpisah

  1. Menjalankan git log -n 1; ini akan menampilkan commit terbaru pada HEAD terpisah. Salin dan tempel hash commit.
  2. Menjalankan git checkout master
  3. Menjalankan git branch tmp <commit-hash>. Ini akan menyimpan perubahan Anda di cabang baru yang disebut tmp.
  4. Jika Anda ingin memasukkan perubahan yang Anda buat master, lari git merge tmp dari master cabang. Anda harus berada di master bercabang setelah berlari git checkout master.

1406
2018-04-19 13:32



Jika Anda telah mengubah file yang tidak ingin hilang, Anda dapat mendorongnya. Saya telah melakukan mereka dalam mode terpisah dan setelah itu Anda dapat pindah ke cabang sementara untuk mengintegrasikan kemudian di master.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

Diekstrak dari:

Apa yang harus dilakukan dengan komitmen yang dibuat di kepala terpisah


368
2017-12-09 20:05



Cara keluar ("perbaiki") memisahkan status KEPALA ketika Anda sudah mengubah sesuatu dalam mode ini dan, secara opsional, ingin menyimpan perubahan Anda.

Solusi ini berfungsi tanpa membuat cabang sementara.

  1. Komit perubahan yang ingin Anda simpan. Jika Anda ingin mengambil alih perubahan apa pun yang Anda buat dalam status HEAD terlepas, lakukanlah. Seperti:

    git commit -a -m "your commit message"
    
  2. Buang perubahan yang tidak ingin Anda simpan. Setel ulang paksa akan membuang semua perubahan tidak terikat yang Anda buat pada status HEAD yang terpisah:

    git reset --hard
    

    (Tanpa ini, langkah 3 akan gagal, mengeluh tentang file tidak terikat yang dimodifikasi di HEAD yang terpisah.)

  3. Periksa cabang Anda. Keluar dari status HEAD terlepas dengan memeriksa cabang yang Anda kerjakan sebelumnya, misalnya:

    git checkout master
    
  4. Ambil alih komitmen Anda. Sekarang Anda dapat mengambil alih komit yang Anda buat di negara KEPALA terlepas dengan memilih ceri, seperti yang ditunjukkan di jawaban saya untuk pertanyaan lain.

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

105
2018-06-11 13:23



Kepala yang terlepas berarti:  (1) Anda tidak lagi berada di cabang,  (2) Anda telah memeriksa satu komit dalam sejarah

jika Anda tidak memiliki perubahan: Anda dapat beralih ke master dengan menerapkan perintah berikut

  git checkout master

jika Anda memiliki perubahan yang ingin Anda simpan: 

Dalam kasus KEPALA yang terpisah, melakukan pekerjaan seperti biasa, kecuali tidak ada cabang bernama yang diperbarui. Agar cabang master diperbarui dengan perubahan berkomitmen Anda, buat cabang sementara di mana Anda berada (dengan cara ini cabang sementara akan memiliki semua perubahan berkomitmen yang telah Anda buat di HEAD terpisah), kemudian beralih ke cabang master dan menggabungkan cabang sementara dengan master.

git branch  temp
git checkout master
git merge temp

87
2017-08-29 00:39



Inilah yang baru saja saya lakukan setelah saya menyadari bahwa saya berada dalam posisi terpisah dan telah membuat beberapa perubahan.

Saya melakukan perubahan.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

Saya ingat hash (1fe56ad) dari komit. Lalu saya memeriksa cabang yang seharusnya saya kunjungi.

$ git checkout master
Switched to branch 'master'

Akhirnya saya menerapkan perubahan komit ke cabang.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

Saya pikir ini sedikit lebih mudah daripada membuat cabang sementara.


49
2017-08-02 23:33



Saat Anda memeriksa commit tertentu git, Anda berakhir di a kepala terpisah negara ... yaitu, copy pekerjaan Anda tidak lagi mencerminkan keadaan referensi bernama (seperti "master"). Ini berguna untuk memeriksa status repositori sebelumnya, tetapi tidak seperti 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:

git checkout myfile

Ini akan membuang semua perubahan tidak terikat 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 mereset repositori ke status commit sebelumnya, membuang setiap perubahan selanjutnya:

git reset --hard HEAD^

Namun, jika Anda berbagi repositori dengan orang lain, a git reset dapat mengganggu (karena menghapus sebagian dari sejarah repositori). Jika Anda telah berbagi perubahan dengan orang lain, biasanya Anda ingin melihatnya git revert sebaliknya, yang menghasilkan "anticommit" - yaitu, ia menciptakan komitmen baru yang "membatalkan" perubahan yang dimaksud.

The Git Book memiliki lebih banyak detail.


39
2018-04-19 13:32



Jika Anda membuat beberapa perubahan dan kemudian menyadari bahwa Anda berada di kepala terpisah, ada solusi sederhana untuk itu: simpanan -> checkout master -> simpanan pop:

git stash
git checkout master   # Fix the detached head state
git stash pop         # ... or for extra safety use 'stash apply' then later 
                      # after fixing everything do 'stash drop'

Anda akan memiliki perubahan yang tidak disengaja dan KEPALA "terlampir" yang normal, seperti tidak ada yang terjadi.


37
2018-01-01 22:40