'Git reset' nasıl geri alınır?


1312

Geri almanın en basit yolu nedir

git reset HEAD~

Komut? Şu anda aklıma gelen tek yol uzak bir depodan "git clone http: // ..." yapmak.


2
Donanım sıfırlamasının nasıl geri alınacağını arayan varsa Git sıfırlama işlemini geri alma - hard HEAD ~ 1 konusuna bakın . Çözümler çok benzer.


2
İle ilgili soruların bir kopyası değil --hard! Bu komutu yanlışlıkla çalıştırma riski çok daha yüksektir. Örneğin, ile tek bir dosyayı açmak istersiniz git reset foo-file. Dosya adının yalnızca ilk kısmını yazıyorsunuz, otomatik tamamlama için sekmeye tıklıyorsunuz, aslında bir şube adına tamamlanıyor, fark etmiyorsunuz ve git reset foo-branchbunun yerine komutu çalıştırıyorsunuz . Voilà
Yushin Washio

Yanıtlar:


2388

Kısa cevap:

git reset 'HEAD@{1}'

Uzun cevap:

Git tüm ref güncellemelerinin bir kaydını tutar (örneğin, ödeme, sıfırlama, taahhüt, birleştirme). Yazarak görüntüleyebilirsiniz:

git reflog

Bu listenin bir yerinde kaybettiğiniz taahhüt vardır. Diyelim ki yeni yazdınız git reset HEAD~ve geri almak istiyorsunuz. Reflogum şöyle görünüyor:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

İlk satır, HEAD0 konumun (başka bir deyişle geçerli konumun) 3f6db14 olduğunu; sıfırlanarak elde edildi HEAD~. İkinci satır HEAD1 pozisyon önce (yani sıfırlamadan önceki durumun) d27924e olduğunu söylüyor. Belirli bir taahhüdü kontrol ederek elde edildi (şu anda bu önemli değil). Sıfırlamayı geri almak için çalıştırın git reset HEAD@{1}(veya git reset d27924e).

Öte yandan, o zamandan bu yana HEAD güncellemesinden başka komutlar çalıştırırsanız, istediğiniz taahhüt listenin en üstünde olmaz ve reflog.

Son bir not: reflogSıfırlamak istediğiniz belirli şubeye bakmak daha kolay olabilir , deyin master yerine HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Bu, genelden daha az gürültü içermelidir HEAD reflog.


25
reflogBu amaçla daha görsel ve güzel bir alternatif olarak kullanmayı seviyorum git log --graph --decorate --oneline $(git rev-list -g --all). Adsız dalları sarkan da dahil olmak üzere tüm taahhütlerin bir ağacını gösterir
texasflood

1
Diyelim ki içinde varolan dosyaların bulunduğu bir dizin var. Bu dizinde çalıştırıyorum git initve hemen ardından git reset --hard. Reflog, hatta başlamak için herhangi bir günlük yok. Bu dosyalar hemen hemen tost mu?
AlanSE

@AlanSE, ne yazık ki bu dosyalar tost, bildiğim kadarıyla. Daha önce hiç yapmadıysanız git add(yani dosyanın bu sürümünü hiç sahnelemediyseniz), git checkoutya git reset --hardda yedeksiz tek kopyayı (çalışma dizini) havaya uçuracaktır. Keşke olmasaydı.
Mark Lodato

2
git reset HEAD~12ayy ... git reset HEAD@{12}nooo .. 'git reflog' kurtarmaya! oh sadecegit reset HEAD@{1}
Dennis

Mükemmel git-scm.com/blog/2011/07/11/reset.html git-reset makalesini okuduktan sonra , biraz daha az gizemliyim.
Andriy Drozdyuk

192

Eski soru ve gönderilen cevaplar harika çalışıyor. Yine de başka bir seçenekle gireceğim.

git reset ORIG_HEAD

ORIG_HEADHEADdaha önce atıfta bulunulan taahhüde referansta bulunur.


1
Bu harika görünüyor - ayrıntıya girebilir misiniz? Buradaki "ORIG", "orijinal" veya "orijin" için kısa mı? … Yani, maymuna başlamadan önce KAFA'nın bulunduğu yere sıfırlanıyor mu? Yoksa HEAD nereden geliyor? HEAD'ı daha önce birkaç kez hareket ettirdiyseniz ne olur git reset ORIG_HEAD? Teşekkürler.
Benjohn

ORIG orijinal anlamına gelir, ORIG_HEAD sıfırlamadan önce orijinal HEAD anlamına gelir
Sam Gallagher

"Birleştirme ve sıfırlama gibi bazı işlemler, HEAD'in önceki sürümünü ORIG_HEAD'e yeni bir değere ayarlamadan hemen önce kaydeder. ORIG_HEAD'i kullanarak önceki duruma geri dönebilir veya bir karşılaştırma yapabilirsiniz." Kitaptan alıntı: "Git ile Sürüm Kontrolü"
Amirreza

56

Durumum biraz farklıydı, git reset HEAD~üç kez yaptım .

Geri almak için yapmam gerekiyordu

git reset HEAD@{3}

yani yapabilmelisin

git reset HEAD@{N}

Ancak git reset komutunu kullanarak

git reset HEAD~3

yapmanız gerekecek

git reset HEAD@{1}

{N}, Reflog'daki işlem sayısını temsil ettiği için. Mark'ın belirttiği gibi.


2
Kabul edilen seçenek ileri gitme örneği sağlamaz NI bir saat önce 1'den fazla iletmek istediğim bir durumdaydı. Çoklu ile denedim ve çalıştı. Bunu buraya eklemek istedim. Git reset HEAD ~ 3 ile geri
almayı

3
ancak bazıları git reset HEAD ~ 3 yaptıysa, hızlı bir şekilde nasıl geri alınacağını görebilir, git reset HEAD @ {3}, reflog girmeden gereklidir git reset HEAD ~ 3 vb. yaygın bir durumdur
zainengineer

1
{1} / {2} 'i gören herkesin, sayının reflogkomutun size sağladığı herhangi bir revizyon numarası olabileceğini anlayacağını düşünüyorum . Sayılar hakkındaki görüşünüzün ~ 3 / @ {3} yönlerinin her ikisi için de aynı olduğunu kabul etti, ancak gerçekten yeni bir yanıt olması gerekmedi.
Clint

30

1.Tüm git reflogreferans güncellemelerini almak için kullanın.

2.git reset <id_of_commit_to_which_you_want_restore>

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.