Menyelamatkan file dan melakukan dari "no branch" di git

11

Saya mulai bekerja pada beberapa file yang saya miliki di git submodule dalam proyek lain. Namun, karena itu adalah submitule git, ia tidak pernah memeriksa "master" dan sebagai gantinya hanya memeriksa kepala dan meletakkan semua file dalam folder di "no branch".

Sekarang saya telah membuat beberapa perubahan secara tidak sengaja pada file-file ini, saya baru menyadari bahwa saya sedang bekerja dalam submodule "no branch", dari proyek saya.

Bagaimana cara memasukkan file-file itu ke cabang (seperti master) sehingga saya bisa menyelamatkannya?

Xeoncross
sumber

Jawaban:

28

Anda dapat menggunakan git refloguntuk menemukan komitmen "hilang":

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT
mipadi
sumber
Yap, ini berhasil! kecuali saya lakukan git merge $COMMIT_SHAsekali saya berada di cabang lain.
Xeoncross
3

Status “no branch” disebut HEAD terpisah. Disebut ini karena referensi HEAD tidak melekat pada cabang mana pun, melainkan menunjuk langsung pada komit. Untuk melampirkan HEAD ke cabang yang menunjuk ke komit HEAD saat ini, gunakan git checkout -b branchname.

Anda dapat dengan aman memperbarui cabang yang ada untuk memasukkan komit di HEAD dengan urutan ini:

git branch temp
git checkout branchname
git merge temp
git branch -d temp

Atau, setara, menggunakan notasi reflog HEAD@{1}untuk menghindari keharusan membuat cabang sementara:

git checkout branchname
git merge HEAD@{1}

Menggunakan cabang sementara akan menjadi ide bagus jika Anda tidak akan segera melakukan penggabungan.

Jika Anda ingin secara paksa menimpa cabang yang ada untuk menunjuk komit di HEAD yang dapat Anda gunakan git branch -f branchname && git checkout branchname. Jika komit di HEAD tidak didasarkan pada ujung branchname saat ini, ini akan menghasilkan perubahan non-fast-forward ke branchname yang biasanya ingin Anda hindari (ini dilihat sebagai riwayat penulisan ulang).

Chris Johnsen
sumber
Perhatikan bahwa jawaban ini mengasumsikan bahwa KEPALA masih menunjuk ke komit terakhir-yang-bukan-di-cabang. Jika Anda telah memindahkan KEPALA sejak saat itu dan baru sekarang menyadari apa yang terjadi, Anda mungkin perlu mencari komit yang hilang di reflog (lihat jawaban mipadi).
LarsH
1

Untuk menambah jawaban sebelumnya:

Saat Anda masih menggunakan HEAD yang terlepas, Anda dapat menambahkan tag:

git tag <some-tag>

Ini akan menambahkan tag ke komit, yang akan membuatnya terlihat di gitkdan alat lainnya.

data
sumber