Bagaimana saya bisa mendamaikan KEPALA terpisah dengan induk/asal?

I'm baru di percabangan kompleksitas dari Git. Saya selalu bekerja pada satu cabang dan melakukan perubahan dan kemudian secara berkala push ke remote asal.

Di tempat yang baru-baru ini, saya melakukan reset dari beberapa file untuk mengeluarkan mereka dari melakukan pementasan, dan kemudian melakukan rebase -i untuk menyingkirkan beberapa lokal terakhir melakukan. Sekarang saya'm dalam keadaan aku don't cukup mengerti.

Di wilayah kerja saya, git log menunjukkan apa yang saya'd harapkan-- I'm pada kereta yang tepat dengan melakukan I didn't ingin pergi, dan yang baru ada, dll.

Tapi aku hanya didorong ke remote repository, dan apa yang's ada yang berbeda-- beberapa komit I'd tewas dalam rebase harus didorong, dan baru dilakukan secara lokal aren't ada.

Saya pikir "master/asal" yang terlepas dari KEPALA, tapi saya'm tidak 100% jelas tentang apa artinya, cara memvisualisasikan dengan command line tools, dan bagaimana memperbaikinya.

Mengomentari pertanyaan (6)
Larutan

Pertama, mari kita memperjelas apa KEPALA dan apa artinya ketika itu terlepas.

KEPALA adalah nama simbolis bagi yang sedang memeriksa komit. Bila KEPALA tidak terpisah ("normal"1 situasi: anda memiliki cabang memeriksa), KEPALA sebenarnya poin untuk cabang ini "ref" dan titik-titik cabang untuk melakukan. KEPALA jadi "melekat" ke cabang. Ketika anda membuat yang baru melakukan, cabang yang KEPALA poin untuk diperbarui ke titik yang baru dilakukannya. KEPALA mengikuti secara otomatis sejak itu hanya menunjuk ke cabang.

  • git simbolis-ref KEPALA hasil ref/kepala/guru Cabang yang bernama "master" adalah memeriksa.
  • git rev-mengurai ref/kepala/guru yield 17a02998078923f2d62811326d130de991d1a95a Yang melakukan adalah tip saat ini atau "kepala" dari master cabang.
  • git rev-mengurai KEPALA juga panen 17a02998078923f2d62811326d130de991d1a95a Ini adalah apa artinya menjadi "simbolis ref". Itu poin-poin untuk suatu objek melalui beberapa referensi lainnya. (Simbolik ref awalnya dilaksanakan sebagai simbolik link, tapi kemudian berubah menjadi file biasa dengan tambahan interpretasi sehingga mereka dapat digunakan pada platform yang tidak memiliki symlink.)

Kami memiliki KEPALAref/kepala/guru17a02998078923f2d62811326d130de991d1a95a

Ketika KEPALA terpisah, itu poin langsung untuk melakukan alih—alih secara tidak langsung menunjuk ke satu melalui cabang. Yang dapat anda pikirkan terpisah KEPALA seperti berada di sebuah cabang yang tidak disebutkan namanya.

  • git simbolis-ref KEPALA gagal dengan fatal: ref KEPALA tidak simbolis ref
  • git rev-mengurai KEPALA hasil 17a02998078923f2d62811326d130de991d1a95a Karena tidak simbolik ref, itu harus menunjuk langsung untuk melakukan itu sendiri.

Kami memiliki KEPALA17a02998078923f2d62811326d130de991d1a95a

Hal yang penting untuk diingat dengan KEPALA terpisah adalah bahwa jika melakukan hal itu poin untuk tidak memetiknya (tidak lain ref bisa mencapai itu), maka itu akan menjadi "menggantung" ketika anda checkout beberapa lainnya melakukan. Akhirnya, seperti menggantung berkomitmen akan dipangkas melalui proses pengumpulan sampah (secara default, mereka disimpan selama minimal 2 minggu dan dapat disimpan lebih lama dengan direferensikan oleh KEPALA reflog).

1 Hal ini sangat baik untuk melakukan pekerjaan "normal" dengan KEPALA terpisah, anda hanya perlu menjaga melacak dari apa yang anda lakukan untuk menghindari ikan menjatuhkan sejarah dari reflog.


Langkah-langkah perantara interaktif rebase yang dilakukan dengan KEPALA terpisah (sebagian untuk menghindari polusi aktif cabang reflog). Jika anda menyelesaikan penuh operasi rebase, itu akan memperbarui asli cabang dengan hasil kumulatif dari operasi rebase dan memasang kembali KEPALA ke cabang. Dugaan saya adalah bahwa anda tidak pernah sepenuhnya selesai proses rebase; ini akan meninggalkan anda dengan KEPALA terpisah menunjuk ke komit yang paling baru-baru ini diolah oleh operasi rebase.

Untuk pulih dari situasi anda, anda harus membuat cabang yang menunjuk ke komit saat ini menunjuk dengan KEPALA terpisah:

git branch temp
git checkout temp

(dua perintah yang dapat disingkat sebagai git checkout -b temp)

Ini akan memasang kembali KEPALA anda baru temp cabang.

Berikutnya, anda harus membandingkan saat melakukan (dan sejarah) dengan normal cabang di mana anda diharapkan untuk dapat bekerja:

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

(Anda mungkin akan ingin bereksperimen dengan log pilihan: menambahkan -p, pergi - cukup=... untuk melihat seluruh pesan log, dll.)

Jika anda baru temp cabang terlihat baik, anda mungkin ingin memperbarui (misalnya) master untuk menunjuk ke itu:

git branch -f master temp
git checkout master

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

Anda kemudian dapat menghapus temporary cabang:

git branch -d temp

Akhirnya, anda mungkin akan ingin mendorong kembali sejarah:

git push origin master

Anda mungkin perlu menambahkan --force untuk akhir dari perintah ini untuk mendorong jika remote cabang tidak dapat "bertahan" baru melakukan (yaitu anda turun, atau menulis ulang beberapa sudah ada yang melakukan, atau menulis ulang beberapa sedikit sejarah).

Jika anda berada di tengah-tengah suatu operasi rebase anda mungkin harus membersihkannya. Anda dapat memeriksa apakah rebase di proses dengan mencari direktori .git/rebase-merge/. Anda dapat secara manual membersihkan dalam proses rebase dengan hanya menghapus direktori tersebut (misalnya jika anda tidak ingat lagi tujuan dan konteks aktif operasi rebase). Biasanya anda akan menggunakan git rebase --batalkan`, tapi itu tidak beberapa ekstra ulang yang anda mungkin ingin menghindari (bergerak kembali ke asli cabang dan me-reset kembali ke asli komit, yang akan membatalkan beberapa pekerjaan yang kita lakukan di atas).

Komentar (22)

Hanya melakukan ini:

git checkout master

Atau, jika anda memiliki perubahan yang ingin anda simpan, lakukan ini:

git checkout -b temp
git checkout -B master temp
Komentar (12)

Aku berlari ke dalam masalah ini dan ketika saya baca di atas sebagai jawaban:

KEPALA adalah nama simbolis bagi yang sedang memeriksa komit.

Saya berpikir: Ah-ha! Jika KEPALA adalah nama simbolis bagi currenlty melakukan checkout, saya dapat mendamaikan terhadap master oleh rebasing itu terhadap master:

git rebase HEAD master

Perintah ini:

  1. cek out master
  2. mengidentifikasi komit induk dari KEPALA back to the point KEPALA menyimpang dari master
  3. memainkan mereka melakukan di atas master

Hasil akhirnya adalah bahwa semua melakukan yang ada di KEPALA tapi tidak master yang kemudian juga di master. master tetap memeriksa.


Mengenai remote:

beberapa komit I'd tewas dalam rebase harus didorong, dan baru dilakukan secara lokal aren't ada.

Remote sejarah tidak bisa lagi menjadi cepat diteruskan menggunakan sejarah lokal. Anda'll perlu memaksa-push (git push-f) menimpa remote sejarah. Jika anda memiliki kolaborator, biasanya akal untuk mengkoordinasikan hal ini dengan mereka sehingga semua orang pada halaman yang sama.

Setelah anda menekan master remote asal, remote tracking cabang asal/master akan diperbarui ke titik yang sama komit sebagai master.

Komentar (2)

Lihat di sini untuk penjelasan dasar terpisah kepala:

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

Command line untuk memvisualisasikan itu:

git branch

atau

git branch -a

anda akan mendapatkan output seperti di bawah ini:

* (no branch)
master
branch1

The * (tidak ada cabang) menunjukkan anda di kepala terpisah.

Anda bisa datang ke negara ini dengan melakukan git checkout somecommit dll. dan itu akan mengingatkan anda dengan berikut:

Anda 'terpisah KEPALA' negara. Anda dapat melihat sekitar, membuat eksperimen perubahan dan melakukan mereka, dan anda dapat membuang melakukan anda membuat ini negara tanpa mempengaruhi setiap cabang lain dengan melakukan checkout.

Jika anda ingin membuat cabang baru untuk mempertahankan komitmen yang anda buat, anda dapat melakukannya jadi (sekarang atau nanti) dengan menggunakan -b dengan checkout perintah lagi. Contoh:

git checkout -b new_branch_name

Sekarang, untuk mendapatkan mereka ke master:

Melakukan git reflog atau bahkan hanya git log dan catatan anda melakukan. Sekarang git checkout master dan git merge komit.

git merge HEAD@{1}

Edit:

Untuk menambahkan, penggunaan git rebase -akutidak hanya untuk menghapus / killing melakukan bahwa anda don't perlu, tetapi juga untuk mengedit mereka. Hanya menyebutkan "edit" dalam melakukan daftar dan anda akan dapat mengubah anda yang berkomitmen dan kemudian mengeluarkangit rebase --lanjutkan` untuk pergi ke depan. Ini akan memastikan bahwa anda tidak pernah datang ke KEPALA terpisah.

Komentar (2)

Anda terpisah komit ke cabang sendiri

Cukup jalankan git checkout -b mynewbranch.

Kemudian jalankan git log, dan anda'll melihat bahwa melakukan sekarangKEPALA` di cabang baru ini.

Komentar (2)

jika anda hanya menguasai cabang dan ingin kembali ke "mengembangkan" atau fitur yang hanya melakukan ini :

git checkout origin/develop

Catatan: check-out asal/mengembangkan.

Anda berada di terpisah KEPALA negara. Anda dapat melihat di sekitar, membuat eksperimen perubahan dan melakukan mereka, dan anda dapat membuang melakukan anda membuat ini negara tanpa mempengaruhi setiap cabang lain dengan melakukan checkout...

kemudian

git checkout -b develop

Kerjanya :)

Komentar (1)

Jika anda ingin mendorong anda saat ini terpisah KEPALA (check git log sebelum), cobalah:

git push origin HEAD:master

untuk mengirim KEPALA terpisah menjadi cabang master asal. Jika anda mendorong ditolak, coba git pull asal master pertama untuk mendapatkan perubahan dari asal. Jika anda don't peduli tentang perubahan dari asal's ditolak, karena anda melakukan beberapa disengaja rebase dan anda ingin mengganti asal/induk dengan anda saat ini terpisah cabang - maka anda mungkin kekuatan itu (-f). Dalam kasus anda kehilangan akses ke sebelumnya melakukan, anda selalu dapat menjalankan git reflog` untuk melihat sejarah dari semua cabang.


Untuk mendapatkan kembali di cabang master, sambil menjaga perubahan, coba perintah berikut:

git rebase HEAD master
git checkout master

Lihat: https://stackoverflow.com/q/4735556/55075

Komentar (2)

Aku hanya berlari ke dalam masalah ini hari ini dan saya cukup yakin saya dipecahkan dengan melakukan:

git branch temp
git checkout master
git merge temp

Aku berada di komputer kerja saya ketika saya menemukan cara untuk melakukan hal ini, dan sekarang saya'm berlari ke dalam masalah yang sama pada komputer pribadi saya. Jadi harus menunggu sampai hari senin ketika saya'm kembali di tempat kerja komputer untuk melihat persis bagaimana saya melakukannya.

Komentar (3)

Saya menemukan pertanyaan ini ketika mencari Anda di 'terpisah KEPALA' negara.

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

Saya aliran normal adalah:

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

Kali ini yang saya lakukan:

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

Masalahnya adalah bahwa saya sengaja lakukan:

git checkout origin/my-cool-branch

Daripada:

git checkout my-cool-branch

Memperbaiki (dalam situasi saya) hanya untuk menjalankan perintah di atas dan kemudian melanjutkan aliran:

git checkout my-cool-branch
git pull
Komentar (0)

Berikut ini bekerja untuk saya (hanya menggunakan branch master):

git push origin HEAD:master
git checkout master        
git pull

Yang pertama mendorong KEPALA terpisah untuk jarak jauh asal.

Yang kedua bergerak ke branch master.

Yang ketiga pulih KEPALA yang menjadi melekat pada branch master.

Masalah yang mungkin timbul pada perintah pertama jika push akan ditolak. Tapi ini tidak akan lagi menjadi masalah terpisah kepala, tapi ini tentang fakta bahwa KEPALA terpisah tidak menyadari beberapa perubahan jarak-jauh.

Komentar (1)

Jika anda benar-benar yakin KEPALA negara yang baik:

git branch -f master HEAD
git checkout master

Anda mungkin bisa't push ke asal, karena guru telah menyimpang dari asalnya. Jika anda yakin tidak ada orang lain yang menggunakan repo, anda dapat memaksa-push:

git push -f

Paling berguna jika anda berada pada fitur cabang tidak ada orang lain yang menggunakan.

Komentar (0)

Seperti yang ditunjukkan oleh Chris, saya telah mengikuti situasi

git simbolis-ref KEPALA gagal dengan fatal: ref KEPALA tidak simbolis ref

Namun git rev-mengurai ref/kepala/guru itu menunjuk ke sebuah komitmen dari mana saya bisa sembuh (Dalam kasus saya komit terakhir dan anda dapat melihat bahwa komit dengan menggunakan git show [SHA]`

Saya melakukan banyak hal-hal berantakan setelah itu, tapi apa yang tampaknya telah tetap hanya,

git simbolis-ref KEPALA ref/kepala/guru

Dan kepala kembali terpasang!

Komentar (1)

Semua yang harus anda lakukan adalah 'git checkout [branch-name]' di mana [cabang-nama] adalah nama asli cabang dari yang anda punya menjadi terpisah kepala negara. (Yang terpisah dari asdfasdf) akan hilang.

Jadi misalnya, di cabang 'dev' anda pelajari melakukan asdfasd14314 ->

'git checkout asdfasd14314'

anda sekarang terpisah kepala negara

'git branch' akan menampilkan sesuatu seperti ->

* (detached from asdfasdf)
  dev
  prod
  stage

tapi untuk keluar dari terpisah kepala negara dan kembali ke dev ->

'git checkout dev'

dan kemudian 'git branch' akan daftar ->

* dev
  prod
  stage

tapi itu tentu saja jika anda tidak berniat untuk menjaga setiap perubahan dari terpisah kepala negara, tetapi saya menemukan diri saya melakukan hal ini banyak tidak berniat untuk membuat perubahan tapi hanya untuk melihat commit sebelumnya

Komentar (0)

Bukannya melakukan git checkout asal/master

hanya melakukan git checkout master

kemudian git branch akan mengkonfirmasi cabang anda.

Komentar (0)

Aku punya masalah ini hari ini, di mana saya telah diperbarui submodule, tapi bukan't pada setiap cabang. Saya sudah berkomitmen, jadi menyembunyikannya, checkout, unstashing tidak't bekerja. Saya akhirnya cherry-picking terpisah kepala's melakukan. Jadi segera setelah saya berkomitmen (ketika push gagal), saya lakukan:

git checkout master
git cherry-pick 99fe23ab

Pemikiran saya: saya'm pada kepala terpisah, tapi aku ingin menjadi guru. Asumsi saya terpisah negara tidak sangat berbeda dari guru, jika saya bisa menerapkan saya berkomitmen untuk master, saya'd diatur. Ini adalah persis apa yang cherry-pick tidak.

Komentar (0)

Jika anda melakukan commit di atas master dan hanya ingin "mundur gabung" master di sana (yaitu anda ingin menguasai untuk menunjuk ke HEAD), satu-liner akan sama:

git checkout -B master HEAD
  1. Yang menciptakan cabang baru dengan nama master, bahkan jika itu sudah ada (yang bergerak seperti master dan's apa yang kita inginkan).
  2. Baru dibuat cabang diatur untuk menunjuk ke KEPALA, yang adalah di mana anda berada.
  3. Cabang baru adalah memeriksa, sehingga anda berada di master setelah itu.

Saya menemukan ini sangat berguna dalam kasus sub-repositori, yang juga kebetulan berada di sebuah negara terpisah agak sering.

Komentar (0)

Bagi saya itu semudah menghapus cabang lokal lagi, karena saya didn't memiliki setempat melakukan yang saya ingin mendorong:

Jadi yang saya lakukan:

git branch -d branchname

Dan kemudian memeriksa cabang lagi:

git checkout branchname
Komentar (0)

Aku punya masalah yang sama dan saya telah memutuskan ini dengan pergi melalui langkah-langkah berikut.

Jika anda perlu untuk menyimpan perubahan

  1. Pertama, anda perlu untuk menjalankan git checkout master` perintah untuk menempatkan anda kembali ke master cabang.
  2. Jika anda perlu untuk menyimpan perubahan anda hanya menjalankan git checkout -b perubahandan git checkout -B master perubahan`

Jika anda don't perlu perubahan

  1. Untuk menghilangkan semua terpantau file dari cabang anda menjalankan git bersih -df.

  2. Maka anda perlu untuk menghapus semua yang belum ter-stage perubahan dalam repositori anda. Dalam rangka untuk melakukan itu anda harus menjalankan git checkout -- `

  3. Akhirnya anda harus menempatkan cabang anda kembali ke cabang utama dengan menggunakan git checkout master` perintah.

Komentar (0)

Ketika saya secara pribadi menemukan diri dalam situasi ketika ternyata bahwa saya membuat beberapa perubahan saat saya tidak di master (yaitu KEPALA terpisah tepat di atas master dan tidak ada komitmen di antara) menyembunyikannya mungkin bisa 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
Komentar (0)

Dalam kata-kata sederhana, terpisah KEPALA negara berarti anda tidak memeriksa ke KEPALA (atau ujung) dari setiap cabang.

Memahami Dengan Contoh

Cabang di sebagian besar kasus adalah urutan dari beberapa berkomitmen seperti:

Melakukan 1: master-->branch_HEAD(123be6a76168aca712aea16076e971c23835f8ca)

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

Seperti yang anda dapat lihat di atas dalam hal urutan melakukan, anda branch poin untuk terbaru anda komit. Jadi dalam hal ini jika anda checkout untuk melakukan 123be6a76168aca712aea16076e971c23835f8ca kemudian anda akan di copot kepala negara sejak KEPALA cabang poin 100644a76168aca712aea16076e971c23835f8ca dan secara teknis anda memeriksa KEPALA cabang. Oleh karena itu, anda terpisah KEPALA negara.

Penjelasan

Di Blog ini's dengan jelas menyatakan sebuah repositori Git adalah pohon-dari-melakukan, dengan masing-masing melakukan menunjuk kepada para leluhur dengan masing-masing melakukan pointer diperbarui dan pointer ini untuk masing-masing cabang disimpan dalam .git/ref sub-direktori. Tags disimpan dalam .git/ref/kategori dan cabang-cabang yang disimpan di .git/ref/kepala. Jika anda melihat salah satu dari file, anda'll menemukan masing-masing tag yang sesuai untuk file tunggal, dengan 40 karakter melakukan hash dan seperti yang dijelaskan di atas oleh @Chris Johnsen dan @Yaroslav Nikitenko, anda dapat memeriksa referensi ini.

Komentar (0)