Bu bağlantıdan Birleştirme Nasıl Geri Dönülür için iyi bir açıklama buldum ve aşağıdaki açıklamayı yapıştırdım ve aşağıdaki bağlantı çalışmazsa yardımcı olacaktır.
Hatalı bir birleşme nasıl geri alınır
Alan (alan@clueserver.org) dedi:
Bir ana dalım var. Bazı geliştiricilerin üzerinde çalıştığı bir şubemiz var. Hazır olduğunu iddia ediyorlar. Ana dalda birleştiriyoruz. Bir şeyleri kırar, böylece birleşmeyi geri alırız. Kodda değişiklik yaparlar. onlar-cekti var olmak ok ve tekrar birleştirmek bir noktaya olsun. İncelendiğinde, geri dönmeden önce yapılan kod değişikliklerinin ana dalda olmadığını, ancak sonraki kod değişikliklerinin ana dalda olduğunu görürüz. ve bu durumdan kurtulmak için yardım istedi.
"Birleşmenin geri dönüşü" nün hemen ardından tarih şöyle görünecektir:
---o---o---o---M---x---x---W
/
---A---B
A ve B, çok iyi olmayan yan gelişimde, M, bu erken değişiklikleri ana hatta getiren birleşme, x, yan dalın yaptığı ve ana hatta zaten yaptığı şeyle ilgili olmayan değişikliklerdir ve W, " M birleşimini geri döndür "(W baş aşağı bakmıyor mu?). IOW, "diff W ^ .. W", "diff -RM ^ .. M" ye benzer.
Böyle bir birleşmenin "geri dönüşü" aşağıdakilerle yapılabilir:
$ git revert -m 1 M
Yan dal geliştiricileri hatalarını düzelttikten sonra tarih şöyle görünebilir:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
C ve D, A ve B'de kırılanları düzeltmek içindir ve W'dan sonra ana hat üzerinde başka değişiklikleriniz olabilir.
Güncellenmiş yan dalı birleştirirseniz (D ucunda), A veya B'de yapılan değişikliklerin hiçbiri sonuçta olmaz, çünkü W tarafından geri döndürülürler. Alan'ın gördüğü buydu.
Linus durumu açıklıyor:
Düzenli bir taahhüdü geri almak, söz konusu taahhüdün yaptıklarını etkili bir şekilde geri alır ve oldukça basittir. Ancak bir birleştirme taahhüdünü geri almak aynı zamanda taahhüdün değiştiği verileri geri alır , ancak birleştirmenin tarih üzerindeki etkileri üzerinde kesinlikle hiçbir şey yapmaz . Böylece birleştirme hala var olacak ve yine de iki dalı birleştirmek olarak görülecek ve gelecekteki birleşmeler bu birleşmenin son paylaşılan devlet olarak görüleceğini - ve birleşmeyi geri döndüren geri dönüşün bunu etkilemeyeceğini görecektir. Yani bir "geri alma" veri değişikliklerini geri alır, ama çok fazla değilbir taahhüdün depo tarihi üzerindeki etkilerini geri almaması anlamında bir "geri al". Eğer "geri al" ı "geri al" olarak düşünürseniz, geri dönüşlerin bu kısmını her zaman özleyeceksiniz. Evet, verileri geri alır, ancak hayır, geçmişi geri almaz. Böyle bir durumda, ilk önce geçmişi geri döndürmek istersiniz, bu da tarihin böyle görünmesini sağlar:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
burada Y, W'nin geri dönüşüdür. Böyle bir "geri dönüş" geri dönüşü şu şekilde yapılabilir:
$ git
revert W Bu geçmiş (W ve W..Y'nin değiştirdiği şeyler arasındaki olası çakışmaları yok sayarak), geçmişte W veya Y'ye sahip olmamakla eşdeğerdir:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
ve yan dalın yeniden birleştirilmesi, daha önceki bir geri dönüş ve geri dönüşten kaynaklanan bir çatışmaya sahip olmayacaktır.
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
Elbette C ve D'de yapılan değişiklikler hala x'in herhangi biri tarafından yapılanlarla çelişebilir, ancak bu sadece normal bir birleşme çatışmasıdır.