Last chance! 50% off DataCamp Premium
Sale ends in
Yerel depoları uzak muadilleriyle senkronize etmek, Git ile çalışmanın temel bir yönüdür.
Uzak koddaki erişimde sıklıkla karıştırılan iki komut git fetch ve git pull'dur. Benzer görünseler de aralarındaki farklar, kod incelemesi, dal (branch) yönetimi ve genel ekip verimliliği açısından anlamlı sonuçlar doğurur.
Bu yazıda her bir işlevin ne yaptığını ele alacak, örneklere bakacak ve kullanım için bazı en iyi uygulamaları paylaşacağız. Git hakkında öğrenmeye devam ediyorsanız, Git Fundamentals beceri yolumuzu incelemenizi öneririm.
İlgili olsalar da, bu komutlar hem davranış hem de amaç bakımından farklıdır.
Aşağıdaki tabloda karşılaştıralım:
|
Farklar |
Git Fetch |
Git Pull |
|
Amaç |
Yalnızca uzak izleme dallarını günceller |
Uzak izleme dallarını günceller ve mevcut dala entegre eder |
|
Çalışma dizinine etkisi |
Dosyalarda değişiklik olmaz |
Değişiklikler çalışma dalındaki dosyalara hemen uygulanır |
|
Güvenlik |
Güvenlidir; değişiklikler otomatik olarak birleştirilmez |
Daha az güvenlidir; çatışmaları anında tetikleyebilir |
|
Kontrol |
Birleştirmenin ne zaman ve nasıl yapılacağı üzerinde tam kontrol sağlar |
Entegrasyonu otomatikleştirir; daha az manuel karar |
|
Geçmişe etkisi |
Birleştirme yapılana kadar geçmişi temiz tutar |
(Merge ile) birleştirme commit'leri ekleyebilir veya (rebase ile) yerel commit geçmişinizi yeniden yazabilir |
|
Yaygın kullanım durumları |
Kod inceleme, entegrasyon planlama, güvenli senkronizasyon |
Hızlı güncellemeler, CI/CD hatları, güvenilir ortamlar |
Gördüğünüz gibi, bu komutlar hem davranış hem de amaç bakımından farklıdır:
git fetch, yalnızca uzak izleme referanslarını günceller ve çalışma dalınızı olduğu gibi bırakır.git pull, uzak izleme referanslarını günceller ve bunları mevcut dalınıza anında entegre eder.
Yukarıdaki görsel akışta gösterildiği gibi, fetch ve pull arasındaki farklar kodunuzun nereye aktığıyla ilgilidir.
Özetle:
origin/main) taşınır. Yerel main değişmeden kalır; bu da kesinti olmadan güncellemeleri görmenizi sağlar.git fetch ve git pull'u tam olarak takdir etmek için Git'in iç yapısını ve söz konusu katmanları anlamamız gerekir.
Git temelde dağıtık bir sürüm kontrol sistemidir; bu da her geliştiricinin geçmiş, dallar ve etiketler dahil deponun eksiksiz bir kopyasına sahip olduğu anlamına gelir.
Bu mimari, çalışmanın merkezi bir sunucudan bağımsız olarak sürdürülmesini sağlar; fetch ve pull gibi komutlar ise dağıtık ortamları senkron tutan köprülerdir.
Git depoları birden fazla katmanda çalışır:
.git dizini. Tamamen yereldir ve siz commit'lemediğiniz veya açıkça senkronize etmediğiniz sürece değişmez.Bu katmanlar bağımsız çalışır; yani bir uzakla senkronizasyon, çalışma dizininizi anında etkilemez.
Bunun yerine, değişiklikler şu sırayla kademeli olarak yayılır:
uzak → uzak izleme dalları → yerel depo → çalışma dizini.
Uzak izleme dalları, uzak depodaki dalların durumunu temsil eden özel referanslardır.
Örneğin, origin/main, en son fetch yaptığınızda origin uzakındaki main dalının nerede olduğunu gösterir.
Yer imleri gibi davranarak şunları yapmanızı sağlar:
git fetch çalıştırdığınızda Git bu uzak izleme dallarını günceller.Bu ayrım, gerçek geliştirme çalışmanızı etkilemeden önce güncellemeleri gözlemleyip analiz edebilmenizi sağlar. Daha fazlası için Git remote öğreticimize göz atabilirsiniz.
git fetch, bir uzak depodan commit'leri, dalları ve etiketleri alır ve mevcut dalınızı veya çalışma dosyalarınızı değiştirmeden uzak izleme dallarınızı günceller.
Bunu, “uzak deponun en güncel haritasını indirmek” gibi düşünebilirsiniz; ancak yeni bölgeye adım atmış olmazsınız.
Özellikle, kendi çalışmalarında istenmeyen değişiklik riski olmadan uzaktaki etkinliği görmek isteyen geliştiriciler için kullanışlıdır.
Komut bash terminalinde veya komut satırı arayüzünde (CLI) kullanılır. Dikkat etmeniz gereken bazı sözdizimi ayrıntıları şunlardır:
Yaygın fetch komutları:
# Fetch all remotes
git fetch --all
# Fetch only one branch
git fetch origin main
# Fetch and prune stale references
git fetch --prune
# Fetch a specific tag
git fetch origin tag v1.2.0
Her komut ve ilgili seçeneklerine ilişkin açıklama:
--all, tüm yapılandırılmış uzakların güncellenmesini sağlar; çoklu uzak kurulumlarında kullanışlıdır.git fetch origin main ile tek bir dalı fetch etmek, yalnızca tek bir iş akışıyla ilgileniyorsanız verimlidir.--prune, sunucuda artık var olmayan eski uzak izleme dallarını kaldırır ve ortamınızı temiz tutar.git fetch origin tag ile etiketleri fetch etmek, etiketli commit'lerin tam dallardan daha önemli olduğu sürüm süreçlerinde yardımcıdır.Geliştiriciler, görünürlük ve kontrolün önemli olduğu çeşitli senaryolarda git fetch kullanır. Örneğin:
origin/maindeki değişiklikleri yerel dalınızla karşılaştırın.git pull, hem değişiklikleri indirip hem de bunları mevcut dalınıza derhal entegre etmeye çalıştığı için fetch'ten daha agresiftir.
Bu, git pull komutunun git fetch ve git merge komutlarının birleşimi olduğu anlamına gelir.
Varsayılan olarak bu entegrasyon bir merge'dür, ancak rebase kullanacak şekilde yapılandırılabilir. Kullanışlı olmakla birlikte, bu komut uzak güncellemeleri hemen uygulamak istediğinizi varsayar.
Hızı ve anında senkronizasyonu önceleyen geliştiricilerin başvurduğu komuttur.
Şimdi bu komutun sözdizimine bakalım.
İşte bazı örnekler:
# Default fetch + merge
git pull origin main
# Fetch + rebase for cleaner history
git pull --rebase origin main
# Pull all changes from default remote
git pull
# Pull with fast-forward only (avoids merge commits)
git pull --ff-only
Yukarıdaki kodun açıklaması:
--rebase ile Git, yerel commit'lerinizi uzak dalın üzerine tekrar uygular; daha temiz, doğrusal bir geçmiş oluşturur.--ff-only seçeneğini kullanmak, dalın gereksiz merge'ler olmadan fast-forward edilmesini sağlar; bu da temiz iş akışları için sıklıkla arzu edilir.Git'te "fast-forward", birleştirmek istediğiniz dalın, birleştirdiğiniz daldan ayrışmadığı durumlarda gerçekleşen belirli bir birleştirme türünü ifade eder.
Bu, hedef dalda (şu anda bulunduğunuz dal) kaynak dalda bulunmayan yeni commit'lerin olmadığı anlamına gelir.
Özünde, fast-forward, dallar arasında doğrusal bir commit ilerleyişi korunduğunda geçmişi basitleştiren yalın bir birleştirme sürecidir.
Bu komut, geliştirme kodunu yönetmek için çeşitli durumlarda kullanılabilir. Örneğin:
git pull komutu bazı endişeleri beraberinde getirebilir. İşte dikkate alınması gereken güvenlik yönleri:
Fetch ile pull arasında seçim, iş akışına ve proje gereksinimlerine bağlıdır.
Hangi yaklaşımın benimseneceğine karar verirken ekip kültürü ve proje türü dikkate alınmalıdır.
Genel olarak iki farklı strateji izleyebilirsiniz.
Bu iki komutla çalışırken, geliştiriciler beklenmedik kod değişikliklerini önlemek için bazı en iyi uygulamaları benimser.
İşte dikkate almanız gereken bazı ipuçları:
git pull --rebase, karmaşık geçmişleri önlemeye yardımcı olur.Uzak depolara erişmenin ötesinde, iyi bir sürüm kontrolü sağlamak için Git başka amaçlarla da kullanılabilir.
İşte bazı yaygın ilgili komutlar:
git diff HEAD..origin/main: Yerel ve uzağı karşılaştırın.git branch -a: Yerel ve uzak tüm dalları inceleyin.git clone: Senkronizasyonun başlangıç noktasıdır; uzak deponun bir kopyasını yerel makinenizde oluşturur.Aşağıdaki mini başvuru kağıdında daha fazla Git komutu bulabilirsiniz.

Kaynak: DataCamp Git Cheat Sheet
CI/CD ortamlarında fetch ve pull kullanımı yaygındır.
Otomasyon şu örneklerle etkinleştirilebilir:
Git komutları, geliştirme iş akışlarını yönetmede güçlüdür.
Bu nedenle aşağıdaki kullanım durumlarında etkili şekilde kullanılabilirler:
Her iki komut da gereklidir ancak farklı amaçlara hizmet eder. git fetch güvenliği, görünürlüğü ve kontrollü entegrasyonu; git pull ise hızı ve kullanım kolaylığını vurgular. Aralarındaki seçim, proje boyutu, ekip kültürü ve stabilite ile çeviklik arasındaki denge gibi bağlama bağlıdır.
Ekipler, dikkatli inceleme için fetch ile hızlı güncellemeler için pull arasında doğru dengeyi kurmalıdır. Böylece gereksiz çatışmaları önleyebilir, iş birliğini kolaylaştırabilir ve daha sağlıklı depoları koruyabilirsiniz.
Sürüm kontrolü için Git kullanımını daha fazla öğrenmek ister misiniz? GitHub Foundations yolumuzu veya GitHub Concepts kursumuzu inceleyin. Git hakkında daha fazla okumak ister misiniz? O hâlde Git Push ve Pull ile Git Remote öğreticilerimiz faydalı olabilir.
git fetch, uzak depodan yeni commit'leri indirir fakat çalışma ağacınıza veya mevcut dalınıza dokunmaz. Otomatik birleştirme yapmadığı için değişiklikleri (diff/merge-base) inceleyebilir, dalınızı kademeli olarak güncelleyebilir (ör. fetch edilen uca rebase), ve küçük çatışmaları büyümeden önce yerelde çözebilirsiniz.
Doğrusal bir geçmişi korumak için git pull --rebase kullanın (veya git config pull.rebase true ayarlayın). Sık sık pull yapın, ancak çalışma ağacınız temizken. Küçük ve odaklı commit'ler yapın; göndermeden önce test edin. Ana dalları koruyun, inceleme/CI zorunlu tutun ve çalışma ortasında doğrudan sürüm dallarına pull yapmaktan kaçının. Paylaşılan dallar çok ayrıştığında, dağınık merge commit'leri oluşturmaktansa hızlıca başarısız olmak için --ff-only düşünün.
git merge, geçmişleri birleştirir ve bir merge commit'i oluşturur; gerçek kronolojiyi korur (paylaşılan dallar ve denetim izi için iyidir). git rebase ise commit'lerinizi yeni bir tabanın “üstüne” tekrar yazar; okunması daha kolay, doğrusal bir geçmiş yaratır (başkalarıyla paylaşılmadan önce kendi özellik dallarınız için idealdir).
Her ikisi de önce fetch, sonra entegrasyon yapar. --rebase, yerel commit'lerinizi fetch edilen üst akışın üzerine yeniden uygular—merge commit'i yoktur, daha temiz bir geçmiş sağlar; ancak yeniden uygulama adımında çatışmaları çözersiniz. --merge ise standart bir merge yapar, tüm orijinal commit'leri korur ve bir merge commit'i ekler; dal topolojisi için daha açık olabilir ama sık kullanılırsa gürültüyü artırır
Uzak izleme referanslarını, fast-forward olmasa bile güncellemeye zorlar. Bu, üst akıştaki geçmiş yeniden yazımlarını gizleyebilir, etiketleri beklenmedik biçimde değiştirebilir ve sonraki merge/rebase işlemlerini karmaşıklaştırabilir. Mevcut dalınızı doğrudan ezmese de yeniden yazılmış bir geçmişi yanlış entegre etmenize ve iş kaybına yol açmanıza neden olabilir.
Öne Çıkan DataCamp Kursları
{count, plural, one {Program} other {Program}}
{count, plural, one {Program} other {Program}}
{count, plural, one {Kurs} other {Kurs}}

{count, plural, one {blog} other {blog}}
Abid Ali Awan
14 dk.
{count, plural, one {blog} other {blog}}
Dario Radečić
15 dk.
{count, plural, one {Eğitim} other {Eğitim}}
Kurtis Pykes
8 dk.
{count, plural, one {Eğitim} other {Eğitim}}
Adel Nehme