Git'te bir dizi kaydetmeyi geri al


128

Git'te bir dizi taahhüdü nasıl geri alabilirim? Gitrevisions belgelerine baktığımda, ihtiyacım olan aralığı nasıl belirleyeceğimi göremiyorum. Örneğin:

A -> B -> C -> D -> E -> HEAD

Şunun eşdeğerini yapmak istiyorum:

git revert B-D

sonuç nerede olur:

A -> B -> C -> D -> E -> F -> HEAD

burada F, BD'nin tersini içerir.


Gitrevisions (7) sayfasının sonuna doğru "BELİRTİLEN ARALIKLAR" başlıklı bir bölüm bulunmaktadır. İstediğinizin orada anlatılanlardan farkı nedir?
Gareth McCaughan

2
Gitrevisions sayfası 'git revert A..D'nin istediğimi yapacağını gösteriyor. Ancak "ölümcül: 'A..D' bulunamıyor" hatasını almaya çalıştığımda
Alex Spurling

Yanıtlar:


174

Git'in hangi sürümünü kullanıyorsunuz?

Birden çok kaydetmeyi geri döndürme yalnızca Git1.7.2 + 'da desteklenir: Daha fazla ayrıntı için " Birden çok kez geri döndürmeyi kullanarak eski bir işlemeye geri dönme. " Konusuna bakın .
Mevcut kılavuz git revertsayfası yalnızca mevcut Git sürümü (1.7.4+) içindir.


As OP Alex Spurling yorumlarda raporlar:

1.7.4'e yükseltmek iyi çalışıyor.
Kendi sorumu yanıtlamak için aradığım sözdizimi şudur:

git revert B^..D 

B^"B'nin ilk üst kaydı" anlamına gelir: bu B, geri dönüşe dahil edilmesine izin verir . Örneğin sözdizimini içeren " REVİZYON BELİRLEME
" git rev-parsebölümüne bakın : daha fazlası için " Düzeltme işareti ( ) karakteri ne anlama geliyor? ")<rev>^HEAD^^

Geri alınan her kaydetmenin ayrı ayrı yapıldığını unutmayın.

Henrik N yorumlarda şöyle açıklıyor :

git revert OLDER_COMMIT^..NEWER_COMMIT

Aşağıda gösterildiği gibi, taahhütte bulunmadan hemen geri dönebilirsiniz:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"

1
Teşekkürler, cevap buydu. 1.7.4'e yükseltmek iyi çalışıyor. Kendi sorumu yanıtlamak için, aradığım sözdizimi bu: git revert B ^ .. D
Alex Spurling

deha. Teşekkürler. Yamaların uygulanması için taahhütleri ters sırada geri almam gerektiğini düşünmemiştim, ha. Bu komut yolu gösteriyor.
Tim Abell

5
Bu yanıta sık sık geri dönüyorum ve sırayı anlamam her zaman biraz zaman alıyor. Gelecekteki benliğime yardım etmek için:git revert OLDER_COMMIT^..NEWER_COMMIT
Henrik N

2
^ ne anlama geliyor?
Dustin Getz

1
@DustinGetz birinci ebeveyn: bkz. Git-scm.com/docs/gitrevisions : "Bir ^revizyon parametresinin son eki , bu commit nesnesinin ilk ebeveyni anlamına gelir".
VonC

15

Taahhüt aralığını B'den D'ye (en azından git sürüm 2'de) tek bir kaydetmede geri döndürmek istiyorsanız, şunları yapabilirsiniz:

 git revert -n B^..D

Bu, B'nin üst taahhüdünden (hariç tutulan) D taahhüdüne (dahil edilen) taahhütler tarafından yapılan değişiklikleri geri döndürür, ancak geri alınan değişikliklerle herhangi bir taahhüt oluşturmaz. Geri dönüş yalnızca çalışma ağacını ve dizini değiştirir.

Sonra değişiklikleri yapmayı unutmayın

 git commit -m "revert commit range B to D"

Aynı yöntemi kullanarak tek bir işlemede birden fazla ilgisiz kaydı geri döndürebilirsiniz. örneğin B ve D'yi geri döndürmek ama C'yi değil

 git revert -n B D
 git commit -m "Revert commits B and D"

Referans: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

Düzeltme için teşekkürler Honza Haering


3
git revert -n B..DB işlemini geri döndürmez, sadece C ve D git revert -n B^..Dde B'yi geri alır.
Honza Haering

git belgelerine göre yapar.
gönderideki

1
Referans kısmında bu örneğe (biraz kafa karıştırıcı olduğunu düşündüğüm) atıfta bulunursanız:, git revert -n master~5..master~2en son beşinci commit dahil edildiğini söylüyor. Ama master~5aslında en son 6. taahhüt. Gösterim hakkında ayrıntılı bilgi için git belgelerinde revizyon seçimine bakın ..:-)
Honza Haering

6

Yapmak git revert OLDER_COMMIT^..NEWER_COMMITbenim için işe yaramadı.

Ben kullandım git revert -n OLDER_COMMIT^..NEWER_COMMITve her şey güzel. Git sürümünü kullanıyorum 1.7.9.6.


Aynı sorunu yaşadım ve -n kullanarak düzelttim, ancak ^ ile OLDER_COMMIT (git revert -n OLDER_COMMIT ^ .. NEWER_COMMIT) bırakmalısınız.
FeelGood

@FeelGood neden ^ 'i bırakmalısınız?
Orlando

A -> B -> C geçmişim vardı ve hedef B ve C'yi geri döndürmekti. 'Git revert -n B..C' komutunu çalıştırdığımda, sadece C geri döndü. 'Git revert -n B ^ .. C' kullandığımda git her iki kaydetmeyi de geri aldı. Belki yanlış bir şey yaptım.
FeelGood

havalı, iyi test etmeliyim ama bence iyi çalıştı (lol 1 commit aralığını geri almadıysam) cevabı ^. teşekkürler
Orlando

2
-nYa --no-committek içinde aralığındaki tüm değişiklikler geri alınacak seçenek her aralıkta taahhüt için taahhüt yerine geri alma oluşturmak yerine, taahhüt. Nihai sonuç, olduğu gibi aynıdır, aynı değişiklikler geri alınacaktır. Git geçmişinin nasıl görünmesini istediğine bağlı.
Dennis

0

git rebase -iİlgili taahhütleri bir araya sıkıştırmak için kullanın . O zaman geri dönmek için sadece bir taahhüdünüz var.


7
Git rebase kullanıyorsanız, taahhütleri kolayca kaldırabilirsiniz. Bence, SHA1'in F işleminin aynı kalmasını istemek gibi, yeniden taban vermemek için bir neden var.
Paŭlo Ebermann

5
Alternatif olarak, geri alma işlemlerini bire sıkıştırın.
aeosynth
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.