Apa yang harus dilakukan dengan komit dibuat di kepala yang terpisah

280

Menggunakan git saya membuat sesuatu seperti ini

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

Karena dikatakan kepada saya bahwa saya masih bisa melakukan ketika dalam keadaan kepala yang terpisah, saya melakukannya. Tapi sekarang saya ingin menggabungkan cabang kepala saya yang terpisah dan cabang master lokal saya, dan kemudian mendorong banyak perubahan ke asal / master.

Jadi pertanyaan saya adalah bagaimana saya bisa menggabungkan cabang master dengan kondisi saya yang sebenarnya (kepala terpisah)

benzen
sumber
kemungkinan duplikat dari Git: HEAD telah menghilang, ingin menggabungkannya menjadi master
Karl Bielefeldt
Saya bisa menambahkan tangkapan layar komit di negara ini (bagaimana komit pada kepala terpisah terlihat seperti di gitk atau SourceTree), yang akan membuat pertanyaan ini lebih baik.
florisla
Unfortunalty saat ini saya tidak bisa tetapi jika Anda bisa menyediakan, saya akan senang melihatnya di sini. Bahkan jika itu harus seri, itu akan membuatnya lebih jelas
benzen

Jawaban:

477

Buat cabang di mana Anda berada, lalu beralih ke master dan menggabungkannya:

git branch my-temporary-work
git checkout master
git merge my-temporary-work
Ryan Stewart
sumber
12
bagaimana seseorang menghindari melepaskan kepala di masa depan?
ycomp
Saya melakukan ini dan menemukan diri saya di depan dengan 5 melakukan. Dalam hal ini apakah Anda hanya melakukan git push origin?
Winnemucca
5
aneh, saya mendapatkan "Sudah up-to-date." ketika menggabungkan pekerjaan sementara saya
Robert Sinclair
10
Jangan lupa untuk menghapus my-temporary-work dengan "git branch -d my-temporary-work"
Captain Lepton
5
@comp "kepala terpisah" terjadi ketika Anda mengedit file dari komit lama dan kemudian komit itu tanpa cabang untuk referensi komit baru ini nanti. Untuk menghindari kepala terpisah, jangan periksa komitmen lama. Jika Anda masih menginginkan semua file dari sana, tetapi sebagai komit baru, maka Anda dapat checkout direktori dari komit, bukan komit itu sendiri. Lihat jawaban ini
lucidbrot
96

Anda bisa melakukan sesuatu seperti ini.

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

Bahkan lebih sederhana lagi

git checkout master
git merge HEAD@{1}

tetapi ini memiliki sedikit bahaya bahwa jika Anda melakukan kesalahan, akan sedikit lebih sulit untuk memulihkan komitmen yang dilakukan pada kepala yang terpisah.

CB Bailey
sumber
4
Saya tahu ini bertahun-tahun kemudian, tetapi terima kasih atas jawaban ini. Saya tidak menganggap diri saya selesai mencari dengan jawaban yang diterima di sini karena saya tidak ingin meninggalkan cabang sementara dan jawaban ini memiliki perintah untuk menghapusnya.
Jeremy Pridemore
8
Jika Anda memutuskan untuk menggunakan perintah, git merge HEAD@{1}Anda mungkin harus memastikan itu adalah yang ingin Anda gunakan dengan menggunakangit reflog
Michael Stramel
3
Mampu menggabungkan HEAD @ {1} menyelamatkan hidup saya karena saya sudah memeriksa master terlebih dahulu.
remaja
aneh, saya mendapatkan "Sudah up-to-date." ketika menggabungkan tmp (tetapi file-file berbeda)
Robert Sinclair
18

Inilah yang saya lakukan:

Pada dasarnya, anggap detached HEADsebagai cabang baru, tanpa nama. Anda dapat berkomitmen ke cabang ini sama seperti cabang lainnya. Setelah Anda selesai melakukan, Anda ingin mendorongnya ke remote.

Jadi hal pertama yang perlu Anda lakukan adalah memberi detached HEADnama ini. Anda dapat melakukannya dengan mudah, sambil berada di ini detached HEAD:

git checkout -b some-new-branch

Sekarang Anda dapat mendorongnya ke jarak jauh seperti cabang lainnya.

Dalam kasus saya, saya juga ingin memajukan cabang ini untuk dikuasai bersama dengan komit yang saya buat di detached HEAD(sekarang some-new-branch). Yang saya lakukan adalah

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

Tentu saja, saya menggabungkannya nanti master.

Itu saja.

Bhushan
sumber
1
Jawaban ini bekerja untuk saya ketika yang lain tidak. git checkout -b new-branchbekerja untukku. Saran lain diperlukan git branch new-branch, tetapi itu membuat saya masih bingung dan cabang baru tidak menerima perubahan saya.
Jesse Patel
17

Anda bisa melakukan git merge <commit-number>ataugit cherry-pick <commit> <commit> ...

Seperti yang disarankan oleh Ryan Stewart Anda juga dapat membuat cabang dari KEPALA saat ini:

git branch brand-name

Atau hanya sebuah tag:

git tag tag-name
Arnaud Le Blanc
sumber
Anda dapat menemukan nomor komit Anda pada kepala terpisah dengangit rev-parse HEAD
KOGI
6

Jika HEAD terlepas, komit berfungsi seperti biasa, kecuali tidak ada cabang bernama yang diperbarui. Untuk mendapatkan cabang master diperbarui dengan perubahan yang dilakukan, buat cabang sementara di tempat Anda berada (dengan cara ini cabang sementara akan memiliki semua perubahan yang dilakukan pada HEAD yang dilepaskan), kemudian beralih ke cabang master dan gabungkan cabang sementara dengan tuan.

git branch  temp
git checkout master
git merge temp
Razan Paul
sumber
3

Memperbaiki mudah adalah dengan hanya membuat cabang baru untuk itu berkomitmen dan checkout untuk itu: git checkout -b <branch-name> <commit-hash>.

Dengan cara ini, semua perubahan yang Anda buat akan disimpan di cabang itu. Jika Anda perlu membersihkan cabang master Anda dari sisa komit, pastikan untuk menjalankannya git reset --hard master.

Dengan ini, Anda akan menulis ulang cabang Anda jadi pastikan untuk tidak mengganggu siapa pun dengan perubahan ini. Pastikan untuk melihat artikel ini untuk ilustrasi yang lebih baik dari kondisi KEPALA terpisah .

Nesha Zoric
sumber
1

Mungkin bukan solusi terbaik, (akan menulis ulang sejarah) tetapi Anda juga bisa melakukannya git reset --hard <hash of detached head commit>.

calon
sumber