Halka açık bir depoda eski bir Git taahhüdüne geri dönüş


802

Git'teki belirli bir işleme geri dönmeyi nasıl başarabilirim ?

Birinin bana verebileceği en iyi cevap git revert, istenen işleme ulaşana kadar X kez kullanmaktı .

Diyelim ki 20 taahhütlü bir taahhüdüne geri dönmek istiyorum, 20 kez çalıştırmak zorunda kalacağım.

Bunu yapmanın daha kolay bir yolu var mı?

Bu depo herkese açık olduğundan sıfırlamayı kullanamıyorum.


1
git revert <komut> çalışmıyor?
miku

8
Sorumda belirtildiği gibi, 20 taahhüt önce bir şeye geri dönmek isterseniz bu gerçekten bana yardımcı olmaz.
David


4
"Geri dönme" ile ne demek istediğiniz açık değil. Bu, çalışma kopyanızı geçici olarak belirli bir düzeltmeye geçirmek istediğiniz anlamına mı geliyor? Ya da deponuzun geçmişini kalıcı olarak belirli bir düzeltmeye mi döndürmek istiyorsunuz?

1
Bir cevabı kabul etmeli ve muhtemelen istediğiniz diğer cevapları oylamalısınız.
Nabil Kadimi

Yanıtlar:


1194

Bunu dene:

git checkout [revision] .

[revision]taahhüt karması nerede (örneğin:) 12345678901234567890123456789012345678ab.

.Sonunda unutmayın , çok önemli. Bu, tüm ağaca değişiklikler uygulayacaktır. Bu komutu git proje kökünde yürütmelisiniz. Herhangi bir alt dizindeyseniz, bu komut yalnızca geçerli dizindeki dosyaları değiştirir. Sonra taahhüt edin ve iyi olmalısınız.

Bunu şu şekilde geri alabilirsiniz:

git reset --hard 

çalışma dizinindeki ve hazırlama alanındaki tüm değişiklikleri siler.


7
@AlexReisner Şu anda bulunduğunuz dizinin bitiş noktalarındaki bu süre, tüm git projesi olması gerekmiyor, doğru mu? Değişiklikleri tüm projeye uygulamak istiyorsanız, şu anda git proje kökünde olmasaydınız 'git add: /' gibi ': /' kullanır mıydınız?
MSpreij

10
not: o zamandan beri projenize yeni dosyalar eklediyseniz, bunlar silinmez. Bu yüzden derlemeye gittiğinizde (platformunuza bağlı olarak), yine de hatalar alabilirsiniz. Yeni dosyaları silin ve hazırsınız.
TheWestIsThe ...

6
@MSpreij Bu komutu git proje kökünde yürütmelisiniz. Herhangi bir alt dizindeyseniz, bu komut yalnızca geçerli dizindeki dosyaları değiştirir.
volatilevar

3
Başka bir dizinde bir projeyi klonlamak ve git checkout [revizyon] kullanmak harika. belirli bir düzeltmeye geri dönüp başka bir dizindeki aynı projeyle karşılaştırmak için. epeyce zaman kazandırır.
Donato

4
Damnit, "unuttum". depomda ne gibi hasarlar aldım?
Baykuş

196

Belirli bir işleme geri dönmek için:

git reset --hard commit_sha

10 geri almak için:

git reset --hard HEAD~10

Geçmişi yeniden yazmak istemiyorsanız "git revert" ifadesini aşağıdaki gönderideki gibi kullanabilirsiniz

Git deposunu önceki bir işleme nasıl geri alabilirim?


4
bu yaklaşım ile "git checkout [revizyon]" arasındaki fark. ikincisinin revizyonları korumasıdır.
deeshank

53
OP özellikle "Bu repo herkese açık olduğundan sıfırlama kullanamıyorum" ifadesini kullandığı için bu cevap YANLIŞ
Yarin

4
Repo kamuya açıksa, geri itmeden önce değişiklikleri çeken insanları etkileyeceğinden, zorla basma (git push -f) kullanmadan kamu deposundaki taahhüdü geri almanın bir yolu olmadığını düşünüyorum. Bu nedenle, sıfırlama, genel bir deponun yerel sanal alanında da kullanılabilir.
Naga Kiran

4
Bunun müstakil bir KAFAYI önlemesi harika! Tam da aradığım şey.
cyber-monk

1
Benim durumumda bu çalıştı, sonra regresyonlar, vb test ettikten sonra başa geri ileri gitmek için 'git pull' kullanın.
Peter Quiring

86

Sanırım soru şu, 'geri almak' ile ne demek istiyorsun? Eğer can Değilse resetkamu ve sen bozulmamış tarihini işlemek tutmak istiyorum, çünkü sen sadece çalışma kopyası belirli taahhüt yansıtmak için istediğiniz demek? Kullanım git checkoutve taahhüt karması.

Düzenleme: Yorumlarda belirtildiği gibi kullanarak git checkout belirtildiği gibi, bir şube belirtmeden "şube yok" durumunda bırakacaktır. git checkout <commit> -b <branchname>Bir şubeye git checkout <commit> .ödeme yapmak veya geçerli şubeye ödeme yapmak için kullanın .


Bu sizi şu anda garip 'Şu anda herhangi bir şubede değil' durumuna sokmuyor mu? Geri alma işlemini tamamlamak için değişiklikleri nasıl yaparsınız?
Alex Reisner

Sadece kullanımını öneriyorum git checkout- istediği herhangi bir şubeye (şu anki veya yeni) bakmakta özgür. Yanıtımı güncelleyeceğim, bu yüzden belirsiz değil.
Ben

2
Bunu denedim ama bu durgun dosyaları bırakır neden bunu yapmak için uygun bir yol olduğunu sanmıyorum. Bu, son işlemde bulunmayan dosyaları silmez.
David

3
Çalışan bir dizindeyseniz ve master'da kalıyorsanız, git resetyapmak istemediğinizi söylediğiniz dosyaları silmeniz gerekir . Ayrı bir dalda yapmayı deneyin: o daldagit checkout <commit> -b <branchname> durgun dosyalarınız olmaz .
Ben

2
Kullanmayla ilgili sorun, checkoutönceki bir işlemde eklenen dosyaları silmemesidir.

42

Orijinal afişin belirtileri:

Birinin bana verebileceği en iyi cevap git revert, istenen işleme ulaşana kadar X kez kullanmaktı .

Diyelim ki 20 taahhütlü bir taahhüdüne geri dönmek istiyorum, 20 kez çalıştırmak zorunda kalacağım.

Bunu yapmanın daha kolay bir yolu var mı?

Bu repo herkese açık olduğundan sıfırlama kullanamıyorum.

git revertX kez kullanmak gerekli değildir . git revertbir taahhüt aralığını argüman olarak kabul edebilir, bu nedenle bir dizi taahhüdü geri almak için yalnızca bir kez kullanmanız gerekir. Örneğin, son 20 işlemi geri almak istiyorsanız:

git revert --no-edit HEAD~20..

Aralık taahhüt HEAD~20..kısaltması HEAD~20..HEADve araçlar "20 başlatmak inci HEAD ebeveyn taahhüt ve ondan sonra yukarı HEAD tüm hareketin geri".

Bu, bunların hiçbirinin birleştirme taahhüdü olmadığını varsayarak , son 20 taahhüdü geri alacaktır . Birleştirme taahhütleri varsa, hepsini tek bir komutta geri alamazsınız, bunları tek tek geri almanız gerekir.

git revert -m 1 <merge-commit>

Ayrıca git revertgit sürüm 1.9.0 kullanarak bir aralık kullanarak test ettik unutmayın . Git'in eski bir sürümünü kullanıyorsanız,git revert veya işe yarayabilir.

Bu durumda, git reverttercih edilir git checkout.

Kullanmayı söyleyen bu cevabıngit checkout aksine , git revert geri döndürdüğünüz taahhütlerin herhangi birine eklenen dosyaları gerçekten kaldıracağını unutmayın , bu da bunu bir dizi düzeltmeyi geri almak için doğru yol yapar.

belgeleme


Not : bu , geri döndürülen değişikliklerle yeni bir taahhüt oluşturur . OP sorusu için mükemmel. Ama bunun istediğinden emin ol. ( Git-revert belgesinde yukarıdaki bağlantılı örnekler mükemmeldir.) Bunun yerine önceki taahhütleri araştırmak istiyorsanız (yani geri dönme taahhüdünü seçmeden önce) diğer cevaplarda belirtilen ödeme seçeneğini göz önünde bulundurarak diğer cevaplarda belirtin silinen dosyalar hakkında yapılmış.
SherylHohman

@SherylHohman Önceki bir taahhüde geri dönmek yeni bir taahhüt oluşturmaz. Burada ne demek istediğini hayal edemiyorum.

27

1.Adım: Taahhütlerin listesini getir:

git log

Bu örnekteki gibi bir liste alacaksınız:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

2.Adım: Gerekli kesin karmayı kopyalayın ve ödeme için yapıştırın:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

Bu kadar.


11
git read-tree -um @ $commit_to_revert_to

yapacağım. Bu "git checkout" ama HEAD güncellemeden.

İle aynı etkiyi elde edebilirsiniz

git checkout $commit_to_revert_to
git reset --soft @{1}

uygunluk komutlarını birlikte dizmeyi tercih ederseniz.

Bunlar, çalışma tablonuzu ve dizini istediğiniz durumda bırakır, sadece git commitbitirebilirsiniz.


Bu bir cazibe gibi çalışan tek basit yaklaşım! Başından kontrol ettim, bu komutu çalıştırdım ve tanıttığımız eklenmiş dosyaları başarıyla kaldırdım ve tüm değişiklikleri geri aldım. Mükemmel.
kamranicus

6

HEAD müstakil modunu mu istiyorsunuz?

X zamanını DETACHED HEAD (belirli bir şeyle uğraşamayacağınız anlamına gelir) ile belirli bir taahhüde geri döndürmek istiyorsanız, elbette aşağıdakileri kullanın:

(X'i kaç tane geri gitmek istediğinizle değiştirin)

git checkout HEAD~X

IE bir taahhüt geri gitmek için:

git checkout HEAD~1

1
Bu kısmı ... inanması zor ... ile kaldırırdım. Kişisel görünüyor ve ayrıca biri de yukarıdaki yorumda ve onun cevabında @ken'den bahsetti.
meJustAndrew

@meJustAndrew SO, sadece insanları şaşırtan çok fazla cevap, oldukça sinir bozucu.
Karl Morrison

Ne kadar basit ve basit bir cevap.
Ammad

2

Diyelim ki bir proje üzerinde ve bir gün sonra çalışıyorsunuz. Bir özelliğin hala hata verdiğini fark ettiniz. Ancak hataya neden olan hangi değişikliği yaptığınızı bilmiyorsunuz. Bu yüzden önceki çalışma taahhütlerini avlamak zorundasınız. Belirli bir taahhüde geri dönmek için:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Tamam, böylece taahhüt sizin için çalışıyor. Başka hata yok. Sorunu tespit ettiniz. Şimdi son işleme geri dönebilirsiniz:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

Ve hataya neden olmadan belirli bir dosyayı kullanıma alma (benim durumumda örnek Gemfile.lock kullanıyorum):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

Ve bu, daha sonraya kadar hataları fark etmeden taahhütlerde oluşturduğunuz hataları ele almanın bir yoludur.


2

Her işlemle ilgili işlem kimliğini GitHub / BitBucket / Gitlab'ın işlemlerin bölümünde bulabilirsiniz. Çok basit, taahhüt kimliğinizin 5889575 olduğunu varsayalım, kodunuzda bu bölüme geri dönmek istiyorsanız,

git checkout 5889575 .

Bu sizi kodunuzdaki o zamana götürecektir.


1

Neyin değiştiğinden emin değilim, ancak seçenek olmadan belirli bir taahhüdü kontrol edemiyorum --detach. Benim için çalışan tam komut şuydu: git checkout --detach [commit hash]

Ayrılmış durumdan geri dönmek için yerel şubemi kontrol etmek zorunda kaldım: git checkout master


Kontrol etmek master, çalışırken git reset --hardya git checkout -- .da çalışmışken müstakil kalma problemini çözer ama müstakil olarak
kalır

0

İşte bunu yapmak için bir örnek

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .
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.