Git Revert nasıl kullanılır?


110

Nasıl git revertkullanılır?

Bu yinelenen bir soru gibi gelebilir ama insanlar bunu sorduklarında, yanıt, genellikle kullanımıdır git resetuyarınca Git'te SHA karma bir karşı Geri Alma işlemi tamamlama?

Birisi sorar Sonra zaman nasıl kullanması git resetinsanlar kullanmak gerektiğini söyleyerek yanıtında git revertgöre nasıl geri alma - Git

Siz farkına varmadan, OP'nin kıçını kurtarmak için kendi benzersiz yöntemleriyle 8 farklı insan ortaya çıktı ve bunların hepsi kafanızın üzerinde.

Öyleyse özeti deneyip yapıştıralım ve bir Aptallar Rehberi yazalım git revert.

Bir senaryo: iki kez ustalaşmayı taahhüt ettiniz ve bu kötü. Sen zorladın ve diğer insanlar senin kötü değişikliklerini yaptı.

Geri almak istiyorsun. Bu, kodda kendi başınıza geri alabileceğiniz bir şey değil, diyelim ki bir sihirbaz veya paket yöneticisi, her yerde tonlarca şeyi değiştirdi - sadece hepsini olduğu gibi geri getirmek istiyorsunuz.

Kaynak kontrolünün anlamı budur. Eminim kolaydır.

Tamam, kullanacaksın git revertama nasıl?

Ve git revertkoştuktan sonra başka bir şey yapmak zorunda mısın? Yapılan değişiklikleri geri almak zorundasınız mı, yoksa doğrudan repoya mı geri dönüyor?

Açıkçası, tekrar basmanız ve muhtemelen toplarınızı takıma duyurmanız gerekecek.

Yanıtlar:


124

git revert yeni bir işlem yapar

git revert sadece mevcut bir commit'in tersi olan yeni bir commit yaratır.

Dosyaları, geri alınan kesinleştirme hiç var olmamış gibi aynı durumda bırakır. Örneğin, aşağıdaki basit örneği düşünün:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

Bu örnekte commit tarihinin iki commit'i vardır ve sonuncusu bir hatadır. Git revert kullanarak:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

Günlükte 3 işlem olacak:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

Yani ne olduğuna dair tutarlı bir geçmiş var, ancak dosyalar sanki kötü güncelleme hiç gerçekleşmemiş gibi:

cat README.md 
Initial text

Geçmişte geri alınacak kaydetmenin nerede olduğu önemli değildir (yukarıdaki örnekte, son kayıt geri alınır - herhangi bir kayıt geri alınabilir).

Kapanış soruları

sonra başka bir şey yapmak zorunda mısın?

Bir git revertolan sadece başka taahhüt, diğer kullanıcılar / çekme getirme / değişiklikleri birleştirme ve bitirdiniz ki uzaktaki böylece çok örneğin itme.

Yapılan değişiklikleri geri almak zorundasınız mı yoksa geri almak doğrudan repoya mı bağlanır?

git revert olan tek yapmak istediğin ne taahhüt geri alınmasının varsayarak hiçbir ekstra adımlar vardır - bir taahhüt.

Açıkçası, tekrar itmeniz ve muhtemelen takıma duyurmanız gerekecek.

Gerçekten de - uzaktan kumanda kararsız bir durumdaysa - düzeltmeyi elde etmek için çekmeleri gereken ekibin geri kalanına iletişim kurmak (geri döndürme taahhüdü) yapılacak doğru şey olacaktır :).


Doğrulama yoluyla, hem buradaki ilk ifadeye hem de nasıl çalıştığını merak ettiğim aynı şeyi merak eden herkese, geri döndüğünüzden bu yana birkaç yeni işlemin olduğu bir geri dönüşü geri alabilirsiniz. Öyleyse, gerçekten geri dönüş, yalnızca geri alınan taahhüdün zıttıdır. Elbette çatışmalar yaşayabilirsiniz ... ama bu farklı bir hikaye.
GG2

Sadece değişiklikleri gözden geçirmek ve kullanıyorum, git revert -n <commitToRevet> veya git revert --no-commit <commitToRevet>
Eklavyaa

2
Yığın akışında geçen yıllardan sonra bunun şimdiye kadar karşılaştığım en iyi cevaplardan biri olabileceğini söylemek istedim. Harika bir örnek ve açıklama, teşekkür ederim.
user3344977

Buraya daha fazla bilgi almayı umarak girdim, bu raw.githubusercontent.com/git/git/master/Documentation/howto/…
wviana

1
@wviana Bulduğunuz bilgi yetersizse lütfen bir cevap yazın. Yığın taşmasının resmi belgelerin yerini alamayacağına dikkat edin (bağlantı veriyor gibi görünüyorsunuz ve bu sorudan çok daha geniş bir kapsamı kapsıyor).
AD7six

35

Git geri dönüşü şu şekilde kullanın:

git revert <insert bad commit hash here>

git revertgeri alınan değişikliklerle yeni bir kaydetme oluşturur. git resetyeni bir commit yapmak yerine git geçmişinizi siler.

Bundan sonraki adımlar, diğer kayıtlarla aynıdır.


"Bir taahhüdü geri döndürmek" ve "bir taahhüdü geri döndürmek" arasındaki fark, bu komutla yıllardır mücadele ettiğim için yeterince ince. Açıklamanız benim için anında çözdü. Teşekkürler!
claviska

24

Aynı konuşmalarda çokça ortaya çıkma eğilimi resetve nedeni revert, farklı sürüm kontrol sistemlerinin bunları farklı şeyler ifade etmek için kullanmasıdır.

Özellikle, bir dosyadaki taahhüt edilmemiş değişiklikleri atmak isteyen SVN veya P4'e alışkın kişiler, revertaslında istedikleri söylenmeden önce ulaşırlar reset.

Benzer şekilde, revertdiğer VCS'lerdeki eşdeğeri genellikle rollbackveya benzer bir şey olarak adlandırılır - ancak "geri alma" aynı zamanda uygun olan resetancak uygun olmayan "son birkaç kaydı tamamen atmak istiyorum" anlamına da gelebilir revert. Dolayısıyla, insanların ne yapmak istediklerini bildikleri, ancak bunun için hangi komutu kullanmaları gerektiği konusunda net olmadıkları bir çok kafa karışıklığı var.

Geri dönüşle ilgili gerçek sorularınıza gelince ...

Tamam, git revert kullanacaksın ama nasıl?

git revert first-bad-commit..last-bad-commit

Git revert'ı çalıştırdıktan sonra başka bir şey yapmanız gerekiyor mu? Yapılan değişiklikleri geri almak zorundasınız mı yoksa doğrudan repoya taahhüt mü geri döndürüyor musunuz?

Varsayılan olarak, git revertsizden bir commit mesajı ister ve ardından sonuçları kaydeder. Bu geçersiz kılınabilir. Man sayfasını alıntı yapıyorum :

--Düzenle

Bu seçenek ile git revert, geri dönüşü gerçekleştirmeden önce commit mesajını düzenlemenize izin verir. Komutu bir terminalden çalıştırırsanız bu varsayılan değerdir.

- taahhüt yok

Genellikle komut, hangi kayıtların geri alındığını belirten commit günlük mesajlarıyla otomatik olarak bazı commit'ler oluşturur. Bu bayrak, adlandırılmış taahhütleri çalışma ağacınıza ve dizine geri döndürmek için gerekli değişiklikleri uygular, ancak taahhütleri yapmaz. Ek olarak, bu seçenek kullanıldığında dizininizin HEAD commit ile eşleşmesi gerekmez. Geri dönüş, dizininizin başlangıç ​​durumuna göre yapılır.

Bu, dizininize birden fazla kaydetme etkisini bir satırda geri döndürürken kullanışlıdır.

Özellikle, varsayılan olarak, geri aldığınız her kaydetme için yeni bir kaydetme oluşturur. Bu revert --no-commitdeğişiklikleri bireysel taahhütler olarak taahhüt etmeden hepsini geri döndüren değişiklikler yaratmak için kullanabilirsiniz , ardından boş zamanlarınızda taahhüt edebilirsiniz.


git revert first-bad-commit..last-bad-commit: Bence bu olmalı git revert parent-of-first-bad-commit..last-bad-commit.
user1071847

10

Soru oldukça eski ama geri dönüş hala insanların kafasını karıştırıyor (benim gibi)

Yeni başlayan biri olarak, biraz deneme yanılmadan sonra (denemelerden daha fazla hata) önemli bir noktaya sahibim:

  • git revertKaldırmak istediğiniz işlemenin kimliğinin geçmişinizde kalmasını gerektirir

  • git resettutmak istediğiniz taahhüdü gerektirir ve sonuç olarak bundan sonraki her şeyi geçmişten kaldırır.

Yani, revertilk yürütme kimliğiyle kullanırsanız, kendinizi boş bir dizinde ve geçmişte ek bir işlemde bulacaksınız, sıfırlama ile dizininiz .. ilk yürütmeye geri dönecek ve geçmişiniz sanki son işlem (ler) hiç olmadı.

Daha net olmak gerekirse, bunun gibi bir günlükle:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

Kullanarak git revert cb76ee4irade varsayılan olarak geri 01b56c6 dosyalarınızı getirmek ve daha da tarihe taahhüt bir katacak:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 bunun yerine dosyalarınızı 01b56c6'ya geri getirecek ve bundan sonraki diğer işlemleri geçmişinizden temizleyecektir:

01b56c6 test
2e407ce first commit

Bunların "temel" olduğunu biliyorum, ancak benim için oldukça kafa karıştırıcıydı revert, ilk kimliği çalıştırarak ("ilk işleme") İlk dosyalarımı bulmayı bekliyordum, anlamak biraz zaman aldı, dosyalarınıza geri ihtiyacınız olursa 'ilk yürütme' olarak sonraki kimliği kullanmanız gerekir.


Ben de aynısını gözlemledim. gerçekten kafa karıştırıcı ama bilmek çok önemli. kısa bir süre önce bir iş arkadaşıma yardım etmem gerekti ve bunu unuttum. Bu biraz utanç vericiydi.
ExOfDe

1

Aşağıdaki gibi 'git revert commit id' komutunu çalıştırarak birkaç kaydı geri aldım:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

Sonra geri dönüşü gerçekleştirmem istendi (tıpkı 'git commit' çalıştırırken yaptığınız gibi). Varsayılan terminal programım Vim olduğundan çalıştırdım:

:wq 

Sonunda değişikliği depoya şu şekilde ittim:

git push
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.