Kafa karıştırıcı Git terminolojisi
(jvns.ca)- Git, uzun süre kullanılsa bile kafa karıştıran çok sayıda yinelenen ve yeniden kullanılan terim içerir; bu yüzden yalnızca komutları ezberlemek gerçek davranışı öngörmek için yeterli değildir
HEAD,heads, detached HEAD,ours/theirs,../...gibi aynı kelime ve semboller, bağlama göre farklı anlamlara dönüşürindex,staged,cachedifadelerinin hepsi.git/indexile bağlantılıdır; ancakreset,revert,restorebenzer isimlerine rağmen commit geçmişi, çalışma ağacı ve branch işaretçileri üzerinde farklı etkiler yaratırmainbranch'inin bir remote'u takip etmesi ileorigin/maingibi bir remote-tracking branch aynı şey değildir vecheckoutbranch değiştirme ile dosya geri yüklemeyi tek bir komutta bir araya getirir- Git'i anlamak için tek tek komutlardan çok, branch, reference, commit, index ve remote izleme durumunun nasıl birlikte çalıştığını anlatan iç modele bakmak gerekir
HEAD, branch'ler ve detached HEAD
- Git'te heads branch'leri ifade eder ve dahili olarak branch'ler
.git/refs/headsdizininde saklanır- Resmî Git sözlüğü branch'i onun üzerindeki tüm commit'ler, head'i ise en son commit olarak ayırır; ancak bunlar aynı şeyi görmenin iki farklı yolu olarak düşünülebilir
HEAD, mevcut branch'i işaret eder ve.git/HEADiçinde saklanır- “
headbir branch'tir,HEADise mevcut branch'tir” ifadesi Git terminolojisindeki karışıklığı tek başına iyi gösterir
- “
- detached HEAD state,
HEAD'in bir branch yerine doğrudan bir commit ID'yi işaret ettiği durumdur- Bir tag checkout edildiğinde, tag bir branch olmadığı için detached HEAD durumuna girilebilir
- Bu durumda
git pullçalışmaz vegit pushda özel bir yöntem kullanılmadıkça çalışmaz git commit,git merge,git rebase,git cherry-pickyapılabilir; ancak yeni commit'ler herhangi bir branch'e bağlı olmayacağı için sonradan bulunmaları zorlaşabilir- Yeni bir branch oluşturarak veya mevcut bir branch'e geçerek detached HEAD durumundan çıkılabilir
merge ve rebase'de değişen ours ve theirs
- Çakışma çözümünde
git checkout --ours file.txt, dosyanın “ours” tarafını seçer; ancak merge ve rebase'in referans noktaları birbirinden farklıdır - merge'de mevcut branch
ours, birleştirilmekte olan branch isetheirsolur- Örneğin
git checkout merge-into-ourssonrasındagit merge from-theirsçalıştırılırsa mevcut branchoursolur
- Örneğin
- rebase'de mevcut branch
theirs, rebase hedefi olan branch iseoursolur- Örneğin
git checkout theirssonrasındagit rebase oursçalıştırılırsa hedef branchoursolur
- Örneğin
- Bu fark,
git rebase mainkomutunun dahili olarak mevcut branch'in commit'lerinimainbranch'inin bir kopyası üzerine tekrar tekrar merge etme biçimiyle ilişkilidir- İlgili örnek,
git rebasekomutunugit mergeile uygulayan shell script'te yer alır
- İlgili örnek,
- ourstheirs,
oursvetheirsterimlerini kısaca açıklar- VSCode'daki “current change” ve “incoming change” ifadeleri de aynı nedenle kafa karıştırıcı olabilir
Remote durum mesajları ve fast-forward
Your branch is up to date with 'origin/main'ifadesi, mevcutmain'in remote'daki en güncel durum olduğu anlamına gelmez- Bunun anlamı, son
git fetchveyagit pullanındakiorigin/mainile yerel branch'in aynı olduğudur - Son fetch 5 gün önce yapıldıysa, aslında “5 gün önceki duruma göre” günceldir
- Bunun anlamı, son
- Git, son fetch zamanına ilişkin bilgiyi reflog içinde saklar; ancak durum mesajında “son fetch'e göre” zamanı göstermez
can be fast-forwarded, remote branch'in yerel branch'in ilerisinde olduğunu ve yerelde ayrı commit olmadığı için yalnızca işaretçinin ileri taşınabileceğini ifade eder- Örneğin
mainA-B-C,origin/mainiseA-B-C-D-Eise,git pullsonrasında ikisi deA-B-C-D-Eolur - Bu durumda merge çakışması yaşanmaz
- Örneğin
- fast-forward mümkün değilse iki branch birbirinden ayrılmıştır
- Örneğin
mainüzerindeorigin/main'de olmayan birXcommit'i varsa veorigin/mainüzerinde demain'de olmayanDveEvarsa fast-forward mümkün değildir - Bu durumda Git, iki branch'in diverged durumda olduğunu ve her birinde farklı sayıda commit bulunduğunu belirtir
- Örneğin
Commit seçme sözdizimi: ^, ~, .., ...
HEAD^veHEAD~ikisi de 1 önceki commit'i işaret ederHEAD^^^,HEAD~~~,HEAD~3ifadelerinin hepsi 3 commit önceyi gösterir
- merge commit gibi birden çok ebeveyni olan commit'lerde
HEAD^2,HEAD^3farklı anlamlara gelirHEAD^birinci ebeveyndirHEAD^2ikinci ebeveyndirHEAD^3üçüncü ebeveyndirHEAD~3, ebeveynin ebeveyninin ebeveyni anlamına geldiği içinHEAD^3ile aynı değildir
git log main..testvegit log main...testde birbirinden farklı çalışırmain..test, yalnızcatest'te bulunan commit'leri gösterirtest..main, yalnızcamain'de bulunan commit'leri gösterirmain...test, iki tarafta da yalnızca kendine özgü olan commit'leri birlikte gösterir
git diffiçinde..ve...,git log'dakinden farklı yorumlanırgit diff test..main,testtarafındaki vemaintarafındaki değişikliklerin tamamını içerecek şekilde karşılaştırırgit diff test...main, ortak atayımaintarafının ucu ile karşılaştırır ve yalnızca tek taraflı diff gösterir
- Nokta gösterimindeki karışıklık pain in dots içinde de ayrıca ele alınır
reference, refspec, tree-ish
- Git'te reference birden fazla anlamda kullanılır
main,v0.2gibi branch ve tag'ler- Mevcut branch'i işaret eden
HEAD HEAD^^^gibi commit ID olarak çözümlenen ifadeler
- Git belgeleri
HEAD^^^gibi ifadeleri teknik olarak “revision parameters” diye adlandırır; ancak günlük kullanımda bunlar da reference gibi ele alınabilir - symbolic reference,
HEADörneğinde olduğu gibi başka bir referansı işaret eden referanstırHEAD, Git'in temel komutlarının davranışını güçlü biçimde etkileyen merkezi bir kavramdır
.git/configiçindeki remote yapılandırmasında refspec bulunur- Örneğin:
+refs/heads/main:refs/remotes/origin/main - Çoğu durumda varsayılan
git cloneveyagit remote addtarafından oluşturulan değer olduğu gibi kullanılır
- Örneğin:
tree-ish,git checkout THING .içindekiTHINGyerine gelebilecek nesneyi ifade eder- commit ID
main,HEAD^^,v0.3.2gibi commit referanslarımain:./docsgibi bir commit içindeki alt dizin- Pratikte bunu çoğu zaman “bir commit veya commit referansı” olarak anlamak yeterlidir
index, staged, cached
index,staged,cachedifadelerinin hepsi.git/indexile ilgilidir.git/index, değişikliklergit addile stage edildiğinde kullanılan dosyadır
- Aynı şeyi ifade eden birden çok terim farklı komutlara dağılmıştır
git diff --cachedgit rm --cachedgit diff --staged.git/index
- Ancak
--indexve--cachedbayrakları her zaman aynı anlama gelmez- Git baş bakımcısı Junio Hamano'nun yazısı ayrıntılı farkları açıklar
- index, performans gerekçeleriyle untracked files'ı da listeler; fakat genel olarak staging area'nın untracked files içerdiği düşünülmez
reset, revert, restore
reset,revert,restorebenzer kelimeler olsa da Git'te etkiledikleri şeyler farklıdırgit revert COMMIT, mevcut branch üzerindeCOMMIT'in tersini yapan yeni bir commit oluştururCOMMIT3 satır eklediyse yeni commit bu 3 satırı siler
git reset --hard COMMIT, mevcut branch'i zorlaCOMMITanındaki duruma geri döndürürCOMMITsonrasındaki yeni değişiklikleri sildiği için son derece tehlikeli bir işlemdir
git restore --source=COMMIT PATH,PATHaltındaki dosyalarıCOMMITzamanındaki hâline döndürür- Başka dosyaları veya commit geçmişini değiştirmez
git reset --hardilegit restore .tek başına kullanıldığında çoğu zaman benzer davranır; ancakgit reset --hard COMMITilegit restore --source COMMIT .tamamen farklı çalışır
track, remote-tracking branch, untracked files
- Git, track kelimesini üç farklı şekilde kullanır
git statusiçindekiUntracked files:, Git tarafından izlenmeyen ve herhangi bir commit'e dahil edilmeyen dosyaları ifade ederorigin/maingibi remote-tracking branch, songit pullveyagit fetchanında remoteoriginüzerindekimain'in işaret ettiği commit ID'yi tutan yerel referanstır- “branch foo set up to track remote branch bar from origin” ifadesindeki gibi, yerel bir branch bir remote branch'i takip edecek şekilde yapılandırılabilir
main'in remote'u takip eden bir branch olması ileorigin/main'in bir remote-tracking branch olması aynı şey değildirmaingerçek bir branch olduğu için üzerinde commit oluşturulabilir ve merge yapılabilir.git/configiçinde remotemain'i takip edecek şekilde ayarlanırsagit pullvegit pushdaha rahat kullanılabilir
origin/main, adına “remote-tracking branch” dense de normal bir branch değildir- Üzerine doğrudan commit yapılamaz
- Yalnızca
git pullveyagit fetchile remote'daki en güncelmaindurumu alındığında güncellenir
checkout, reflog, merge/rebase/cherry-pick
git checkout, birbirinden farklı iki işi tek komutta toplargit checkout BRANCH, branch değiştirirgit checkout file.txt,file.txtüzerindeki unstaged değişiklikleri atar
- Git bu karışıklığı azaltmak için işlevleri
git switchvegit restoreolarak ayırdı; ancak eskicheckouthâlâ kullanılabilir reflog, reference log anlamına gelir ve bir reference'ın geçmişte neyi işaret ettiğinin kaydıdır- reference; branch, tag ve
HEAD'i kapsayan geniş bir terimdir - reflog, önemli bir branch'i yanlışlıkla silmek gibi çok kötü Git durumlarından çıkmaya yardımcı olabilir
- reference; branch, tag ve
- merge, rebase ve cherry-pick commit'leri farklı şekillerde birleştirir
- merge, iki branch'i birleştiren tek bir yeni commit oluşturur
- rebase, mevcut branch'in commit'lerini hedef branch'in üzerine tek tek kopyalar
- cherry-pick, rebase'e benzer; ancak sözdizimi farklıdır ve commit'i mevcut branch'e kopyalar
git rebase --onto main otherbranch mybranch,mybranchüzerindeki commit'lerin yalnızca bir kısmınımainüzerine taşımak için kullanılabilir- Örnek yapıda yalnızca
FveG'yimainüzerine rebase etmek istendiğinde kullanılabilir - Üç branch adı içerdiği için hatırlaması zor bir sözdizimidir
- Örnek yapıda yalnızca
commit ve diğer kafa karıştırıcı terimler
commit, Git'te hem fiil hem isim olarak kullanılır- Fiil: “sık commit yap”
- İsim:
mainüzerindeki en son commit
- Bir Git commit'i üç farklı şekilde görülebilir
- Tüm dosyaların mevcut durumunun anlık görüntüsü
- Ebeveyn commit'e göre diff
- Ondan önceki tüm commit'lerin geçmişi
- Komutlar commit'i farklı biçimlerde ele alır
git show, commit'i diff gibi ele alırgit log, commit'i history gibi ele alırgit restore, commit'i snapshot gibi ele alır
blob,tree,origin,upstream,downstream,fetchilepullarasındaki ilişki,stash,worktree,subtree,submoduleda kafa karıştırıcı Git terimleri arasındadır- GitHub terminolojisinde “pull request”, “squash and merge”, “rebase and merge” sık verilen kafa karıştırıcı örneklerdendir
Tekrarlanan karışıklığın üç ekseni
- Özellikle kafa karıştırıcı Git terimleri üç başlıkta özetlenebilir
headbir branch'tir,HEADise mevcut branch'tir- “remote tracking branch” ile “bir remote'u takip eden branch” birbirinden farklıdır
index,staged,cachedifadelerinin hepsi aynı şeyi işaret eder
- 2012 tarihli the most confusing git terminology yazısı da Git terminolojisinin CVS ve Subversion terimleriyle nasıl bağlantı kurduğunu ele alır
- Git terminolojisindeki karışıklık bazı özel özelliklerle sınırlı değildir; temel işlevlerin geneline tekrar tekrar yayılır
- Özellikle branch'lerden söz ederken “tracking” birden çok anlamda kullanıldığı için ilk bakışta aradaki farkı görmek zordur
- Bazı açıklamaların Git'in az kullanılan köşelerine değindiği ve bu yüzden küçük hatalar içerebileceği notu da düşülür
1 yorum
Hacker News görüşleri
Branch adı,
HEAD, etiketlerin hepsi birer pointer’dır.HEAD, şu anda baktığınız commit’i gösterir;my-featuregibi bir branch adı da o branch’in en son commit’ini gösterir.mainüzerindegit checkout -b my-featureyaptığınızdamain,my-featureveHEADhep birliktemain’in en son commit’ini göstermeye başlarmy-branchüzerinde her commit attığınızdaHEADvemy-branchyeni commit’i gösterecek şekilde ilerler. detached HEAD,HEAD’in gösterdiği commit’i hiçbir branch’in göstermediği durum demektir. Etiket ile branch arasındaki fark ise etiketin belirli bir commit’i gösterip hareket etmemesidirBir diğer kafa karıştırıcı nokta da, birçok komutun tutarsız görünmesinin nedeninin Git’in varsayılan argümanlar kabul etmesi olmasıydı.
git checkout file.txt,git checkout HEAD -- file.txtile aynıdır;my-branchüzerindeykengit rebase maindegit rebase main my-branchile aynıdır. Yalnız ikinci biçim başka branch’lerdeyken de çalıştırılabilirSon olarak, her şey birbirine girdiğinde sizi ne kadar garip bir durum olursa olsun oradan çıkarabilecek komut
git reflog’dur.HEAD’in işaret ettiği tüm commit’leri gösterir. Yine de Git’in bu karmaşayı kabul edip daha az şaşırtıcı ve daha basit arayüzlü komutlar üretmeye çalışması sevindiricireflogadı da buradan gelirAyrıca Git kullanan birçok kişinin pek aklına gelmeyen nokta şu: getirdiğiniz uzak branch veya etiket ref’leri de sonuçta birer ref’tir; yani ref adının kullanılabildiği her yerde onlara da başvurabilirsiniz
Örneğin “bu branch’te ne varsa umurumda değil, fast-forward da yapma, merge de yapma, rebase de yapma, sadece yerel branch’i uzak içeriğiyle ezip geç” demek istiyorsanız şöyle yapabilirsiniz:
git checkout foo,git reset --hard origin/fooHEADpointer’ı commit’i doğrudan göstermez; normaldemy-branchgibi bir branch pointer’ını gösterir, o branch pointer’ı da commit’i gösterir. detached HEAD durumu bunun istisnasıdırmy-branchüzerinde commit attığınızdaHEADvemy-branchikisi birden yeni commit’e taşınmaz;HEAD,my-branchpointer’ını göstermeye devam eder, yalnızcamy-branchyeni commit’i gösterecek şekilde ilerler. TabiiHEAD’denmy-branchüzerinden commit’e giderseniz yeni commit’e ulaşırsınızdetached HEAD,
HEAD’in branch pointer’ı yerine commit’i doğrudan gösterdiği durumdur. detached HEAD durumunda daHEADile branch pointer’ı aynı en son commit’i birlikte gösterebilir.git log --decorateçıktısında normalde görülen(HEAD -> my-branch)yerine en son commit üzerinde(HEAD, my-branch)gibi görünürBuna karşılık açıklamalı etiketler mesaj, zaman damgası, SHA vb. içerebilir. Bunlar gerçek Git nesneleridir ve commit nesnelerine oldukça benzer davranırlar, ama genelde yine başka bir Git nesnesine, çoğunlukla bir commit’e referans verirler
git rev-parse HEADçalıştırıp çıkan dizgeyi güvenli bir yere kopyalamak da iyi olabilirSon durumda, doğru olduğundan emin olduğunuz hâli tam olarak işaretlediğiniz hissi verir. Genelde kaosun birkaç adım içine girdiğiniz bir noktaya değil, son iyi duruma geri dönebilirsiniz. Tabii
git gcveyagit filter-branchgibi şeyleri dikkatsizce kullanmadığınız varsayımıylaŞaka gibi ama aslında değil: Git kullanmak için gerçekten bilgisayar bilimi diploması gerekiyor denmesi bütünüyle yanlış sayılmaz. Git’in varsayılan argümanları çok tutarsız bir kullanım deneyimi yaratıyor, buna katılıyorum
git checkout .,git reset --hard/soft,git cleanuphepsi aşırı benzer görünüyor ama gerçekte çok farklılar. Yine de Perforce veya SVN’ye kıyasla hâlâ Git’i tercih ederim. Eskiden Mercurial’ı biraz daha çok severdim ama bugün de öyle mi bilmiyorumgit reflogkraldır ve gerçeği gösterirLinus Torvalds’ın, insanların üstüne daha kullanıcı dostu bir katman koymadan Git’i doğrudan kullanmaya başlamasına şaşırdığını yazdığı bir şeyi okuduğumu hatırlıyorum. Sektör biraz öz eleştiri yapabilseydi Git’i seçmenin hata olduğunu kabul eder ve başka bir sürüm kontrol sistemine geçerdi. Sadece metin saklayan bir araç için bu kadar zaman harcamaya değmez
Elbette daha iyi olabilir. Yine de Git’in aldığı nefret bana hep şaşırtıcı geliyor. Git müthiş bir araç ve Word veya Google Docs gibi geliştirici olmayanlar için yapılmış araçların çok ilerisinde
Belki de Subversion’ın kral olduğu zamanı hatırlayacak kadar yaşlı olduğum içindir
Her hafta iş arkadaşlarımın Git yüzünden kafasının karıştığını görüyorum, internette yardım isteyen gönderiler görüyorum, burada olduğu gibi basit olması gereken şeyleri yeniden açıklamaya çalışan başka yazılar görüyorum
Kod yazarken SVN, TFVC, Perforce vb. sistemlerde kendi yarattığı karmaşayı geri almak için saatlerini harcayan birini hatırlamıyorum
Araçlar hayatı kolaylaştırmak için vardır. Bunu yapamıyorsa zaman ayırmaya değmez
Keşke hâlâ böyle bir çeşitlilik olsaydı. Git tek kültürü, Git’in yerini almaya çalışan bir şeyin önce Git’i yeniden uygulamak zorunda olması anlamına da geliyor. Bu yüzden ASCII ya da Scroll Lock tuşu gibi, Git’e neredeyse sonsuza kadar bağlı kalıyoruz.
Asıl endişe, GitHub’ın fazla iyi olması; GitHub, Git’i metin yönetim motorundan ayırıp başka motorlara da izin vermediği sürece Git’e bağlı kalacağız.
https://trolololo.xyz/github
https://news.ycombinator.com/item?id=38098109
Sızdıran soyutlama gibi bir terim.
cachediyordu ve bu en bilgisayar bilimi kokan terimdi.Sonrasında Junio bunu, dağıtık sürüm kontrol sistemine daha özgü olan
indexolarak değiştirmiş gibi görünüyor; kullanıcıların çoğu ise buna staging area diyordu. Artık bu terim evrimi, Git’in arayüzünde ve iç yapısında fosil gibi kalmış durumda.pullyapıyorum.origin/master, origin üzerindeki master değil; en son bilinenorigin/masterın işaret ettiği commit demek. Bu değerfetchsırasında güncellenir vepullbunu otomatik olarakfetcheder.ls -l .git/refs/remotes/origin/masterçıktısına bakarsanızorigin/masterın sistemimdeki bir dosyadan ibaret olduğunu görürsünüz. Ne zaman değiştiğini de görebilirsiniz. Sihirli biçimde güncellenmez.git fetch originyaptığınızda değişiklik varsa zaman damgası ve içerik değişir. Bunucat .git/refs/remotes/origin/masterile görebilirsiniz.Git’in temeli son derece basit; çekirdek veri yapıları ve birkaç işlemi bir gün içinde uygulayabilirsiniz. Bunu bilmek gerçekten değerli. Her nasılsa Git, oldukça basit bir çekirdeğin üstüne çok karmaşık bir kullanıcı arayüzü inşa etmiş.
masterdalını siliyorum. Genelde zatenmastera push edemiyorsunuz ya da her durumda doğrudanmasterüzerinde çalışmak istemiyorsunuz. O hâlde yerelde değiştirilebilir birmasterdalı tutmanın anlamı yok.Bu yüzden sadece
origin/masterı güncellemek yeterli oluyor ve bunun içinfetchkâfi.git fetch && git pull3 yıl sonra emekli olup bu bozuk çöplükten elimi eteğimi çekebileceğim günü bekliyorum.
git statusçıktısını ayrıştıran bir projem var;--porcelainbayrağını ekleyince gerçekten çok yardımcı oldu. Daha kısa ve programların ayrıştırması daha kolay bir çıktı üretiyor.Daha kaç komutta makine dostu çıktı olduğunu merak edip git-scm’deki “Git Internals - Plumbing and Porcelain” sayfasına kadar gittim. Kısa özeti şu: Git baştan beri cilalı bir sürüm kontrol sistemi olmaktan çok, sürüm kontrolüyle uğraşan araçlar kümesi olarak yazılmış.
Git’i ilk dönemlerinden beri kullanan birçok kişi, sürüm kontrol işlerini bu düşük seviye komutlarla yapmayı öğrendi ve bu çalışma şeklini başkalarına da aktardı. Bu, plumbing katmanı. Daha sonra Git daha rafine bir katman oluşturdu ve buna porcelain dendi.
Hâlâ hangi komutun hangi katmana ait olduğunu tamamen bilmiyorum ama son birkaç yılda önerilen yeni çalışma akışlarını anlamama yardımcı oldu. Kendi çalışma akışımı değiştirirken de daha iyi karar vermemi sağlıyor.
https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Po...
Ne yazık ki daha hızlı olsun diye bu UI’yi hardcode ettiler ama iyileştirmediler.
Geriye dönüp bakınca, ilk başta kesinlikle aşırı kafa karıştırıcı gelmiş olmalı; ama havalı görünmek için öyle değilmiş gibi davrandım sanırım.
https://news.ycombinator.com/item?id=28143078
“Your branch is up to date with ‘origin/main’” aslında biraz yanıltıcı.
mainbranch’inin güncel olduğu anlamına gelecek şekilde anlaşılabilir, ama gerçekte öyle değilYine de buna fazla “teknik olarak konuşursak” yüklemeye gerek yok. İki general problemi burada geçerli değil mi? Gerçekten titiz davranırsanız tam bu anda “güncel” olup olmadığını bilemezsiniz.
statusöncesindefetchyapsanız da aynı şey geçerliO hâlde makul beklenti nedir? Bilgisayarımdaki nesne veritabanındaki ref’in, en son kontrol ettiğim anda uzaktaki başka bir nesne veritabanındaki ref ile aynı olduğunu bilmek kadar bir şey
Basit bir
statusçağrısı ağ üzerindenfetchyapamaz ya da kullandığınız aracın temel çalışma ilkesini her seferinde size hatırlatamaz. Benim görüşüm bu. Ama şaşırtıcı şekilde StackOverflow yanıtındaki birçok yorum tam olarak bu ikisinin gerekli olduğunu düşünüyor“is up to date with the origin’s main as of your last fetch 5 days ago” gibi bir ifade daha makul olurdu. Çünkü sadece en son
fetchişleminin ne kadar önce yapıldığını söyler[1] https://stackoverflow.com/questions/27828404/why-does-git-st...
Bir şey daha:
ORIG_HEAD’in,FETCH_HEADgibi “origin’in head’i” ile ilgili olduğunu sanıyordum. Ama değilmiş. Bu “pseudoref”, rebase gibi daha karmaşık yeniden yazımlardan önce bir kayıt noktası olarak kullanılıyor gibi görünüyor ve reflog ortaya çıkmadan önce uygulanmış. Muhtemelen “original head” anlamına geliyor“Your branch is up to date with ‘origin/main’” teknik olarak doğru, ama up to date ifadesi üstünkörü okunduğunda iki şeyi ima ediyor.
main,origin/mainile aynı veorigin/mainde güncel; yani komut sırasında güncellenmiş ya da otomatik olarak güncel tutuluyormuş ve yakın zamanda senkronizasyon başarılı olmuş gibi bir his veriyorBu, bir CPU çevrimi boyunca doğru olması gereken makine tarafından okunacak bir sinyal değil; kullanıcıya gösterilen bir durum mesajı. Ağ teorisine kadar gitmeden de bu yorum makul
“Up to date”, mekânsal olmaktan çok zamansal olarak yetişmiş olma anlamına daha yakın. Lokal branch konumu, “bu branch neyi işaret ediyor” şeklindeki mekâna daha yakın; uzak ref durumu ise “uzak ref’i en son ne zaman güncelledim” şeklindeki zamana daha yakın. Elbette bu çok öznel ve ikisi de her iki anlamı da taşıyabilir
Daha iyi ifadeler şunlar olabilir: “Your branch matches origin/main”, “Your branch’s head is the same as origin/main”, “Your branch is pointing to the same commit as origin/main”. Bunlar açıklık ile lafı uzatma arasında bir uzlaşma. Buna, yazarın önerdiği gibi parantez içinde “remote ref last updated 5 days ago” da eklenebilir
statusçağrısının ağ üzerindenfetchyapmasının sinir bozucu olduğu görüşüne katılmıyorum. Bence ağ işlemleri açıkça belirtilmiş olmalı, örtük olmamalı.git statusçalıştırdığımda dosya sistemindeki depomun durumunu bilmek istiyorumBaşka bir remote’da neler olduğunu öğrenmek istiyorsam kendim
fetchyapar, sonra karşılaştırırımstatuskomutunun başlatıldığı an itibarıyla en güncel bilgiyi almak. Bilgi terminale yazdırılırken bir yarış durumu olabilir, ama bu çok küçük bir zaman penceresiGenel olarak bu,
fetchistemek anlamına geliyor. İki general problemi yalnızca remote tarafı için geçerli. Remote, istemcinin veriyi aldığını teyit etmezse bir süre yeniden göndermeyi sürdürebilir. Bu istemcinin sorunu değilİstemci sunucudan veriyi alamazsa doğru davranış muhtemelen beklemek, zaman aşımından sonra da hata vermektir; şu anda
fetchmuhtemelen zaten bunu yapıyordurBu araç sık sık paylaşılıyor ve burada da çok uygun. Git’in iç modelini ve çeşitli komutların etkisini görselleştiriyor
https://learngitbranching.js.org/
Bu araçla 10 dakikada öğrendiklerim, ondan önceki yaklaşık 10 yıllık Git deneyimimden daha fazlaydı. Kesinlikle tavsiye ederim
“pull”, uzak değişiklikleri lokal depoya birleştirme eylemi. Kullanıcının gerçekten istediği şey, sunucunun kendi uzak değişikliklerini bir branch’e birleştirmesi. GitLab’daki “merge request” daha doğru bir ifade
Birinin
fetchyaptıktan sonra commit’lerin kaybolduğunu gördüğüne şahit oldum. Depo zaman açısından geriye gittiği için gizlenmişlerdi. Git bu tür ayrıntılarıstatusiçinde saklıyor;git-promptya dapowerline-shellkullanmıyorsanız karanlıkta çalışıyor gibisinizgit-request-pull(1)içinde kalan özgün fikir, hepimizin kernel.org/git ya da redhat.com/git gibi yerlerde kendi Git depolarımızı barındırdığı ve birbirimizden farklı sunucularda, organizasyonlarda ve alan adlarında bulunan depolardan pull yapmalarını e-postayla talep ettiğimiz dönemden geliyorGitHub, Git’in
request-pullkomutundan ilham aldı, ama bunu bir GitHub deposundan başka bir GitHub deposuna birleştirme şeklinde yeniden yorumladıEn azından ben hep böyle okudum
Özetle, bu sunucuya yapılan bir istek değil, başka bir kişiye yapılan bir istek. Projeye katkı sunmak istediğiniz değişiklikleri incelemesi için karşı taraftan benim branch’imi pull etmesini istiyorsunuz
[0] https://git-scm.com/book/en/v2/Distributed-Git-Contributing-...