Git'te uzak depolara aktarılan belirli bir taahhüdü geri alma


788

Belirli bir taahhüdü geri almanın en basit yolu nedir:

  • kafa veya kafada değil
  • Uzaktan kumandaya itildi.

Çünkü bu son taahhüt değilse,

git reset HEAD

çalışmıyor. Ve uzaktan kumandaya itildiği için,

git rebase -i

ve

git rebase --onto

uzaktan kumandalarda bazı sorunlara neden olacaktır.

Dahası, tarihi gerçekten değiştirmek istemiyorum. Kötü kod olsaydı, tarihte vardı ve görülebilir. Sadece çalışma kopyasında istiyorum ve ters birleştirme taahhüdü umurumda değil.

Başka bir deyişle, aşağıdaki svn komutlarının Git eşdeğeri nedir :

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

yeni bir taahhüt olarak bu revizyonlardaki tüm değişiklikleri tersine birleştirerek 295 ile 302 arasındaki tüm değişiklikleri kaldırır.

svn merge -c -302 ^/trunk

302 taahhüdünü geri alır, elbette söz konusu taahhütten gelen değişiklikleri tersine çeviren başka bir taahhüt ekleyerek.

Git'te oldukça basit bir işlem ve oldukça yaygın bir kullanım örneği olması gerektiğini düşündüm. Atomik taahhütlerin başka anlamı nedir?

Sahnelemeye sahibiz ve taahhütlerin mükemmel bir şekilde atomik olmasını sağlamak için her şeyimiz var , bu atomik taahhütlerden birini veya daha fazlasını kolayca geri alamaz mısınız?

Yanıtlar:


1210

Taahhüdün karmasını tanımlayın, git logkullanın git revert <commit>ve ardından bu değişiklikleri kaldıran yeni bir taahhüt oluşturmak için kullanın . Bir şekilde, git revertbunun tersi git cherry-pick- ikincisi yamayı eksik olan bir dala uygular, ilki onu sahip olan bir daldan kaldırır.


237
Ve kodu geri almak istiyorsanız -n anahtarını kullanın, ancak otomatik olarak tekrar
işlenmiyorsa

17
"M" seçeneği ne işe yarar? Git revert 8213f7d'yi denedim ama bunun yerine aldım: hata: Bağlı 8213f7dad1ed546b434a0d8a64cb783b530a5a30 bir birleştirme ancak hiçbir -m seçeneği verilmedi. ölümcül: geri dönüş başarısız
Malcolm

10
Bir birleştirmeyi geri almak için: git
revert

31
Bir birleştirmeyi geri almak isteyen herkese bir uyarı: git geri döndürme tüm veri değişikliklerini geri alır (yani, dosya değişiklikleri geri alınır), ancak birleştirme hala geçmişte kalır. Bu nedenle, aynı şubeyi daha sonra tekrar birleştirmeye çalışırsanız, birleştirilmiş şubeden önce birleştirme şubesinden herhangi bir taahhüt içermez. Bu büyük olasılıkla istediğiniz şey değil. Şubeyi tekrar tam olarak birleştirmek için önce orijinal birleştirmeyi geri döndürdüğünüz taahhüdü geri almanız gerekir. Burada daha fazla bilgi edinin: kernel.mirrors.pair.com/pub/software/scm/git/docs/howto/…
etreworgy

3
@Etreworgy tarafından yapılan yorumdaki bağlantı 404'tür. Bunun bağlantının güncel bir sürümü olduğundan şüpheleniyorum: kernel.org/pub/software/scm/git/docs/howto/…
Tim Smith

368

Otomatik taahhüdü git revertsevmiyorum, bu yüzden bazıları için yararlı olabilir.

Sadece değiştirilmiş dosyaları isterseniz otomatik kesinleştirme değil , sen kullanabilirsiniz--no-commit

% git revert --no-commit <commit hash>

ki aynı -n

% git revert -n <commit hash>

9
Siz git reset HEAD~1 --softzaten olmadan geri döndüyseniz de yapabilirsiniz-n
Daniel

1
Ancak git reset HEAD~nsürekli olarak ulaşılamayan herhangi bir taahhüdün geri alınmasını çözmeyecektir. Sorgu, belirli bir taahhüdü geri döndürmektir.
sangeethkumarp

Bu çözümü kullandım ama geri dönüşün ortasında bir çatışmaya girdim. Çatışmayı çözdükten sonra bana öğrettiği git revert --continuegibi yaptım . İşe yaradı, ama ne yazık ki sonuçları verdi. Belki de yapmam gerekiyordu git revert --no-commit --continue.
mareoraft

1
Daniel tarafından açıklama Peşinde alabilir ek bir adımdır @sangeethkumarp git revertUnutursam, -n; çünkü bu noktada son işlem geri dönüştür, bu nedenle yumuşak sıfırlama bu işlemi geri alır ancak geri dönüşün ilişkili kod değişikliklerini gerçekleştirmez
Oliver

@ Danan yorum tarafından çözümler sağladı benim için çalışmak Teşekkürler lot '' git reset HEAD ~ 1 --soft ''
Md. Abu Sayed

41

Zaten itilmiş olduğu için, tarihi doğrudan manipüle etmemelisiniz. git reverttaahhüt geçmişini manipüle etmemek için yeni bir taahhüt kullanan bir taahhütten belirli değişiklikleri geri alacaktır.


1

Geri almak istediğiniz taahhüt birleştirilmiş bir taahhütse (zaten birleştirilmişse), aşağıda gösterildiği gibi ya -m 1da -m 2seçeneklerden birini kullanmalısınız . Bu git'e birleştirilen bağlılığın hangi ana taahhüdünün kullanılacağını bildirecektir. Daha fazla ayrıntı BURADA bulunabilir .

  • git revert <commit> -m 1
  • git revert <commit> -m 2
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.