Dosyaları kurtarmak ve git "şube" den taahhüt


11

Git alt modülünde sahip olduğum bazı dosyalar üzerinde başka bir proje altında çalışmaya başladım. Ancak, git alt modülü olduğu için asla "usta" 'yı kontrol etmemiş ve bunun yerine sadece kafasını kontrol etmiş ve tüm dosyaları "dalsız" klasörüne yerleştirmiştir.

Şimdi bu dosyalarda tesadüfen bazı değişiklikler yaptığım için, projemin bir alt dalı olan "şubesiz" çalıştığımı fark ettim.

Bu dosyaları nasıl bir şubeye (usta gibi) alıyorum, böylece onları kurtarabilirim?

Yanıtlar:


27

git reflog"Kayıp" taahhütleri bulmak için kullanabilirsiniz :

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT

Evet, bu harika çalıştı! bir git merge $COMMIT_SHAkere yaptım dışında diğer şubedeydim.
Xeoncross

3

“Şube yok” durumuna bağımsız HEAD denir. Buna HEAD ref hiçbir şubeye bağlı olmadığı için denir, bunun yerine doğrudan bir taahhüdü işaret eder. HEAD'i, mevcut HEAD taahhüdünü işaret eden bir şubeye bağlamak için kullanın git checkout -b branchname.

HEAD'deki taahhütleri bu sıraya dahil etmek için mevcut bir şubeyi güvenle güncelleyebilirsiniz:

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

Veya, HEAD@{1}geçici olarak şube açmak zorunda kalmamak için reflog gösterimini kullanarak eşdeğerde :

git checkout branchname
git merge HEAD@{1}

Derhal birleştirme yapmayacaksanız geçici şubeyi kullanmak iyi bir fikir olacaktır.

HEAD'deki taahhüdün üzerine işaret etmek için mevcut bir şubenin üzerine zorla yazmak istiyorsanız kullanabilirsiniz git branch -f branchname && git checkout branchname. HEAD’deki taahhüdün geçerli dal adının ipucuna dayanmaması durumunda, bu genellikle kaçınmak istediğiniz dal adında hızlı bir şekilde ileriye doğru değişiklik yapılmamasına neden olur (yeniden yazma geçmişi olarak görülür).


Bu cevaba dikkat edin, HEAD'in hala şubede olmayan son taahhüdü işaret ettiğini varsayar. O zamandan beri HEAD'i hareket ettirdiyseniz ve ne olduğunu şimdi anladıysanız, reflog'daki bu kayıtsız bağlılığı aramanız gerekebilir (mipadi'nin cevabına bakınız).
Lars

1

Önceki cevaplara eklemek için:

Hala ayrılmış bir HEAD'deyken, bir etiket ekleyebilirsiniz:

git tag <some-tag>

Bu, taahhüde bir etiket ekler gitkve bu onu diğer araçlarda görünür kılar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.