Git Reset'ten kurtarılsın --hard?


457

Bir çalışma dizinde taahhüt edilmemiş değişiklikleri kurtarmak için herhangi bir yolu var mı git reset --hard HEAD?


49
Öğrenmemenizi tavsiye ederim git reset. Bu komuta ihtiyacınız yok ve tehlikeli, bu yüzden kullanmayın. Şubeyi önceki taahhüdüne geri döndürmek git rebase -ive istemediğiniz taahhütleri düşürmek veya şube ucunu hareket ettirmek için git checkout(başını ayırır) git branch -M. Birincisi yerel değişikliklerle çalışmayı reddeder ve daha sonra yalnızca yerel olarak değiştirilmiş dosyalar revizyonlar arasında farklılık göstermezse çalışır.
Jan Hudec

11
@Ona inanmıyorum. Sıfırlamayı kullanmak için mükemmel yasal nedenler vardır.
spaaarky21

4
@ spaaarky21: Evet, var. Ama git reset --hard somewheregerçekten tehlikeli git komutlarından biridir.
Jan Hudec

5
@ Kabul edebilir miyim ama tehlikeli olmak onu kullanmamanız gerektiği anlamına gelmez. Sadece ne yaptığınızı bilin ve dikkatli olun. :)
spaaarky21

3
Git sıfırlama geri alma ile ilgili değil - HEAD ~ 1 , çünkü burada orijinal poster taahhüt edilmemiş değişiklikleri kurtarmaya çalışıyor.

Yanıtlar:


477

Sen olamaz genelde kaydedilmemiş değişiklikleri geri almak.

Önceden sahnelenen değişiklikler ( git add) dizin nesnelerinden kurtarılabilir olmalıdır, bu nedenle bunu yaptıysanız, git fsck --lost-foundkendisiyle ilgili nesneleri bulmak için kullanın . (Bu, nesneleri .git/lost-found/dizine yazar ; oradan git show <filename>her dosyanın içeriğini görmek için kullanabilirsiniz .)

Değilse, buradaki cevap şu olacaktır: yedeklemenize bakın. Belki editör / IDE'niz geçici kopyaları / tmp veya C: \ TEMP altında saklar ve bunun gibi şeyler saklar . [1]

git reset HEAD@{1}

Bu önceki HEAD'a geri dönecek

[1] vim örneğin isteğe bağlı olarak kalıcı geri almayı depolar , eclipse IDE yerel geçmişi depolar ; Bu tür özellikler,


18
Eclipse'nin yerel geçmişi - ve ayrıca, bazı değişiklikler 6 günden daha eski olduğu için, Eclipse'nin yerel geçmişindeki Time Machine yedeklemem! Nedense git tarafından yönetilen klasörün Time Machine yedeklemesi önceki değişiklikleri içermiyordu.
christianbrodbeck

2
Sen gerçekten ipucu bir hayat kurtarıcısın! TextWrangler'da dosyaların yedeği vardı. Teşekkür ederim
Vivek Sampara

6
IDE (IntelliJ), günü kurtaran değişiklikleri yerel olarak sakladı. Bahşiş için teşekkürler!
progonkpa

1
Vay canına, bu harika. Hiç bir taahhütte bulunmamış olsanız bile çalışır.
Boudewijn Aasman

2
Gerçekten de Eclipse'deki yerel tarih (benim durumumda Intellij), işten çıkarılmamış değişiklikleri kurtarma konusunda günümü kurtardı, Intellij için doktor: blog.jetbrains.com/idea/2008/01/…
Richard

449

bu SO cevap

$ git reflog show
93567ad HEAD@{0}: reset: moving to HEAD@{6}    
203e84e HEAD@{1}: reset: moving to HEAD@{1}    
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug

# said the commit to be recovered back is on 9300f9d (with commit message fix-bug)
$ git reset HEAD@{7}

Günün geri döndü! :)


24
Sadece bu cevaba eklemek için, gerçekte sıfırlama yoluyla atılan değişiklikler yapan insanlara yardımcı olur.
murki

9
Harika - ama benim durumumda dosyalar tamamen kayboldu. Kullanmak git checkout HEAD@{19}, kayıp dosyaları müstakil durumda kontrol etmeme izin verdi. Daha sonra git checkout -b new-branch-namebunları "ekli" durumda repoya geri eklemek için kullanılır .
NightOwl888

@ NightOwl888: Git newbie buraya ve dosyalarımın hala gitmiş olduğu sorunu yaşadım. Dosyalarınızı "ekli" duruma nasıl kurtardığınızı daha ayrıntılı açıklar mısınız (ya da bunun gerçekte ne anlama geldiğini açıklar mısınız?)? Çok teşekkür ederim!
OhDaeSu

3
@ user3385759 - Git'te, şube olmayan bir şeyde ödeme komutunu kullandığınızda özel bir "ayrılmış kafa" moduna geçecektir. Bu, aslında bir şubeye işaret etmediğiniz anlamına gelir, ancak varlığın durumunda nelerin teslim edildiğini görebilirsiniz (bu durumda bir reflog girişi). Bu durumdan, onu kullanarak tekrar geri dönebileceğiniz "gerçek" bir şubeye dönüştürebilirsiniz git checkout -b new-branch-name. Pragmatik Sürüm Kontrolü Git'i kullanma kitabı Git'i basit terimlerle açıklamakta iyidir.
NightOwl888

2
Evet, NomNomCameron ve Jesse Adelman ne dedi. Sıfırlamanın son işlemime sıfırlanacağını düşündüm. Hayır! Her şeyi sildi. Bu cevap beni bir ya da iki gün içinde işimi yeniden yaratmamdan kurtardı.
VeteranCoder

308

git reset --hardBugün de talihsiz değişiklikler yaparken, bugün de repo'mda koştum . Geri almak için, git fsck --lost-foundtüm referanssız lekeleri yazan koştum <path to repo>/.git/lost-found/. Dosyalar taahhüt edilmediğinden, onları içindeki otherdizinde buldum <path to repo>/.git/lost-found/. Oradan, kullanılmayan dosyaları görebilir git show <filename>, lekeleri kopyalayabilir ve yeniden adlandırabilirim.

Not: Bu yalnızca dizine kaydetmek istediğiniz dosyaları eklediyseniz (kullanarak git add .) çalışır. Dosyalar dizinde bulunmamışsa, kaybolurlar.


4
Sadece içinde taahhüt başvuruları olan dosyalar var lost-found. Ama sonra git showiçeriği almak için yapabilirdim .
Mitar

6
Sadece kimseyi kurtarmak için#!/bin/bash cd PATH_TO_PROJECT/.git/lost-found/other FILES=* COUNTER = 0 for f in $FILES do echo "Processing $f file..." git show $f > "PATH_TO_RECOVERY_DIRECTORY/$COUNTER.m" let COUNTER=COUNTER+1 done
rwolst

210

Evet, git'teki donanım sıfırlamasından KURTARABİLİRSİNİZ.

kullanın:

git reflog

Taahhüdünüzün tanımlayıcısını almak için. Sonra kullan:

git reset --hard <commit-id-retrieved-using-reflog>

Bu numara hayatımı birkaç kez kurtardı.

Reflog belgelerini BURADA bulabilirsiniz .


9
Şimdiye kadar, bunun en iyi ve en özlü cevap olduğunu düşünüyorum. Bir git reset --hardbaşkasını kullanmaktan kurtarmak için sezgisel görünebilir, git reset --hardancak --hardanahtarı kullanmazsanız , çalışma alanınızda az önce kurtardığınız işi etkili bir şekilde geri alacak girişlerle kalırsınız.
Ryan

2
Tıkır tıkır çalışıyor! Önceki cevap ( stackoverflow.com/questions/5788037/recover-from-git-reset-hard/… ) benim için işe yaramadı.
codemax

3
Bu cevap doğru değil. Bu yaklaşım yalnızca önceden taahhüt edilen değişiklikleri kurtarır . Taahhütsüz değişiklikleri geri yükleyemez (bu sorunun konusu budur).
Alderath

2
Bu çözümler benim için çalışıyor. Donanımdan sıfırlama yaptım ve sonra kullandığımda git logişlemin kimliğini görmedim. git reflogBen ile taahhüt kimliği görebiliyordu
dboscanv

2
bu benim için çalışıyor. Teşekkürler!!!!!!
RedEyed

60

Yerel bir proje üzerinde çalışırken, onu GitHub'a taşımak istedim ve sonra yeni bir depo oluşturdum. Tüm bu dosyaları .gitignore ile yeni depoya eklemeye çalışırken, yanlışlıkla yanlış bir dosya ekledim ve sonra temizlemeye çalıştım.

Koştum git reset --hard origin/master : P

Daha sonra depo boş olduğu için tüm yerel dosyalarım silindi. Her şeyin gittiğini sanıyordum.

Bu hayatımı kurtardı:

git reflog show
git reset HEAD@{1} 
git push 

Umarım başka bir hayat kurtarır.


Benim için öyleydi git reset HEAD@\{27\} , teşekkür ederim!
4oby

1
Sıfırlamak için 7 taahhüdüm var, git reflog showkontrol etmek için kullanıyorum ve kullandığım ilk taahhüttengit reset HEAD@{number}
Vishwas Nahar

38

IntelliJ gibi bir şey kullanıyorsanız:

Bağlam menüsünde Yerel Geçmiş'i seçin ve alt menüden Geçmişi Göster'i tıklatın:

Bir proje veya klasörün yerel geçmiş görünümü, son birkaç gün içinde yaptığınız her şeyi gösterir. İletişim kutusunun alt kısmındaki İşlem sütununda, geri almak istediğiniz eylemi seçin. [...] Böylece, iletişim kutusunun üst kısmı değiştirilen dosyaların ağaç görünümünü gösterir. Yalnızca silinen dosyayı geri yüklemek isterseniz, o zamandan beri yapılan diğer değişikliklere bakılmaksızın, ağaç görünümünde Lost.txt dosyasını seçip Geri Al düğmesini tıklayabilirsiniz.

http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/

Bu sadece kıçımı ateşten çıkardı!


Bu IntelliJ kullanıcıları için açık ara en iyi cevap! Çok teşekkür ederim, bu mükemmel çalıştı. Diğer her çözümü denedim ve hiçbiri iyi çalışmadı. git reflogişe yaramadı çünkü değişiklikleri yapmadım. git fsck --lost-foundaşamalı dosyalar için çalıştı ancak hepsi sahnelenmedi. IntelliJ'in Yerel Geçmişi kaydedilmemiş dosyalarımı mükemmel bir şekilde kurtardı, bu özellik için çok minnettarım
Denes Papp

30

git reset --hardTaahhütsüz değişikliklerimi yeni yaptım ve kaybettim. Neyse ki, bir editör (IntelliJ) kullanıyorum ve değişiklikleri Yerel Geçmişten kurtarabildim. Eclipse aynısını yapmanıza izin vermelidir.


20

Tanım olarak, git reset --hard Git'in onları kurtarması için taahhüt edilmemiş değişiklikleri atar (yedekleme sisteminiz yardımcı olabilir, ancak Git değil).

Aslında, git reset --hard iyi bir fikir . Çoğu durumda, aynı şeyi yapmak için daha güvenli bir komut vardır:

  • Taahhütsüz değişikliklerinizi atmak istiyorsanız, kullanın git stash. Çalışırsanız bir süre sonra sona erecek olan bu değişikliklerin bir yedeğini tutar git gc. % 99,9'dan bu değişikliklere asla ihtiyacınız olmayacağından eminseniz,git stash % 0,1 vakası için hala arkadaşınızdır. % 100 eminseniz, o git stashzaman hala arkadaşınız çünkü bu% 100'ün bir ölçüm hatası var ;-).

  • HEADTarihte mevcut dalın ve ipucunuzu taşımak istiyorsanız , o zaman git reset --keeparkadaşınızdır. Aynı şeyi git reset --hardyapacak, ama yapacak değil yerel değişiklikleri atmak.

  • Her ikisini de yapmak istiyorsanız, o zaman git stash && git reset --keep , arkadaşınızdır.

Parmaklarınızı kullanmamayı öğretin, git reset --hardbir gün geri ödeyecek.


eğer git stash && git reset --hardherhangi biri saklanmış herhangi bir içeriği silecekse bu doğru mu?
jxramos

1
Hayır, git reset --hardzulayı atmaz. git stashyerine geçer git reset --hardo yerine kalıcı olarak atarak onları güvende tutan dışında sizin worktree gelen uncommited değişiklikleri kaldırır anlamında.
Matthieu Moy

ya da sadece sert sıfırlamadan önce değişikliklerinizi yapın ve yine de yerel repolarınızda
olacaklar

11

bir taahhüdü yanlışlıkla sıfırlarsanız, bunu yapın,

git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case

HEAD@{2}geri dönmek istediğiniz durum olduğunu varsayarsak


PowerShell üzerinde bunu yaparsanız bu benim için mükemmel çalıştı, bu git reset 'HEAD @ {2}' gibi yazdığınızdan emin olun aksi takdirde powershell'de çalışmaz
VectorX

10

Bazı değişiklikleri kaybedersem genellikle bunu yaparım.

git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...

işaretçiyi önceki işlemlerinize geri taşımak, ancak şu ana kadar yaptığınız değişiklikleri son işlemlerinizin kasasında saklamak için git reset --soft dadada


8

Bilgiler kaybolur.

Taahhüt yapmadığınız için .git'iniz bu bilgileri hiçbir zaman saklamadı. Yani, temel olarakgit sizin için kurtaramaz.

Ancak, yeni yaptıysanız git diff, aşağıdaki 3 basit adımla terminal çıkışını kullanarak kurtarmanın bir yolu vardır.

  1. terminalinizi kaydırın ve o / p tuşunu arayın git diff. O / p'yi diff.patch adlı bir dosyaya kaydedin
  2. 7 boşluk ve 8 boşluğun tümünü sekme (\ t) karakteriyle değiştirin ve değiştirin.
  3. Git deponuza git. Diff.patch ( patch -p1 < diff.patch) yöntemini uygulayın

Kurtarıldınız! :)

Not: Verileri terminalden bir dosyaya kopyalarken, dikkatli olun ve verilerin sürekli çıktı olduğunu ve artık veri içermediğini (yukarı ve aşağı oklara basması nedeniyle) açıkça görün. Aksi takdirde dağıtabilirsin.


7

Ben aynı sorunu koştu ve neredeyse deli gidiyordu .... başlangıçta projeyi taahhüt ve birleştirilmiş .. daha sonra ben çalışmayı denediğimde git push --set-upstream origin master bu hatayı alıyorum

  fatal: refusing to merge unrelated histories

bu yüzden koştu git reset --hard HEADve 3 hafta proje sildi ama aşağıdaki birkaç komut gün kurtarmak:

git reset HEAD@{1}         //this command unstage changes after reset
git fsck --lost-found      //I got the dangling commit fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
git show <dangling commit something like-> fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b>
git rebase fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b

Bu yardımcı olur umarım


6

Yaptıktan sonra bir taahhüt geri alabilirsiniz reset --hard HEAD .

" git reflog" Öğesinin geçmişini kontrol etmek için kullanınHEAD .

Burada taahhüdünüzü ve kimliğini göreceksiniz.

Yapın

git reset {commit Id of the commit you want to bring back}

5

Neyse ki aynı dosyaları başka bir düzenleyicide açtıysanız (örn. Sublime Text) bunlarda bir ctrl-z deneyin. Beni kurtardı ..


3

git reset --hard <commit>Git geçmişinden kaldırılmadan önce herhangi bir taahhüt edilmemiş dosyanın zor yolunu öğrendim . Ancak, saçımı çektiğim süre boyunca kod düzenleyici oturumumu açık tutacak kadar şanslıydım control + z, etkilenen dosyaların her birinde basit bir dosyanın Git'ten önceki sürüme geri döndüğünü keşfettim. özellikle istemediğim her şeyi sıfırlayarak sıfırlayın.Hooray!!


3

Aşağıdaki kodu kullanmaya çalışıyorsanız:

git reflog show
# head to recover to
git reset HEAD@{1} 

ve bazı nedenlerden dolayı:

hata: bilinmeyen anahtar `e '

sonra HEAD@{1}tırnak içine almayı deneyin

git reset 'HEAD@{1}'

3
 git reset HEAD@{4}

4, 4 adımdan önce yapılan değişikliklerdir. doğru bir adım seçerseniz, zordan kaldırdığınız dosyaların listesini göstermelidir. o zaman yap:

$ git reflog show

size önceden oluşturduğumuz yerel taahhüt geçmişini gösterecek. Şimdi yap:

$ git reset --hard 8c4d112

8c4d112, sabitinizi sıfırlamak istediğiniz bir koddur. daha fazla bilgi almak için https://www.theserverside.com/video/How-to-use-the-git-reset-hard-command-to-change-a-commit-history adresine bakalım .


@Mohammad, çok teşekkürler beni kurtardı. Kaynak dosyalarımı daha önce göremedim, ancak yukarıdaki adımları izleyerek tüm kaynak dosyalarımı kurtarabildim.
Gaurav Bansal

2

Doğru cevap. Tamam, şimdi gitmeyi seviyorum. :-) İşte daha basit bir tarif.

git log HEAD@{2}
git reset --hard  HEAD@{2}

"2", değişikliklerinizi taahhüt ettiğiniz yere geri dönüş sayısıdır. Benim durumumda, meslektaşım ve patron tarafından bazı inşa sorunlarının ayıklanmasına yardımcı olmak için kesintiye uğradı; böylece, bir sıfırlama yaptı - iki kez sert; yani HEAD ve HEAD @ {1} aşırı yazılmıştır. Vay be, bizim çok çalışmamızı kaybederdi.


2

yaptım git reset --hard yanlışlıkla yanlış proje (biliyorum ki ...) üzerinde. Sadece bir dosya üzerinde çalışmıştım ve komutu çalıştırdığım sırada ve sonrasında hala açıktı.

Taahhüt etmemiş olsam da, eski dosyayı basit ile geri alabildim COMMAND + Z.


0

Bu SO'dan referans cevap,

Git reflog show çalıştırdıktan sonra 9300f9d taahhüt etmek istediğinizi söyleyin

git reset çalıştırdıktan sonra 9300f9d

git durumunu yapabilirsiniz ve ardından değişikliklerinizi geri yüklemek için dosyalarınızı kontrol etmeniz gerekebilir

git checkout - dosyayolu / adı


0

Netbeans üzerinde geliştiriyorsanız, dosya sekmeleri ve dosya düzenleme alanı arasında arayın. Bir "Kaynak" ve "Tarih" vardır. "Geçmiş" te, sürüm kontrolü (git / other) kullanılarak yapılan değişiklikleri ve aynı zamanda yerel olarak yapılan değişiklikleri görürsünüz. Bu durumda, yerel değişiklikler sizi kurtarabilir.


0

( cevap bir kullanıcı alt kümesine uygundur )

(Son zamanlarda) macOS kullanıyorsanız ve Time Machine diskinizden uzakta olsanız bile, işletim sistemi yerel anlık görüntüler adı verilen saatlik yedeklemeler kaydetmiş olacaktır .

Time Machine'e girin ve kaybettiğiniz dosyaya gidin. İşletim sistemi size şu soruları soracaktır:

The location to which you're restoring "file.ext" already contains an
item with the same name. Do you want to replace it with the one you're
restoring?

Kaybettiğiniz dosyaları kurtarmanız gerekir.


0

Aynı kodla açık bir IDE'niz varsa, değişiklik yaptığınız her dosyada bir ctrl + z yapmayı deneyin. Git reset yaptıktan sonra değişmeyen değişiklikleri kurtarmama yardımcı oldu - sert.


-3

Git reset --hard yaptığımızda ve tüm yerel işlem dışı değişiklikler silinir. Değişiklikleri geri almak için - IDE'de dosyayı tıklatın, dosyayı tarihe göre listeleyen Yerel geçmiş ile karşılaştırın ve verileri kurtarabiliriz. Günün kurtuldu!


1
Bu cevap önceki iki cevabı tekrarlar.
isherwood
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.