Bagaimana saya bisa mendamaikan KEPALA lepas dengan master / asal?

1558

Saya baru di kompleksitas bercabang Git. Saya selalu bekerja pada satu cabang dan melakukan perubahan dan kemudian secara berkala mendorong ke asal saya yang jauh.

Di suatu tempat baru-baru ini, saya melakukan reset beberapa file untuk membuatnya keluar dari pementasan komit, dan kemudian melakukan rebase -iuntuk menghilangkan beberapa komit lokal baru-baru ini. Sekarang saya dalam keadaan saya tidak begitu mengerti.

Di wilayah kerja saya, git logtunjukkan persis apa yang saya harapkan - saya berada di kereta yang tepat dengan komitmen yang tidak ingin saya lewati, dan yang baru di sana, dll.

Tapi saya hanya mendorong ke repositori jarak jauh, dan apa yang berbeda - beberapa komitmen yang saya bunuh dalam rebase didorong, dan yang baru dilakukan secara lokal tidak ada.

Saya pikir "master / origin" terlepas dari HEAD, tapi saya tidak 100% jelas tentang apa artinya, bagaimana memvisualisasikannya dengan alat-alat baris perintah, dan bagaimana cara memperbaikinya.

Ben Zotto
sumber
Sudahkah Anda mendorong komit sebelum rebase?
manojlds
@ manojlds: Tidak yakin apa yang Anda maksud. Saya mendorong beberapa waktu sebelum rebase, tetapi tidak segera sebelum.
Ben Zotto
Seperti dalam apakah Anda sebelumnya mendorong komit yang Anda hapus dalam rebase -i .. Dari jawaban Anda, saya kira tidak.
manojlds
@ manojlds: Benar. Saya hanya membunuh komit yang lebih baru daripada dorongan terbaru. (Meskipun seperti yang saya sebutkan, sejak itu saya mendorong, karena saya pikir semuanya baik-baik saja)
Ben Zotto
Bisakah Anda menjelaskan apa yang Anda lakukan I did a reset of some files to get them out of commit stagingsebagian? maaf untuk pertanyaannya :)
manojlds

Jawaban:

2521

Pertama, mari kita perjelas apa itu HEAD dan apa artinya ketika itu dilepaskan.

HEAD adalah nama simbolis untuk komit yang sedang diperiksa. Ketika KEPALA tidak terlepas (situasi "normal" 1 : Anda memiliki cabang diperiksa), KEPALA sebenarnya menunjuk ke "ref" cabang dan cabang menunjuk ke komit. Dengan demikian, KEPALA “dilampirkan” ke cabang. Saat Anda membuat komit baru, cabang yang ditunjuk HEAD diperbarui untuk menunjukkan komit baru. KEPALA mengikuti secara otomatis karena hanya menunjuk ke cabang.

  • git symbolic-ref HEADhasil refs/heads/master
    Cabang bernama "master" diperiksa.
  • git rev-parse refs/heads/masteryield 17a02998078923f2d62811326d130de991d1a95a
    Komit adalah ujung atau "kepala" saat ini dari cabang master.
  • git rev-parse HEADjuga menghasilkan 17a02998078923f2d62811326d130de991d1a95a
    Ini adalah apa artinya menjadi "ref simbolik". Itu menunjuk ke suatu objek melalui beberapa referensi lain.
    (Rujukan simbol pada awalnya diimplementasikan sebagai tautan simbolik, tetapi kemudian diubah menjadi file biasa dengan interpretasi ekstra sehingga dapat digunakan pada platform yang tidak memiliki symlink.)

Kami memiliki HEADrefs/heads/master17a02998078923f2d62811326d130de991d1a95a

Ketika HEAD dilepaskan, itu menunjuk langsung ke sebuah komit — bukannya secara tidak langsung menunjuk satu melalui cabang. Anda dapat menganggap KEPALA lepas sebagai cabang yang tidak disebutkan namanya.

  • git symbolic-ref HEAD gagal dengan fatal: ref HEAD is not a symbolic ref
  • git rev-parse HEADimbal hasil 17a02998078923f2d62811326d130de991d1a95a
    Karena ini bukan referensi simbolis, ia harus menunjuk langsung ke komit itu sendiri.

Kami punya HEAD17a02998078923f2d62811326d130de991d1a95a

Yang penting untuk diingat dengan HEAD terpisah adalah bahwa jika komit itu menunjuk sebaliknya direferensikan (tidak ada referensi lain yang bisa mencapainya), maka itu akan menjadi "menggantung" ketika Anda checkout beberapa komit lainnya. Akhirnya, komitmen yang menggantung seperti itu akan dipangkas melalui proses pengumpulan sampah (secara default, mereka disimpan setidaknya selama 2 minggu dan dapat disimpan lebih lama dengan direferensikan oleh reflog HEAD).

1 Tidak apa-apa untuk melakukan pekerjaan "normal" dengan KEPALA terpisah, Anda hanya perlu melacak apa yang Anda lakukan untuk menghindari memancing sejarah yang hilang dari reflog.


Langkah menengah rebase interaktif dilakukan dengan KEPALA terpisah (sebagian untuk menghindari mencemari reflog cabang aktif). Jika Anda menyelesaikan operasi rebase penuh, itu akan memperbarui cabang asli Anda dengan hasil kumulatif operasi rebase dan pasang kembali HEAD ke cabang asli. Dugaan saya adalah bahwa Anda tidak pernah sepenuhnya menyelesaikan proses rebase; ini akan membuat Anda dengan KEPALA lepas yang menunjuk ke komit yang baru saja diproses oleh operasi rebase.

Untuk pulih dari situasi Anda, Anda harus membuat cabang yang menunjuk ke komit yang saat ini ditunjuk oleh KEPALA Anda yang terlepas:

git branch temp
git checkout temp

(dua perintah ini dapat disingkat git checkout -b temp)

Ini akan memasang kembali KEPALA Anda ke tempcabang baru .

Selanjutnya, Anda harus membandingkan komit saat ini (dan riwayatnya) dengan cabang normal tempat Anda diharapkan bekerja:

git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp

(Anda mungkin ingin bereksperimen dengan opsi log: tambahkan -p, tinggalkan --pretty=…untuk melihat seluruh pesan log, dll.)

Jika tempcabang baru Anda terlihat bagus, Anda mungkin ingin memperbarui (misalnya) masteruntuk mengarahkannya:

git branch -f master temp
git checkout master

(dua perintah ini dapat disingkat git checkout -B master temp)

Anda kemudian dapat menghapus cabang sementara:

git branch -d temp

Akhirnya, Anda mungkin ingin mendorong sejarah yang dibangun kembali:

git push origin master

Anda mungkin perlu menambahkan --forceke akhir perintah ini untuk mendorong jika cabang jauh tidak dapat "fast-forwarded" ke komit baru (yaitu Anda menjatuhkan, atau menulis ulang beberapa komit yang ada, atau menulis ulang sedikit sejarah).

Jika Anda berada di tengah-tengah operasi rebase, Anda mungkin harus membersihkannya. Anda dapat memeriksa apakah rebase sedang dalam proses dengan mencari direktori .git/rebase-merge/. Anda dapat secara manual membersihkan rebase yang sedang berlangsung dengan hanya menghapus direktori itu (mis. Jika Anda tidak lagi mengingat tujuan dan konteks operasi rebase aktif). Biasanya Anda akan menggunakan git rebase --abort, tetapi itu melakukan beberapa pengaturan ulang ekstra yang mungkin ingin Anda hindari (memindahkan HEAD kembali ke cabang asli dan mengatur ulang kembali ke komit asli, yang akan membatalkan beberapa pekerjaan yang kami lakukan di atas).

Chris Johnsen
sumber
6
Menarik dari man git-symbolic-ref: "Di masa lalu, .git/HEADada tautan simbolik yang menunjuk refs/heads/master. Ketika kami ingin beralih ke cabang lain, kami melakukannya ln -sf refs/heads/newbranch .git/HEAD, dan ketika kami ingin mencari tahu di cabang mana kami berada, kami melakukannya readlink .git/HEAD. Tetapi tautan simbolik tidak sepenuhnya portabel. , jadi mereka sekarang sudah usang dan referensi simbolis (seperti dijelaskan di atas) digunakan secara default. "
Dmitry Minkovsky
10
Saya setuju dengan @AntonioSesto: untuk sebagian besar proyek (bahkan yang cukup besar) Anda tidak perlu kompleksitas yang membingungkan yaitu Git. Otak saya memberontak saat bergulat dengan sesuatu yang jelas-jelas direkayasa berlebihan. Saya tidak membutuhkannya, dan saya tidak menginginkannya.
Jasper Sprengers
36
Ini adalah jawaban yang baik, tetapi saya pikir tidak perlu untuk temp cabang (walaupun saya biasanya menggunakan diri saya sendiri). git branch -f master HEAD && git checkout mastersudah cukup - dengan asumsi tujuan Anda adalah mempertahankan kepala Anda saat ini tetapi untuk menetapkannya sebagai master. Tujuan lain juga masuk akal, dan meminta resep lain.
Adrian Ratnapala 6-15
38
Lol di komentar gurning tentang panjangnya. Sedangkan kita semua hanya memindai sampai kita mencapai garis yang mengatakan "Untuk pulih dari situasi Anda [...]", dan pergi dari sana - sambil membuat catatan mental bahwa ada cerita latar yang berguna yang dapat kita baca. pada hari hujan. The pilihan untuk membaca lebih lanjut tidak menyakiti Anda, tetapi tidak berdiri untuk manfaat orang lain.
underscore_d
5
Inilah sebabnya saya benci git.
Monica Heddneck
627

Lakukan ini:

git checkout master

Atau, jika Anda memiliki perubahan yang ingin Anda pertahankan, lakukan ini:

git checkout -b temp
git checkout -B master temp
Daniel Alexiuc
sumber
57
Ini adalah respons yang berbahaya. Orang yang tiba di jawaban ini memiliki status berbeda dan "lakukan saja untuk memperbaikinya" tanggapan tidak menjawab pertanyaan. Yang ini dapat dengan mudah menghancurkan pekerjaan.
Archonic
15
! "git checkout master" akan menyebabkan semua perubahan hilang jika kepala yang terlepas bukan bagian dari master !!
Tony
3
@ Belauhirn Anda mungkin sudah memeriksa komitnya, bukan cabangnya. Cabang masih menunjuk ke komit yang sama, tetapi Anda berada di 'mode' yang berbeda.
Daniel Alexiuc
1
git resetharus datang dengan peringatan "Jika Anda tidak tahu apa yang Anda lakukan, hentikan itu". Baru saja pulih dari satu jam ketakutan berpikir aku kehilangan minggu terakhir pekerjaan. Terima kasih!
Opus1217
1
Setuju dengan @Archonic Penting untuk memahami bagaimana git bekerja sebelum Anda menjalankan perintah apa pun secara membuta. Anda dapat menghemat waktu dengan tidak membaca jawaban besar, tetapi dapat kehilangan lebih banyak waktu jika pekerjaan Anda hilang.
Yusufali2205
132

Saya mengalami masalah ini dan ketika saya membaca di bagian atas pilih jawaban:

HEAD adalah nama simbolis untuk komit yang sedang diperiksa.

Saya berpikir: Ah-ha! Jika HEADnama simbolis untuk checkout checkout currenlty, saya dapat mendamaikannya masterdengan rebasing terhadap master:

git rebase HEAD master

Perintah ini:

  1. memeriksa master
  2. mengidentifikasi induk yang melakukan HEADkembali ke titik HEADdivergen darimaster
  3. memainkan komit di atas master

Hasil akhirnya adalah bahwa semua komit yang masuk HEADtetapi tidak masterkemudian juga masuk master. mastertetap diperiksa.


Mengenai remote:

beberapa komitmen yang saya bunuh dalam rebase didorong, dan yang baru dilakukan secara lokal tidak ada.

Riwayat jarak jauh tidak lagi dapat diteruskan dengan cepat menggunakan riwayat lokal Anda. Anda harus memaksa-tekan ( git push -f) untuk menimpa riwayat jarak jauh. Jika Anda memiliki kolaborator, biasanya masuk akal untuk mengoordinasikan ini dengan mereka sehingga semua orang ada di halaman yang sama.

Setelah Anda mendorong masterke jarak jauh origin, cabang pelacakan jarak jauh Anda origin/masterakan diperbarui untuk menunjuk ke komit yang sama dengan master.

Dmitry Minkovsky
sumber
3
git: "Pertama, putar kepala untuk memutar ulang pekerjaan Anda di atasnya ... master yang diteruskan ke HEAD." saya: "bagus!"
Benjamin
saran ini menciptakan segala macam alam semesta paralel FML
eonist
Astaga. Turut sedih. Pertimbangkan untuk menemukan komit yang ingin Anda setel ulang cabang Anda untuk digunakan, git reflogkemudian setel ulang cabang Anda ke komit itu dengangit rest —hard $commit
Dmitry Minkovsky
81

Lihat di sini untuk penjelasan dasar kepala terpisah:

http://git-scm.com/docs/git-checkout

Baris perintah untuk memvisualisasikannya:

git branch

atau

git branch -a

Anda akan mendapatkan output seperti di bawah ini:

* (no branch)
master
branch1

The * (no branch)menunjukkan Anda berada di kepala terpisah.

Anda bisa datang ke negara ini dengan melakukan git checkout somecommitdll. Dan itu akan memperingatkan Anda dengan yang berikut:

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

Sekarang, untuk menjadikannya master:

Lakukan git reflogatau bahkan adil git logdan catat komitmen Anda. Sekarang git checkout masterdan git mergekomitmen.

git merge HEAD@{1}

Edit:

Untuk menambahkan, gunakan git rebase -itidak hanya untuk menghapus / membunuh komit yang tidak Anda butuhkan, tetapi juga untuk mengeditnya. Sebutkan "edit" di daftar komit dan Anda akan dapat mengubah komit Anda dan kemudian mengeluarkan a git rebase --continueuntuk melanjutkan. Ini akan memastikan bahwa Anda tidak pernah datang ke KEPALA yang terpisah.

manojlds
sumber
Terima kasih untuk detail dan petunjuk informasi yang bagus di sini. Sepertinya penggabungan eksplisit tidak diperlukan, tetapi ini memvisualisasikan beberapa konsep yang akan saya kembali ke. Terima kasih.
Ben Zotto
6
Apa yang dilakukan "@ {1}"?
ebi
35

Dapatkan komitmen terpisah Anda ke cabangnya sendiri

Cukup jalankan git checkout -b mynewbranch.

Kemudian jalankan git log, dan Anda akan melihat bahwa komit sekarang ada HEADdi cabang baru ini.

Rose Perrone
sumber
Jika saya melakukan ini, apakah ada mynewbranchlampiran?
Benjohn
1
Ya, itu menempel di tempat kepala yang terpisah itu akan terpasang, yang persis seperti yang saya inginkan. Terima kasih!
Benjohn
22

jika Anda baru saja menguasai cabang dan ingin kembali ke "mengembangkan" atau fitur lakukan saja ini:

git checkout origin/develop

Catatan: memeriksa asal / berkembang .

Anda berada dalam kondisi KEPALA terpisah . 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 ...

kemudian

git checkout -b develop

Berhasil :)

amdev
sumber
7
Apa yang berhasil bagi saya bukanlah 'git checkout origin / develop' tetapi 'git checkout develop'. Menggunakan 'asal / mengembangkan' selalu menghasilkan tidak ada perubahan, sehingga tetap dalam "KEPALA terlepas pada asal / berkembang". Melewati bagian 'asal' memperbaiki segalanya.
DrStrangepork
18

Jika Anda ingin mendorong KEPALA terlepas saat ini (periksa git logsebelumnya), coba:

git push origin HEAD:master

untuk mengirim KEPALA terlepas Anda ke cabang master di asal. Jika dorongan Anda ditolak, coba git pull origin masterdulu untuk mendapatkan perubahan dari asal. Jika Anda tidak peduli dengan perubahan dari asal dan ditolak, karena Anda melakukan rebase yang disengaja dan Anda ingin mengganti asal / master dengan cabang yang saat ini terlepas - maka Anda dapat memaksanya ( -f). Jika Anda kehilangan beberapa akses ke komit sebelumnya, Anda selalu dapat berlari git refloguntuk melihat riwayat dari semua cabang.


Untuk kembali ke cabang master, sambil menyimpan perubahan, coba perintah berikut:

git rebase HEAD master
git checkout master

Lihat: Git: "Saat ini tidak di cabang mana pun." Apakah ada cara mudah untuk kembali ke cabang, sambil menjaga perubahan?

kenorb
sumber
2
Ini memang mengirimkan komitmen yang terpisah ke asal / master. Untuk melampirkan kepala ke cabang lokal lakukan ini: stackoverflow.com/a/17667057/776345
Paschalis
Ketika saya melakukan ini, saya mendapatkan repositori ini dikonfigurasi untuk Git LFS tetapi 'git-lfs' tidak ditemukan di jalur Anda. Jika Anda tidak lagi ingin menggunakan Git LFS, hapus kait ini dengan menghapus .git / hooks / post-checkout.
user2568374
16

Saya menemukan pertanyaan ini ketika mencari You are in 'detached HEAD' state.

Setelah menganalisis apa yang telah saya lakukan untuk sampai ke sini, dibandingkan dengan apa yang telah saya lakukan di masa lalu, saya menemukan bahwa saya telah membuat kesalahan.

Aliran normal saya adalah:

git checkout master
git fetch
git checkout my-cool-branch
git pull

Kali ini saya lakukan:

git checkout master
git fetch
git checkout origin/my-cool-branch
# You are in 'detached HEAD' state.

Masalahnya adalah saya tidak sengaja melakukannya:

git checkout origin/my-cool-branch

Daripada:

git checkout my-cool-branch

Cara mengatasinya (dalam situasi saya) hanyalah menjalankan perintah di atas dan kemudian melanjutkan aliran:

git checkout my-cool-branch
git pull
user664833
sumber
11

Berikut ini berfungsi untuk saya (hanya menggunakan master cabang):

git push origin HEAD:master
git checkout master        
git pull

Yang pertama mendorong HEAD yang terlepas ke asal yang jauh.

Yang kedua pindah ke master cabang.

Yang ketiga memulihkan HEAD yang menjadi terikat pada master cabang.

Masalah mungkin timbul pada perintah pertama jika dorongan ditolak. Tapi ini tidak lagi menjadi masalah kepala terpisah, tetapi adalah tentang fakta bahwa KEPALA terpisah tidak menyadari beberapa perubahan jarak jauh.

Daniel Porumbel
sumber
tidak berhasil, saya dapat: Repositori ini dikonfigurasi untuk Git LFS tetapi 'git-lfs' tidak ditemukan di jalur Anda. Jika Anda tidak lagi ingin menggunakan Git LFS, hapus kait ini dengan menghapus .git / kait / pra-push. DAN Anda saat ini tidak berada di cabang. Silakan tentukan cabang mana yang ingin Anda gabungkan.
user2568374
11

Saya baru saja mengalami masalah ini hari ini dan saya cukup yakin saya menyelesaikannya dengan melakukan:

git branch temp
git checkout master
git merge temp

Saya berada di komputer kerja ketika saya menemukan cara untuk melakukan ini, dan sekarang saya mengalami masalah yang sama pada komputer pribadi saya. Jadi harus menunggu sampai Senin ketika saya kembali ke komputer kerja untuk melihat bagaimana saya melakukannya.

adamwineguy
sumber
@Tarshine Kenorb memperbaikinya. Sekarang menyimpan komit Anda yang terpisah ke cabang baru, temp, beralih ke master, dan menggabungkan temp ke master.
Cees Timmerman
Saya tidak tahu mengapa ppl downvoting ini, itu memperbaiki stat masalah saya tetapi Anda mungkin ingin memasukkan perintah delete temp branch.
GlassGhost
8

Jika Anda benar-benar yakin KEPALA adalah kondisi yang baik:

git branch -f master HEAD
git checkout master

Anda mungkin tidak bisa mendorong ke asal, karena tuan Anda telah menyimpang dari asal. Jika Anda yakin tidak ada orang lain yang menggunakan repo, Anda dapat mendorong-paksa:

git push -f

Paling berguna jika Anda menggunakan cabang fitur yang tidak digunakan orang lain.

geon
sumber
6

Yang harus Anda lakukan adalah 'git checkout [nama-cabang]' di mana [nama-cabang] adalah nama cabang asli tempat Anda masuk ke kondisi kepala yang terpisah. (Terlepas dari asdfasdf) akan hilang.

Jadi misalnya, di cabang 'dev' Anda checkout komit asdfasd14314 ->

'git checkout asdfasd14314'

Anda sekarang dalam kondisi kepala yang terpisah

'git branch' akan mencantumkan sesuatu seperti ->

* (detached from asdfasdf)
  dev
  prod
  stage

tetapi untuk keluar dari kondisi kepala terpisah dan kembali ke dev ->

'git checkout dev'

dan kemudian 'git branch' akan menampilkan ->

* dev
  prod
  stage

tapi itu tentu saja jika Anda tidak berniat menjaga perubahan dari keadaan kepala terpisah tapi saya menemukan diri saya melakukan ini banyak tidak bermaksud untuk membuat perubahan tetapi hanya untuk melihat komit sebelumnya

Adam Freeman
sumber
6

Seperti yang ditunjukkan oleh Chris, saya mengikuti situasi

git symbolic-ref HEAD gagal dengan fatal: ref HEAD is not a symbolic ref

Namun git rev-parse refs/heads/mastermenunjuk komit yang baik dari mana saya bisa memulihkan (Dalam kasus saya komit terakhir dan Anda dapat melihat komit itu dengan menggunakangit show [SHA]

Saya melakukan banyak hal yang berantakan setelah itu, tetapi yang tampaknya telah diperbaiki hanyalah,

git symbolic-ref HEAD refs/heads/master

Dan kepala terpasang kembali!

Varun Garg
sumber
1
Terima kasih! Kepalaku terlepas. Saya bisa mengejar ketinggalan untuk menguasai tetapi mereka kebetulan menunjuk komit yang sama daripada menunjuk kepala ke master yang menunjuk komit. Tip yang baik = D
RagingRoosevelt
4

Alih-alih melakukan git checkout origin/master

kerjakan saja git checkout master

kemudian git branchakan mengkonfirmasi cabang Anda.

Goran Ch.
sumber
4

Saya memiliki masalah ini hari ini, di mana saya telah memperbarui submodule, tetapi tidak di cabang mana pun. Saya sudah berkomitmen, jadi menyembunyikan, checkout, melepas tidak akan berhasil. Saya akhirnya memilih ceri komit kepala terpisah. Jadi segera setelah saya melakukan (ketika push gagal), saya lakukan:

git checkout master
git cherry-pick 99fe23ab

Pikiranku berbunyi: Aku berada di kepala yang terpisah, tetapi aku ingin menjadi tuan. Dengan asumsi keadaan saya yang terpisah tidak jauh berbeda dari master, jika saya bisa menerapkan komit saya kepada master, saya akan siap. Inilah yang dilakukan oleh pemetik ceri.

Prewett
sumber
3

Jika Anda melakukan beberapa komit di atas master dan hanya ingin "mundur menggabungkan" di mastersana (yaitu Anda ingin mastermenunjuk ke HEAD), satu-baris adalah:

git checkout -B master HEAD
  1. Itu menciptakan cabang baru bernama master, bahkan jika sudah ada (yang seperti bergerak masterdan itulah yang kita inginkan).
  2. Cabang yang baru dibuat diatur ke titik HEAD, di mana Anda berada.
  3. Cabang baru dicentang, jadi Anda aktif mastersesudahnya.

Saya menemukan ini sangat berguna dalam kasus sub-repositori, yang juga sering berada dalam keadaan terpisah.

quazgar
sumber
3

Saya memiliki masalah yang sama dan saya telah mengatasinya dengan melalui langkah-langkah berikut.

Jika Anda perlu menyimpan perubahan Anda

  1. Pertama, Anda perlu menjalankan git checkout masterperintah untuk mengembalikan Anda ke cabang master.
  2. Jika Anda perlu menyimpan perubahan Anda hanya berjalan git checkout -b changesdan git checkout -B master changes

Jika Anda tidak membutuhkan perubahan Anda

  1. Untuk menghapus semua file yang tidak terlacak dari menjalankan cabang Anda git clean -df.

  2. Maka Anda perlu menghapus semua perubahan yang tidak bertahap dalam repositori Anda. Untuk melakukan itu, Anda harus menjalankangit checkout --

  3. Akhirnya Anda harus meletakkan cabang Anda kembali ke cabang master dengan menggunakan git checkout masterperintah.

Aravinda Meewalaarachchi
sumber
3

Bagi saya itu semudah menghapus cabang lokal lagi, karena saya tidak punya komitmen lokal yang ingin saya dorong:

Jadi saya melakukannya:

git branch -d branchname

Dan kemudian memeriksa cabang lagi:

git checkout branchname
Klaus
sumber
1

Ketika saya secara pribadi menemukan diri saya dalam situasi ketika ternyata saya membuat beberapa perubahan sementara saya tidak berada master(yaitu HEADterpisah tepat di atas masterdan tidak ada komitmen di antaranya) menyimpan mungkin membantu:

git stash # HEAD has same content as master, but we are still not in master
git checkout master  # switch to master, okay because no changes and master
git stash apply  # apply changes we had between HEAD and master in the first place
Ben Usman
sumber
1

Dengan kata sederhana, status HEAD terlepas berarti Anda tidak dicentang ke HEAD (atau tip) cabang apa pun .

Pahami dengan Contoh

Cabang di sebagian besar kasus adalah urutan beberapa komit seperti:

Komit 1: master -> branch_HEAD (123be6a76168aca712aea16076e971c23835f8ca)

Berkomit 2: master -> 123be6a76168aca712aea16076e971c23835f8ca -> branch_HEAD (100644a76168aca712aea16076e971c23835f8ca)

Seperti yang dapat Anda lihat di atas jika urutan komit, cabang Anda menunjuk komit terbaru Anda. Jadi dalam hal ini jika Anda checkout untuk melakukan 123be6a76168aca712aea16076e971c23835f8ca maka Anda akan berada dalam kondisi kepala terpisah sejak KEPALA poin cabang Anda ke 100644a76168aca712aea16076e971c23835f8ca dan secara teknis Anda akan check out di KEPALA cabang. Karenanya, Anda berada dalam kondisi HEAD yang terpisah.

Penjelasan Teoritis

Dalam Blog ini jelas menyatakan repositori Git adalah pohon komitmen, dengan masing-masing komit menunjuk ke leluhurnya dengan masing-masing pointer komit diperbarui dan pointer ke masing-masing cabang disimpan dalam sub-direktori .git / ref. Tag disimpan dalam .git / ref / tag dan cabang disimpan dalam .git / ref / kepala. Jika Anda melihat salah satu file, Anda akan menemukan setiap tag terkait dengan satu file, dengan hash komit 40 karakter dan seperti yang dijelaskan di atas oleh @Chris Johnsen dan @Yaroslav Nikitenko, Anda dapat memeriksa referensi ini.

Keshav
sumber
0

Saya masuk ke keadaan yang benar-benar konyol, saya ragu orang lain akan menemukan ini berguna .... tetapi untuk berjaga-jaga

git ls-remote origin
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        HEAD
6f96ad0f97ee832ee16007d865aac9af847c1ef6        refs/heads/HEAD
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        refs/heads/master

yang akhirnya saya perbaiki

git push origin :HEAD
KCD
sumber
0

Ini bekerja dengan baik untuk saya:

1. git stashuntuk menyimpan modifikasi lokal Anda

Jika Anda ingin membuang perubahan,
git clean -df
git checkout -- .
git clean menghapus semua file yang tidak terlacak (peringatan: sementara itu tidak akan menghapus file yang diabaikan yang disebutkan secara langsung di .gitignore, itu dapat menghapus file yang diabaikan yang berada di folder) dan checkout git menghapus semua perubahan yang tidak bertahap.

2. git checkout masteruntuk beralih ke cabang utama (Dengan asumsi Anda ingin menggunakan master)
3. git pulluntuk menarik komit terakhir dari cabang master
4. git statusuntuk memeriksa semuanya tampak hebat

On branch master
Your branch is up-to-date with 'origin/master'.
Jmojico
sumber
0

Dalam kasus saya, saya berlari git status, dan saya melihat bahwa saya memiliki beberapa file yang tidak terlacak dalam direktori kerja saya.

Untuk membuat rebase bekerja, saya hanya perlu membersihkannya (karena saya tidak membutuhkannya).

falsarella
sumber
0

Jika Anda menggunakan EGit di Eclipse: anggap master Anda adalah cabang pengembangan utama Anda

  • mengkomit perubahan Anda ke cabang, biasanya yang baru
  • lalu tarik dari remote
  • kemudian klik kanan node proyek, pilih tim kemudian pilih tampilkan riwayat
  • kemudian klik kanan master, pilih check out
  • jika Eclipse memberi tahu Anda, ada dua master satu lokal satu remote, pilih remote

Setelah ini, Anda harus dapat melampirkan kembali ke master-asal.

Junchen Liu
sumber
-1

Saya memiliki masalah yang sama. Saya menyimpan perubahan saya dengan git stashdan sulit mengatur ulang cabang di lokal ke komit sebelumnya (saya pikir itu menyebabkan itu) kemudian melakukan git pulldan saya tidak mendapatkan kepala itu terlepas sekarang. Jangan lupa git stash applylakukan perubahan Anda lagi.

SamL
sumber
-2
git checkout checksum  # You could use this to peek previous checkpoints
git status # You will see HEAD detached at checksum
git checkout master # This moves HEAD to master branch
David Yang
sumber