Arasındaki fark nedir git merge
ve git rebase
?
Arasındaki fark nedir git merge
ve git rebase
?
Yanıtlar:
Varsayalım başlangıçta 3 kaydedilmesini vardı A
, B
, C
:
Sonra geliştirici Dan taahhüt oluşturdu D
ve geliştirici Ed taahhüt oluşturdu E
:
Açıkçası, bu çatışma bir şekilde çözülmelidir. Bunun için 2 yol vardır:
BİRLEŞTİR :
Hem taahhütte D
hem E
de hala buradayız, ama M
her ikisinden D
ve değişiklikleri değiştiren birleştirme taahhüdü yaratıyoruz E
. Bununla birlikte, bu , birçok insanın çok kafa karıştırıcı bulduğu elmas şekli oluşturur .
REBASE :
Biz taahhüt oluşturmak R
gerçek dosya içeriğini birleştirme taahhüt özdeş olan M
yukarıda. Ancak, E
hiç var olmamış gibi (noktalarla gösterilir - yok olan çizgi) taahhütten kurtuluruz . Bu yok etme nedeniyle, E
geliştirici Ed için yerel olmalı ve hiçbir zaman başka bir depoya itilmemelidir. Rebase'in avantajı, elmas şeklinden kaçınılması ve tarihin güzel düz çizgide kalmasıdır - çoğu geliştirici bunu sever!
git merge
taahhütler arasına eklemez (ancak bakarak görünebilir git log
). Bunun yerine, git merge
her iki bakış açısından da görüldüğü gibi, Dan ve Ed'in her iki geliştirme geçmişini olduğu gibi koruyor. git rebase
Dan'ın önce üzerinde çalıştığı gibi görünmesini sağladı ve Ed onu takip etti. Her iki durumda da (birleştirme ve yeniden oluşturma), gerçek sonuç dosya ağacı kesinlikle aynıdır.
Git hakkında nefret ettiğim 10 şeyden bu alıntıyı gerçekten seviyorum (ikinci örneğinde rebase için kısa bir açıklama yapıyor):
3. Crappy belgeleri
Man sayfaları bir yüce "seni lanet" 1 . Komutları, bir kullanıcı değil, bir bilgisayar bilimcisinin bakış açısından tarif ederler. Konuşma konusu olan mesele:
git-push – Update remote refs along with associated objects
İşte insanlar için bir açıklama:
git-push – Upload changes from your local repository into a remote repository
Güncelleme, başka bir örnek: (teşekkürler cgd)
git-rebase – Forward-port local commits to the updated upstream head
Tercüme:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
Ve sonra
git-merge - Join two or more development histories together
ki bu iyi bir tanım.
1. orijinal sansürsüz
Şahsen standart diyagramlama tekniğini çok yararlı bulmuyorum - oklar her zaman benim için yanlış yolu gösteriyor gibi görünüyor. (Genellikle her bir taahhüdün "ebeveyni" ne işaret ederler, bu da zaman içinde geriye doğru gider, bu da gariptir).
Bunu kelimelerle açıklamak için:
Anlamadığım nedenlerden dolayı, Git için GUI araçları hiçbir zaman birleştirme geçmişlerini daha temiz bir şekilde sunma ve bireysel birleştirmeleri soyutlama çabası göstermedi. Yani "temiz bir tarih" istiyorsanız, rebase kullanmanız gerekir.
Sadece rebase kullanan programcıların ve asla rebase kullanmayan diğer programların blog yazılarını okuduğumu hatırlıyorum .
Bunu açık sözlü bir örnekle açıklamaya çalışacağım. Diyelim ki projenizdeki diğer kullanıcılar kullanıcı arayüzü üzerinde çalışıyor ve siz de doküman yazıyorsunuz. Rebase olmadan, geçmişiniz şöyle görünebilir:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
Yani, birleştirme ve kullanıcı arayüzü belgelerinizin ortasında taahhüt eder.
Kodunuzu birleştirmek yerine master'a yeniden basarsanız, şöyle görünür:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
Tüm taahhütleriniz en üstte (en yeni), ardından da master
şubenin geri kalanında .
( Feragatname: Başka bir cevapta atıfta bulunulan "Git hakkında nefret ettiğim 10 şey" yazısının yazarıyım )
Kabul edilen ve en çok oylanan cevap harika olsa da, farkı sadece kelimelerle açıklamaya çalışırken de yararlı buluyorum:
birleştirmek
rebase
özet: Mümkün olduğunda, rebase neredeyse her zaman daha iyidir. Ana şubeye yeniden entegrasyonu kolaylaştırmak.
Çünkü? ➝ Özelliğinizin iş olarak sunulabilir biri birden veliler 'açıklamak' zorunda kalmayacakları, ana dal açısından büyük 'yama dosyası' (aka fark): Bir birleştirme gelen en az ikisini, ancak büyük olasılıkla çok daha fazla, eğer orada çeşitli birleşmelerdi. Birleştirmeden farklı olarak, birden fazla yeniden basma toplanmaz. (başka bir büyük artı)
Git rebase birleşmeye daha yakın. Rebase'deki fark:
Bu, tüm uzaktan işlemlerin ardından tüm yerel işlemlerinizin sonuna taşındığı anlamına gelir. Birleştirme çatışmanız varsa, bunu da çözmeniz gerekir.
Git rebase vs merge hakkında gerçekten ilginç bir makale buldum , burada paylaşmayı düşündüm