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
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 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 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 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:
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).
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:
master
KEPALA
back to the point KEPALA
menyimpang dari master
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
.
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 mengeluarkan
git rebase --lanjutkan` untuk pergi ke depan. Ini akan memastikan bahwa anda tidak pernah datang ke KEPALA terpisah.
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 :)
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
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.
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
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.
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.
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!
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
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.
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
master
, bahkan jika itu sudah ada (yang bergerak seperti master
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:
git branch -d branchname
Dan kemudian memeriksa cabang lagi:
git checkout branchname
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
(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
Dalam kata-kata sederhana, terpisah KEPALA negara berarti anda tidak memeriksa ke KEPALA (atau ujung) dari setiap cabang.
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.
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.