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.
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
hasilref/kepala/guru
Cabang yang bernama "master" adalah memeriksa.git rev-mengurai ref/kepala/guru
yield17a02998078923f2d62811326d130de991d1a95a
Yang melakukan adalah tip saat ini atau "kepala" dari master cabang.git rev-mengurai KEPALA juga
panen17a02998078923f2d62811326d130de991d1a95a
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
KEPALA
→ref/kepala/guru
→17a02998078923f2d62811326d130de991d1a95a
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 denganfatal: ref KEPALA tidak simbolis ref
git rev-mengurai KEPALA
hasil17a02998078923f2d62811326d130de991d1a95a
Karena tidak simbolik ref, itu harus menunjuk langsung untuk melakukan itu sendiri.Kami memiliki
KEPALA
→17a02998078923f2d62811326d130de991d1a95a
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:
(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:
(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:(dua perintah yang dapat disingkat sebagai
git checkout -B master temp
)Anda kemudian dapat menghapus temporary cabang:
Akhirnya, anda mungkin akan ingin mendorong kembali sejarah:
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).Hanya melakukan ini:
Atau, jika anda memiliki perubahan yang ingin anda simpan, lakukan ini:
Aku berlari ke dalam masalah ini dan ketika saya baca di atas sebagai jawaban:
Saya berpikir: Ah-ha! Jika
KEPALA
adalah nama simbolis bagi currenlty melakukan checkout, saya dapat mendamaikan terhadapmaster
oleh rebasing itu terhadapmaster
:Perintah ini:
master
KEPALA
back to the pointKEPALA
menyimpang darimaster
master
Hasil akhirnya adalah bahwa semua melakukan yang ada di
KEPALA
tapi tidakmaster
yang kemudian juga dimaster
.master
tetap memeriksa.Mengenai remote:
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
remoteasal
, remote tracking cabangasal/master
akan diperbarui ke titik yang sama komit sebagaimaster
.Lihat di sini untuk penjelasan dasar terpisah kepala:
http://git-scm.com/docs/git-checkout
Command line untuk memvisualisasikan itu:
atau
anda akan mendapatkan output seperti di bawah ini:
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:Sekarang, untuk mendapatkan mereka ke master:
Melakukan
git reflog
atau bahkan hanyagit log
dan catatan anda melakukan. Sekaranggit checkout master
dangit merge
komit.Edit:
Untuk menambahkan, penggunaan git rebase -aku
tidak 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 mengeluarkan
git rebase --lanjutkan` untuk pergi ke depan. Ini akan memastikan bahwa anda tidak pernah datang ke KEPALA terpisah.Anda terpisah komit ke cabang sendiri
Cukup jalankan
git checkout -b mynewbranch
.Kemudian jalankan git log
, dan anda'll melihat bahwa melakukan sekarang
KEPALA` di cabang baru ini.jika anda hanya menguasai cabang dan ingin kembali ke "mengembangkan" atau fitur yang hanya melakukan ini :
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
Kerjanya :)
Jika anda ingin mendorong anda saat ini terpisah KEPALA (check
git log
sebelum), cobalah: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:
Lihat: https://stackoverflow.com/q/4735556/55075
Aku hanya berlari ke dalam masalah ini hari ini dan saya cukup yakin saya dipecahkan dengan melakukan:
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.
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:
Kali ini yang saya lakukan:
Masalahnya adalah bahwa saya sengaja lakukan:
Daripada:
Memperbaiki (dalam situasi saya) hanya untuk menjalankan perintah di atas dan kemudian melanjutkan aliran:
Berikut ini bekerja untuk saya (hanya menggunakan branch master):
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.
Jika anda benar-benar yakin KEPALA negara yang baik:
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:
Paling berguna jika anda berada pada fitur cabang tidak ada orang lain yang menggunakan.
Seperti yang ditunjukkan oleh Chris, saya telah mengikuti situasi
git simbolis-ref KEPALA
gagal denganfatal: 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!
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 ->
anda sekarang terpisah kepala negara
'git branch' akan menampilkan sesuatu seperti ->
tapi untuk keluar dari terpisah kepala negara dan kembali ke dev ->
dan kemudian 'git branch' akan daftar ->
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
Bukannya melakukan
git checkout asal/master
hanya melakukan
git checkout master
kemudian
git branch
akan mengkonfirmasi cabang anda.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:
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.
Jika anda melakukan commit di atas master dan hanya ingin "mundur gabung"
master
di sana (yaitu anda inginmenguasai
untuk menunjuk keHEAD
), satu-liner akan sama:master
, bahkan jika itu sudah ada (yang bergerak sepertimaster
dan's apa yang kita inginkan).KEPALA
, yang adalah di mana anda berada.master
setelah itu.Saya menemukan ini sangat berguna dalam kasus sub-repositori, yang juga kebetulan berada di sebuah negara terpisah agak sering.
Bagi saya itu semudah menghapus cabang lokal lagi, karena saya didn't memiliki setempat melakukan yang saya ingin mendorong:
Jadi yang saya lakukan:
Dan kemudian memeriksa cabang lagi:
Aku punya masalah yang sama dan saya telah memutuskan ini dengan pergi melalui langkah-langkah berikut.
Jika anda perlu untuk menyimpan perubahan
dan
git checkout -B master perubahan`Jika anda don't perlu perubahan
Untuk menghilangkan semua terpantau file dari cabang anda menjalankan git
bersih -df
.Maka anda perlu untuk menghapus semua yang belum ter-stage perubahan dalam repositori anda. Dalam rangka untuk melakukan itu anda harus menjalankan git checkout -- `
Akhirnya anda harus menempatkan cabang anda kembali ke cabang utama dengan menggunakan git checkout master` perintah.
Ketika saya secara pribadi menemukan diri dalam situasi ketika ternyata bahwa saya membuat beberapa perubahan saat saya tidak di
master
(yaituKEPALA
terpisah tepat di atasmaster
dan tidak ada komitmen di antara) menyembunyikannya mungkin bisa membantu: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.