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)



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

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.


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.


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

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

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 .


1

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.