Basit bir ifadeyle, herhangi bir İnternet bağlantısı olmayan bir uçağa atlamak üzereydiniz ... ayrılmadan önce git fetch origin <master>
. Tüm değişiklikleri bilgisayarınıza getirir, ancak yerel geliştirme / çalışma alanınızdan ayrı tutar.
Uçakta, yerel çalışma alanınızda değişiklikler yapabilir ve daha sonra getirdiğiniz şeyle birleştirebilir ve olası birleştirme çakışmalarını Internet bağlantısı olmadan çözebilirsiniz. Birisi uzak depoda yeni çelişkili değişiklikler yapmamışsa , o zaman hedefe vardığınızda git push origin <branch>
kahvenizi alırsınız.
Bu harika Atlassian öğreticisinden :
git fetch
Yerel depoya uzak deposundan komut indirme kaydedilmesini, dosyalar ve ref.
Getirme, diğer herkesin ne üzerinde çalıştığını görmek istediğinizde yaptığınız şeydir . Merkezi geçmişin nasıl ilerlediğini görmenize izin vermesi SVN güncellemesine benzer, ancak değişiklikleri gerçekte deponuzda birleştirmeye zorlamaz. Git getirilen içeriği mevcut yerel içerikten ayırır , yerel geliştirme çalışmalarınız üzerinde kesinlikle
hiçbir etkisi yoktur . Alınan içeriğin git checkout
komut kullanılarak açıkça kontrol edilmesi gerekir . Bu, getirmeleri yerel deponuza entegre etmeden önce taahhütleri gözden geçirmenin güvenli bir yolunu yapar.
Uzak bir depo içerik indirmeye, zaman git pull
ve git fetch
komutlar görevi başarmak için kullanılabilir. git fetch
İki komutun 'güvenli' sürümünü düşünebilirsiniz
. Uzak içeriği indirir, ancak yerel deponuzun çalışma durumunu güncellemez ve mevcut çalışmanızı olduğu gibi bırakır.git pull
daha agresif bir alternatifse, etkin yerel şube için uzak içeriği indirecek git merge
ve yeni uzak içerik için birleştirme taahhüdü oluşturmak üzere hemen yürütecektir . Devam etmekte olan değişiklikleriniz varsa, bu çatışmalara neden olur ve birleşme çakışması çözüm akışını başlatır.
İle git pull
:
- Hiçbir izolasyonunuz yok.
- Yerel gelişiminizi etkiler.
- Açıkça kontrol edilmesi gerekmez. Çünkü dolaylı olarak bir
git merge
.
- Temelde güvenli değil. Saldırgan.
- Aksine
git fetch
o yalnızca etkiler nerede .git/refs/remotes
, git çekme etkileyecek hem sizin .git/refs/remotes
ve .git/refs/heads/
Hmmm ... eğer çalışan kopyayı güncellemiyorsam git fetch
nerede değişiklikler yapıyorum? Git getirme yeni taahhütleri nerede saklar?
Harika bir soru. Çalışma kopyanızdan yalıtılmış bir yere koyar. Ama yine nerede? Hadi bulalım.
Proje dizininizde (yani, git
komutlarınızı yaptığınız yerde ):
ls
. Bu, dosyaları ve dizinleri gösterecektir. Güzel bir şey yok, biliyorum.
Şimdi yap ls -a
. Bu nokta dosyalarını gösterecektir , yani .
Sizin ile başlayan dosyalar : adlı bir dizini görebilecektir .git
.
- Yapmak
cd .git
. Bu kesinlikle dizininizi değiştirecektir.
- Şimdi eğlenceli kısım geliyor; yapın
ls
. Dizinlerin bir listesini göreceksiniz. Biz arıyoruz refs
. Yap cd refs
.
- Tüm dizinlerin içinde ne olduğunu görmek ilginç, ama ikisine odaklanalım.
heads
ve remotes
. İçlerini cd
de kontrol etmek için kullanın .
- Yaptığınız
git fetch
her şey /.git/refs/remotes
dizindeki öğeleri güncelleyecektir . /.git/refs/heads
Dizindeki hiçbir şeyi güncellemez .
- Herhangi
git pull
ilk yapacak git fetch
, güncelleme öğeleri içinde /.git/refs/remotes
dizine, sonra yerel ile birleştirme ve ardından iç kafasını değiştirmek /.git/refs/heads
dizinde.
'Git getirme' kendini nerede yerleştirir? Bölümünde çok iyi bir ilgili cevap da bulunabilir. .
Ayrıca Git dalı adlandırma kuralları gönderisinde "Eğik çizgi işareti" konusuna bakın . Git'in işleri farklı dizinlere nasıl yerleştirdiğini daha iyi anlamanıza yardımcı olur.
Gerçek farkı görmek için
Sadece yap:
git fetch origin master
git checkout master
Uzak ana bilgisayar güncellenmişse, şöyle bir mesaj alırsınız:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Eğer yapmadıysanız fetch
ve sadece yaptıysanız git checkout master
, yerel git 2 taahhüt eklendiğini bilmiyordu. Ve sadece şunu söylerdi:
Already on 'master'
Your branch is up to date with 'origin/master'.
Ama bu modası geçmiş ve yanlış. Çünkü git, yalnızca bildiklerine dayanarak size geri bildirim verecektir. Henüz indirmediği yeni taahhütlerden habersiz ...
Yerel olarak şube üzerinde çalışırken uzaktan yapılan yeni değişiklikleri görmenin bir yolu var mı?
Bazı IDE'ler (örn. Xcode) süper akıllıdır ve a'nın sonucunu kullanır ve git fetch
geçerli çalışma dalınızın uzak dalında değiştirilen kod satırlarına açıklama ekleyebilir. Bu satır hem yerel değişiklikler hem de uzak dal tarafından değiştirildiyse, bu satır kırmızı ile açıklanır. Bu birleşme çatışması değil. Bu potansiyel bir birleşme çatışmasıdır. git pull
Uzak daldan önce gelecekteki birleştirme çatışmasını çözmek için kullanabileceğiniz bir kafa vuruşu .
Eğlenceli ipucu:
Uzak bir dal getirdiyseniz, örneğin:
git fetch origin feature/123
Sonra bu uzaktan kumandalar dizininize gider. Yerel dizininiz tarafından kullanılamıyor. Ancak, DWIM (ne demek istediğimi yap) ile o uzak dalı için ödeme kolaylaştırır:
git checkout feature/123
artık yapmanız gerekmiyor:
git checkout -b feature/123 origin/feature/123
Bununla ilgili daha fazla bilgi için burayı okuyun