Kısaca cevap vermek gerekirse, git pull
önce bir git fetch
yapar, sonrasında ise git merge
uygular.
git fetch nedir? git fetch
‘i herhangi bir zamanda refs/remotes/<remote>/
altındaki remote branch’inizi update etmek için kullanabilirsiniz. Bu operasyon refs/heads
altındaki lokal branchleri değiştirmez. Aynı zamanda üzerinde çalıştığınız kopyayı değiştirmeden işlem yapma açısından da güvenlidir. Hatta bazı programcılar git fetch
için bir cron job olulşturup periyodik bir şekilde arkaplanda fetch çalıştırabilir.
git pull nedir? git pull
‘u ise local bir branchi remote versiyona güncellemek için kullanırız. Aynı zamanda diğer remote brachleri de update etmek için yararlıdır.
Git dökümanlarından git pull
:
In its default mode,
git pull
is shorthand forgit fetch
followed bygit merge FETCH_HEAD
.
Yani:
fetch kullandığınızda, Git, hedef branchteki bulunan ve mevcut branchte bulunmayan herhangi bir commit işlemini yapar ve yerel reponuza kaydeder. Ancak, bunları mevcut branchiniz ile birleştirmez. Peki git fetch ne işe yarar? Repomuzu güncel tutmamız gerekiyorsa, ancak dosyalarımızı güncellersek de bozulabilecek bir şeyler varsa fetch kullanmayı tercih ederiz. Bu işlemleri mevcut branchinize entegre etmek için sonrasında merge kullanmalısınız.
pull kullandığınızda, Git otomatik olarak merge çalışır. Bağlamsal olarak hassastır, bu nedenle Git şu anda çalıştığınız branch için herhangi bir commit varsa birleştirecektir. Dolayısıyla git pull ne işe yarar diye bir soru sorarsak; pull yapılan değişiklikleri gözden geçirmenize izin vermeden otomatik olarak birleştirir diyebiliriz. Eğer branchlerinizi dikkatlice yönetmiyorsanız, sık sık sorunlarla karşılaşabilirsiniz.
Bu açıklamadan git fetch ve git pull farkının anlaşıldığını varsayabiliriz. Ancak yine de biraz daha detaya girelim ve kabaca SVN’nin ne olduğuna bakalım.
pull ve fetch için SVN/Git tasarım felsefesi
SVN tasarım felsefesi
SVN gibi daha geleneksel bir kaynak kontrol aracı felsefesiyle git tasarım felsefesini karşılaştırmak burada yararlı olabilir.
Subversion, client/server modeli ile tasarlanmıştır. Server olan tek bir depo bulunur ve birkaç istemci sunucudan fetch edebilir, üzerinde çalışabilir, sonra sunucuya geri gönderebilir. Buradaki varsayım, istemcinin bir çalışma gerçekleştirmek için her zaman sunucuyla iletişim kurabileceğidir.
Git tasarım felsefesi
Git ise merkezi bir depoya ihtiyaç duymayan dağıtılmış bir modeli desteklemek için tasarlanmıştır . Ayrıca git, istemcinin ve sunucunun aynı anda çevrimiçi olmasının gerekmeyeceği şekilde tasarlandı. Git, aynı zamanda, insanların güvenilir olmayan bir bağlantıdaki kişilerin de e-posta yoluyla kodu değiştirebilmesi için tasarlandı. Tamamen çevrimdışı olarak çalışmaya da izin verir.
Bu modeli desteklemek için git kodunuzun yerel bir deposunu oluşturur ve ayrıca uzaktaki deponun durumunu yansıtan ek bir yerel depo daha oluşturur. Uzaktaki deponun yerel bir kopyasını tutarak, uzaktaki depoya ulaşamadığınızda bile gerekli değişiklikleri belirleyebilir. Başka birine değişiklikleri göndermeniz gerektiğinde, bu değişiklikleri git, uzaktaki depoya bir değişiklik kümesi olarak aktarabilir.
- git fetch, “yerel depomu uzaktaki deponun içeriğine güncelle” anlamına gelir.
- git pull “uzaktaki deponun değişikliklerini yerel depoya getir” der.
Normalde git pull, uzaktaki deponun yerel kopyasını güncellemek için bir git fetch yaparak bunu yapar ve ardından değişiklikleri yerel deponuza ve muhtemelen çalışma kopyanıza yapıştırır.
Burada aklımızda tutmamız gereken, iş istasyonunuzdaki bir projenin genellikle en az üç kopyası olduğudur. Bir kopya kendi değişikliklerinizin geçmişi ile yerel deponuzdur. İkinci kopya, düzenleme ve geliştirmeleri yaptığınız çalışma kopyasıdır. Üçüncü kopya ise uzaktaki deponun yerel önbellek kopyasıdır.