2012-05-02 13 views
41

Bu önemli bir sorun değil, yalnızca bir şey olup olmadığını bilmek istiyorum.Tek bir işlemin parçası olarak birden fazla taahhüt nasıl geri dönülür

Diyelim ki, iki bitişik var, abcd123 ve wxyz789, bitişik olmayan ayrı yerlerde, bir repo'nun geçmişinde geri. Şimdi onları geri almak istediğimizi söyleyelim.

git revert abcd123 wxyz789 

Doing bir abcd123 geri alınması ve diğer wxyz789 döndükten sonra, iki ayrı kaydedilmesini neden olacaktır.

Hepsi iyi ve iyi, ama ya iki düzeltmede düzeltmek istediğimiz hatalar mantıksal olarak bağlantılıysa ve kendi kendini belgelemenin amaçları için tek bir "" tek bir işlem yapmayı istersek "Ben şimdi bir şey kırdı şimdi dosyaları x, y ve z "yorum? Bunu yapan git komutu var mı?

(. Ben sadece manuel tüm değişiklikleri düzeltmek ve daha sonra itme nerede bir taahhüt oluşturmak mümkün olduğunu elbette farkındayım Bu, tüm obbious nedenlerle acı verici.)

+0

[Revert multiple git commits] 'nin olası kopyası (http://stackoverflow.com/questions/1463340/revert-multiple-git-commits) –

+0

Bu iş parçacığı gördüm. Bu ile arasındaki fark, Bill'in HEAD'den birden fazla dosyayı geri almayı umuyor olması. Benim taahhütlerim "bir repo tarihine kadar olmayan bitişik, ayrı yerlerde" meydana gelir. – JimmidyJoo

+1

Yine de, seçilen cevabı yeniden okumak istediğimi bana veriyor. İhtiyacım olan şey ... So ... Varlığımdan silinecek sorumu nasıl aday gösterebilirim ?! – JimmidyJoo

cevap

52

Sen yapabilirsiniz:

git revert abcd123 
git revert --no-commit wxyz789 
git commit --amend 

... ve sonra her iki bileşenin de geri döndürülmesinin birleşik etkisini açıklayan uygun bir işlem iletisi yazınız.

+0

Bu, 2'den fazla taahhütle çalışacak mı? –

+0

@ AntonI.Sipos evet, istediğin kadar. – Trufa

+17

Daha ayrıntılı: 'git revert abcd123 wxyz789 --no-commit' ' git commit' – rmp251

29

Birbirini değiştiren karmaşık geri dönüşlerde, revert --no-commit sorunlu olabilir.

Benim basit bir çözüm, gerçek geri alma yapmak oldu ve kabak: sonra

git revert <all commits> 
git rebase -i 

Ve tek işlemek oluşturmak için, ilki hariç squash gibi tüm döner işaretleyin.

+0

Bu çözümü çok beğeniyorum! – monokrome

+1

+1. Git öğrenenler için: 1. Ne gibi ödevler hakkında biraz bilgi edinin, 2. etkileşimli rebase ile uzmanlaşın: ezme, kaldırma, düzenleme, yeniden düzenleme, yeniden sipariş verme. Zihninizi tanıdık hale getirdikten sonra (ipucu: sadece yolculuk yapmak için), bu çözüm '--no-commit' gibi şeylerle değişmekten çok daha doğal bir hal alır. (Ve "redım edilmeden yayınlama" kuralından korkmayın - yerel veya özel şubenizde yaptığınız sürece, * bir şey * yapabilirsiniz.) –

+1

** Ekstra ipuçları: ** Birincisi '' '' '' reword''dan (yeni bir mesaj girmek için) ya da 'edit''den (değişiklik yapılmadan değişikliklerin kaydedilmesi için) değiştirilebilir. Diğer dönüşümler için, taahhüt mesajlarını önemsemiyorsanız 'squash' yerine' fixup' kullanabilirsiniz. – ADTC

18
git revert -n <commits> 
git commit 

İlk komut, tüm iptalleri herhangi bir taahhüt oluşturmadan ve son sonucu (-n seçeneği) aşamalı olarak gerçekleştirir. Bundan sonra, commit komutu tek bir taahhüt oluşturur.

+1

Mükemmel. Özlü. Ve diğer cevapların önerdiği bir taahhüdü değiştirmek için geri dönmek yerine tüm geri dönüşlerden sonra taahhüt mesajınızı eklemenizi sağlar. –

+0

Bunun çalışmadığı dışında. Son 5 işi geri almam gerekiyor, bunlardan 3 tanesi, birisinin elses değişikliklerini her çekişinizde ortaya çıkan bu muhteşem Git parçalarıdır. Yani bu hatalar '<###>' un birleşimidir, ancak -m seçeneği verilmez '. Her bir birleşimin iki ebeveyni vardır, görünüşe göre bu birleşmelerin her birinin hangi ebeveyini tutmam gerektiğini belirlemem gerekiyor. Nasıl bir işe yarayacaksın ki, bunu geri dönüş komutuna nasıl belirlediğimi bir düşüncem yok. – Neutrino

İlgili konular