Git push.default = current ve push.default = upstream arasındaki fark nedir?


89

Git-config için man sayfası push.default için şu seçenekleri listeler:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

Çoğu durumda, yukarı akış şubesi normalde aynı ada sahip olacağından ve aynı adlı daldan ("geçerli" ) normalde (veya her zaman, tanım gereği?) yukarı akış olacaktır. Öyleyse fark nedir?

GÜNCELLEME : git-config adam sayfası ayrımlar yapılırken bu yüzden, (bir beklendiği gibi) güncellendi orada şimdi çok daha net olabilir.


2
geliştiriciler için bunları farklılaştırmak gerçekten can sıkıcıdır, bu nedenle 'basit' tanıtıldı ve git-push için varsayılan bahavior olacak. aslında 1.7.11
sürümünde

14
En son git uyarısı push.default is unset; its implicit value is changing in Git 2.0ve matchingvs hakkında daha fazla bilgi için simplebkz. Stackoverflow.com/questions/13148066/…
Nate

iconoclaust: Düzenlememin sorunun bütünlüğünü değiştirdiğini sanmıyorum ve güncel olmayan bilgilerin sadece düzeltilmesi gerekiyor. Neden kullanıcıyı bağlantıya tıklamak gibi ekstra iş yapsın?
Flimm

Yanıtlar:


72

Sorunuzdaki farkı özetlediniz. yapılandırılmış yukarı akış dalına upstreamiter , yukarı akış dalının geçerli yerel dalla aynı ada sahip olduğunu varsayar ve bu belirli ada iter. Gerçekte, yerel bir şubenin yukarı akış izleme şubesinin yerel şubenin kendisiyle aynı ada sahip olduğunu varsaymak için hiçbir neden yoktur.current

Örneğin, birden çok veri havuzunda veya birçok ortak geliştirici uzaktan kumanda üzerinde çalışıyorsanız, sık sık gibi aynı daldan farklı çatalları, izleme sonunda allen-masterveya susan-masterparça, her ikisi de mastersırasıyla Allen ve Susan deposundan dalı. Bu durumda, currentbu şube adları uzaktan kumandalarında bulunmadığından yanlış ayar olacaktır. upstreamancak, gayet iyi çalışırdı.

Daha pratik bir örnek a hem izleme olabilir developmentve productiondeposu. İş akışınız her biri için farklı bir ana hat dalı kullanabilir, ancak bu kafa karıştırıcı olabilir. Bir kod entegratörü olduğunuzu ve her iki deponun masterşubelerini ayrı ayrı izlemek istediğinizi varsayalım .

git checkout -b production --track production/master
git checkout -b development --track development/master

Artık, her ikisi de masteradlandırma kuralını kullanmayan, kendi depolarını izleyen iki dalınız var . Şube isimleriyle ilgili çok az kafa karışıklığı var: Neyi izlediklerini açıkça anlatıyorlar. Yine de, push.default = currentuzaktan kumanda bir developmentveya productiondal içermediği için mantıklı olmaz .


6
Ne zaman upstreamtercih edildiğine dair iki örnek veriyorsun current. Bunun oldukça açık olduğunu düşünüyorum, bu nedenle tersi durum için bir örnek vermeyi tercih etmelisiniz.
AndreKR

1
@AndreKR AFAIK current, yeni bir geliştirici olmanız durumunda daha iyidir çünkü git configözellikle bir yerden klonladıysanız çok fazla şeye ihtiyacınız yoktur . zaten mevcut değilse , sizincurrent için uzak depodaki eşsesli şubeleri iter veya oluşturur-sonra- gönderir , oysa aynı adlı bir dal zaten mevcut değilse bunu doğrudan yapmayı reddeder. Yawar'ın cevabında belirtildiği gibi bir yukarı akış kolu açıkça ayarlanmadıkça veya başka şekilde ayarlanmadıkça bu durumda aynı davranışa sahiptir . simpleupstream
Nadiren 'Monica Nerede' Needy

6

current mevcut şubeyi uzak depoda aynı adı taşıyan bir şubeye itecektir.

upstream mevcut şubeyi yukarı akış şubesine itecektir.

Yukarı yöndeki dal, açıkça veya örtük olarak mevcut şubenizden yukarı akış olarak tanımlanan bir dalıdır. Bu, varsayılan olarak itme ve çekme işleminin bu dal ile senkronize olacağı anlamına gelir. Yukarı akış şubesi, mevcut şubenin kendisi ile aynı depoda olabilir. Yerel ana dalınızı yerel özellik (konu) dalınızdan yukarı akış olarak ayarlamak ve aralarında itip çekmek gibi ilginç şeyler yapabilirsiniz .

Örtülü yukarı akış kurulumu, branch.autosetupmergeyapılandırma değeri aracılığıyla yapılır . Belgeleri git configyardım sayfasında bulabilirsiniz. Komut -useçeneği ile açık yukarı akış kurulumu yapılır git branch. Ayrıntılar için yardım sayfasına bakın.


Sanmıyorum branch.autoSetupMergeaynı düşünmek yapar -u/ ' --set-upstream. En azından, dokümantasyonda git push'un -uvarsayılan olarak çağrılmış gibi davranmasına neden olduğunu ima eden hiçbir şey görmüyorum , ki bana öyle geliyor ki söylüyorsunuz. Ne demek istediğini açıklayabilir misin?
waldyrious

@waldyrious emin; Bir uzaktan izleme şubesini teslim aldığınızda, branch.autoSetupMergeyapılandırma varsayılan olarak yeni bir yerel şube oluşturur ve bunun yukarı akışını uzaktan izleme dalı olarak ayarlar. Bu örtük eylem , aynı şeyi biraz farklı sözdizimleriyle yapan -t( --track) veya -u ...( --set-upstream-to=...) bayrakları kullanılarak açıkça yapılabilir .
Yawar

1
Bu soru hakkında beri - Burada ne olduğunu görmek için git push, ben (yanlışlıkla) hakkında konuşuyorlardı farz -useçeneği git pushyerine, -useçeneği git branch. Maalesef karışıklık :) için
waldyrious
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.