Git - push.default “eşleştirme” ve “basit” arasındaki fark nedir


285

Git'i bir süredir kullanıyorum, ama asla kendime yeni bir uzaktan repo kurmak zorunda kalmadım ve bunu merak ettim. Ben öğreticiler okudum ve nasıl "git push" işe almak için nasıl karışık.

Sadece kullanırsam git pushişaret etmek için varsayılan bir şube (?) Bana sağladığı bu iki seçenek arasındaki fark nedir?

git config --global push.default matching
git config --global push.default simple

Eşleştirme sadece yerel repoma sahip olduğum dalları iter ve eşleşmezlerse, elimdeki yeni yerel şubeleri itmek için manuel olarak söylemeliyim, değil mi? Kullanmak için bu en iyi uygulama mı yoksa basit en iyisi mi?



1
Şimdi, sadece pull.defaulttüm bu şubeleri yerel olarak güncellemek için mevcutsa
Nogurenn

Yanıtlar:


368

git push bu yapılandırmaya bağlı olarak tüm dalları veya tek bir dalı itebilir:

Tüm dalları itin

git config --global push.default matching

Tüm dalları uzak şubeye itecek ve birleştirecek. Tüm dalları itmek istemiyorsanız, yalnızca geçerli dalı itebilirsiniz.

Sadece mevcut dalı it

git config --global push.default simple

Bu yüzden, bence, bu seçeneği kullanmak ve kod dalınızı şubeye itmek daha iyidir. Dalları manuel ve bireysel olarak itmek daha iyidir.


16
push.default current@UpAndAdam cevabını beğendim . Bunu bilmiyordu.
alanjds

4
simpleArtık bir seçenek olmadığını unutmayın . İçeri 1.7.8.4(ve daha erken?) Basmaya çalıştığınızda hataya neden olur. ancak currenthala kullanılabilir
sixty4bit

@ sixty4bit: git 1.7.1 sürümünü kullanıyorum. Kullanıyorum tracking-> geçerli dalı yukarı akış şubesine itin.
kevinarpe

@ sixty4bit Hayır, Git'in daha sonraki bir Sürümünde yer aldım, ama hangisi bilmiyorum ama (1.7) cehennem kadar eski, 2016 için bile. Böyle eski Sürümleri kullanmanızı kesinlikle tavsiye etmem.
Schmoudi

Downvoted. Üzgünüz, ancak bağlantılı sayfanın açıklaması simplemantıklı değil, bu cevapla çelişiyor ve yanlış - bu da bu cevabı kafa karıştırıcı yapıyor. Bağlantı verilen sayfa simple"dalları teker teker itecektir. Çoğunlukla mevcut dalla bağlantılı." Bu, dalları paralel olarak tersine iteceği anlamına mı geliyor? "Çoğunlukla bağlantılı" ne demektir? Ardından açıklaması simpleaçıklamasını alıntılayarak devam etmektedir matchingiçin bir vasıtaları açıklama düşünürdüm, matchingayrıca uygulanır simple. Ama belli ki bu doğru değil.
tvanc

91

GIT belgelerinden: Git Docs

Aşağıda tam bilgi verilmektedir. Kısacası, simplesadece current working branchve hatta o zaman sadece uzaktan kumandada aynı ada sahipse itecektir . Bu yeni başlayanlar için çok iyi bir ayardır veGIT 2.0

Oysa uzaktan kumandada aynı ada sahip tüm dalları yerel olarak matchingitecektir . (Mevcut çalışma alanınız dikkate alınmadan). Bu, paylaşmak istemeyeceğinizler de dahil olmak üzere potansiyel olarak birçok farklı dalın itileceği anlamına gelir.

Kişisel kullanımımda, genellikle farklı bir seçenek kullanıyorum: currentmevcut çalışma dalını itiyor, çünkü her zaman herhangi bir değişiklik için dallıyorum. Ama yeni başlayanlar için şunu öneririmsimple

push.default
Hiçbir refspec açıkça verilmezse git push'un gerçekleştireceği eylemi tanımlar. Farklı değerler, belirli iş akışları için çok uygundur; örneğin, tamamen merkezi bir iş akışında (yani getirme kaynağı itme hedefine eşittir), yukarı akış muhtemelen istediğiniz şeydir. Olası değerler:

hiçbir şey - açıkça bir refspec verilmedikçe hiçbir şey (hata) itmeyin. Bu öncelikle hatalardan daima açık olarak kaçınmak isteyen insanlar içindir.

current - alıcı uçta aynı ada sahip bir dalı güncellemek için geçerli dalı itin. Hem merkezi hem de merkezi olmayan iş akışlarında çalışır.

upstream - geçerli dalı, değişiklikleri genellikle geçerli dala entegre edilen (@ {upstream} adı verilen) dala geri itin. Bu mod, yalnızca normalde çektiğiniz depoya (yani merkezi iş akışı) aktarıyorsanız anlamlıdır.

basit - merkezi iş akışında, yukarı akış dalının adı yerel olandan farklıysa, itmeyi reddetmek için ek bir güvenlikle yukarı akış gibi çalışın.

Normalde çektiğiniz uzaktan kumandadan farklı bir uzaktan kumandayı iterken, akım olarak çalışın. Bu en güvenli seçenektir ve yeni başlayanlar için uygundur.

Bu mod Git 2.0'da varsayılan olacaktır.

eşleştirme - her iki uçta aynı ada sahip tüm dalları itin. Bu, iteceğiniz dallar kümesini hatırlamak için bastırdığınız havuzu yapar (örneğin, her zaman maint ve master'ı oraya iterseniz ve başka şubeler yoksa, ittiğiniz depo bu iki şubeye ve yerel maint ve efendinize sahip olacaktır. oraya itilecek).

Bu modu etkili bir şekilde kullanmak için, git push'u çalıştırmadan önce dışarı iteceğiniz tüm dalların dışarı itilmeye hazır olduğundan emin olmalısınız, çünkü bu modun tüm noktası tek bir seferde tüm dalları itmenize izin vermektir. Genellikle sadece bir dalda çalışmayı bitirir ve sonucu dışarı çıkarırsanız, diğer dallar bitmemişse, bu mod sizin için değildir. Ayrıca bu mod, başkaları yeni şubeler ekleyebileceği veya kontrolünüz dışındaki mevcut dalların ucunu güncelleyebileceği için paylaşılan bir merkezi depoya itmek için uygun değildir.

Bu şu anda varsayılan değerdir, ancak Git 2.0 varsayılanı basit olarak değiştirecektir.


evet, ancak push.default ayarıyla bile "$ git push origin master " yaparsanız , sadece geçerli dalı aynı adı taşıyan orijinli şubeye yönlendireceğini varsayarım ... değil mi? varsayılan bir uzaktan kumanda olduğunu da belirtmelisiniz
Alexander Mills

1
Ne elde ettiğinizi anladığımdan emin değilim. HERHANGİ BİR MOD'da git push origin masteraynı şeyi yapacağını söylerseniz . Modların ve varsayılanların noktası genellikle basitçe söylediğinizde git pushve ona bir uzaktan kumanda veya dal söylemediğinizde olan şeydir. Hangi varsayılan ayar? varsayılan push.default ayarını mı kastediyorsunuz? git sürümünde varsayılan ayar ... bunu almazsanız yorumunuz son derece belirsizdir.
UpAndAdam

'push.default Hiçbir refspec açıkça verilmemişse git push'un gerçekleştireceği eylemi tanımlar' git push origin master diyorsan daha fazla bilgi veriyorsun ve hala tarif ettiğin şeyi yapmayabilir; ayarladığınız refspec'e bağlı .. git-scm.com/book/en/v2/Git-Internals-The-Refspec
UpAndAdam

2

Git v2.0 Sürüm Notları

Geriye dönük uyumluluk notları

Ne git push [$there]zorlayacağımızı söylemediğimizde, şimdiye kadar geleneksel "eşleşen" anlambilimi kullandık (zaten aynı adda şubeler olduğu sürece tüm şubeleriniz uzaktan kumandaya gönderildi). Git 2.0'da, varsayılan değer artık "basit" anlambilimdir ve bu da şunları iter:

  • yalnızca aynı ada sahip dalın geçerli dalını ve yalnızca geçerli dal bu uzak dalla tümleştirilecek şekilde ayarlandığında, getirdiğinizle aynı uzaktan kumandayı zorlarsanız; veya

  • genellikle getirdiğiniz yerde olmayan bir uzaktan kumandayı itiyorsanız, yalnızca aynı ada sahip dalın geçerli dalı.

Bunu değiştirmek için "push.default" yapılandırma değişkenini kullanabilirsiniz. "Eşleme" semantiğini kullanmaya devam etmek isteyen eski bir zamanlayıcıysanız, değişkeni örneğin "eşleme" olarak ayarlayabilirsiniz. Diğer olasılıklar için belgeleri okuyun.

Zaman git add -uve git add -Akomut hattı eklemek için olan yollar belirtmeden bir alt içinde işletilmektedir, bu uygunluk açısından tüm ağacı üzerinde işlem git commit -a(bu komutları geçerli alt dizini sadece çalıştırmak için kullanılan) ve diğer komutlar. Say git add -u .veya git add -A .geçerli dizine operasyon sınırlamak istiyorum.

git add <path>şu ankiyle aynıdır git add -A <path>, böylece git add dir/dizinden kaldırdığınız yolları fark edersiniz ve kaldırmayı kaydedersiniz. Git'in eski sürümlerinde, git add <path>kaldırma işlemlerini yoksaymak için kullanılır. Gerçekten isterseniz, git add --ignore-removal <path>yalnızca eklenmiş veya değiştirilmiş yollar eklemeyi söyleyebilirsiniz <path>.

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.