git ile aynı anda birden fazla şubeye nasıl çekilir?


13

Bir repoda, aralarında "orijin / master" ve "orijin / gelişim" gibi uzak dalları takip etmek üzere kurulmuş birden fazla dal var.

Hem master hem de geliştirmenin aynı anda birleştirilmesini (hızlı iletilmesini) istediğimi belirtmek mümkün mü?

git pullŞimdi ne zaman böyle bir şey elde:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

tüm uzak dallar getirilir, ancak yalnızca şu anda bulunduğum dal ilgili uzak dalıyla birleştirilir.

Yani yapmam gerek git checkout master...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... ve sonra git pulltekrar, sonra da istediğiniz sonucu elde etmek için tekrar geliştirmeye geri dönün.

Bu adımları yapan takma adlar / komut dosyaları yapabileceğimi biliyorum. Ancak, hataya eğilimli ve çok verimli olmadığı için, mümkünse bundan kaçınmak istiyorum .
Düzenleme: Tamam bunu yeniden ifade edeyim. Amacım git komut dosyası / takma özelleştirme cesaretini kırmak veya kaşlarını çatmak değildi. Varsa yerleşik bir çözümü tercih ederim :)


Denedim git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/masterama bu uzak ustanın gelişmek için birleşmesine neden oldu ..
Superole

1
Neden hataya açık veya verimsiz olur? Git'in bu şekilde özelleştirilmesi amaçlanmıştır. BTW, her bir şubeyi kontrol etmek zorunda kalmamak için, her bir şubeye ve ardından pullbir fetcha'ya bölmek isteyebilirsiniz merge.
jjlin

@jjlin iyi eğer verimlilik konusunda yardımcı olabilir her dalı kontrol etmeden yapabilirim. Hataya yatkındır, çünkü yanlış gidebilecek şeylerin matrisi ve komut dosyasının geri kalanı üzerindeki etkileri biraz karmaşıktır. Güvenli hale getirmenin mümkün olmadığını söylemiyorum, ama bir değiş tokuş olurdu. Bu yüzden eğer varsa yerleşik bir çözümü tercih ederim :)
Superole

Yanıtlar:


11

git fetchŞubelerinizi tek bir komutla hızlıca birleştirmek için refspecs ile kullanılan bir diğer ad ayarlayabilirsiniz . Bunu kullanıcı .gitconfigdosyanızda bir takma ad olarak ayarlayın :

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

Kullanımı: git sync.

İşte neden çalışıyor:

  1. git checkout --quiet HEADmevcut taahhüdünüzü doğrudan denetler ve sizi bağımsız bir kafa haline getirir . Bu şekilde, çalışıyorsanız masterveya developçalışma kopyanızı bu dal işaretçilerinden ayırır ve taşınmasına izin verirsiniz (Git, çalışma kopyanız kullanıma alınmışken şube referanslarını taşımanıza izin vermez).

  2. git fetch origin master:master develop:developyerel deponuzdaki ve dalları fetchhızlı ileri sarmak için refspecs kullanır . Sözdizimi temel olarak Git'e "burada formun bir yansımasıdır, onu alıp hızlı bir şekilde ileriye götürün " der . Yani takma addaki kaynaklar şubelerden , hedefler ise bu şubelerin yerel repo versiyonlarıdır.masterdevelop<source>:<destination><destination><source>origin

  3. Son olarak, git checkout --quiet -önceki komutlarda bir hata olup olmadığına bakılmaksızın en son bulunduğunuz dalı kontrol eder. Yani masterkoştuğunuzda yanınızdaysa git syncve her şey başarılı olursa, bağımsız kafa durumunu bırakacak ve yeni güncellenmiş olana bakacaksınız master.

Git için cevabımı da görün : yerel bir şubeyi kontrol etmeden güncelle? .


Burada müstakil büyüyü tam olarak anlamıyorum, geliştirme kontrol edildiğinde neden imleci hareket ettiremiyorsunuz? ... her neyse bunu denedim ve şu an işe yarıyor gibi görünüyor "Ben 1 şubesi ile 'senin şube / kökeni' geliş önde olduğunu" alırım.
Superole

... bir dahaki sefere çektiğimde çözüldü
Superole

@ Takma ad kullandığınızda hangi dal önde gidiyor origin/develop? Yerel developşubeniz olsaydı mantıklı olmazdı . Ayrıca için işaretçi master hareket ettirilebilir bunun ise developo teslim edilir, nokta eğer ki mastero, teslim edilir o zaman olamaz hızlı ileri masterki senin çalışma kopyayı etkiler çünkü böylece çalışmaya kopyayı ayırmak neden en kullanarak git checkout head. "Kayanın üzerinde durmak" olarak nitelendirilen başka bir cevap gördüm, taşıyabilmeniz için kayadan çıkmanız gerekiyor.
40XUserNotFound

gerçekten benim yerel gelişimimdi. Bunun nedeni, bu getirmenin izleme dallarını güncellememesidir. Anladığım kadarıyla; bir çekme başlangıç ​​noktasına / gelişmeye götürür ve sonra bunu gelişimle birleştirir.
Superole

Bu cevabın neden olması çok önemlidir fatal: bad config line xx in file xxx. noktalı virgül neden olur. bu sorunu önlemek için tüm komutu çift tırnak içine almanız gerekir.
William Leung

1

Git-up'ı yükleyin . git-upDeponuzdaki tüm yerel şubeleri çekecek komutu verir .


tatlı! Kesinlikle kontrol edeceğim.
Superole

2
heh: P Windows'un desteklediği ifadeler kesinlikle yok. ve kesinlikle git kurulumunuzla uğraşmayacağınız, verileri silmeyeceğiniz veya sizin adınıza Hacker News'e inane drivel yayınlamayacağı konusunda kesin bir kanıt henüz formüle edilmemiştir. , Ruby gereksinimi ile birleştiğinde beni uzaklaştırdı. Yine de konsepti seviyorum.
Superole

Sevindim bir yöntem var hiç her tek yöntem gerektirir olsa biraz Berbat ..., bazı üçüncü taraf aracı. Bunun gibi ve bazı kabuk komutu "reçete" veya belirli (platforma özgü) kabuk kullanan bir takma adı olanlar.
0xC0000022L

0

Git'in birden çok dala girmesi için yerleşik bir seçenek yok gibi görünüyor. En azından 1.8.0 sürümünde değil. Her ne kadar @ Cupcake cevabı ona yakındır.

Ancak @ jjlin'in yorumu bana en azından iki kez çekmeye gerek olmadığını fark etti.

Biraz daha verimli bir dizi şöyle olur:

git pull
git checkout master
git merge origin/master
git checkout -

Kaçınılmaz olarak bir takma ad oluşturdum, ancak çekip çıkmaya karar verdim ve sadece farklı bir dalı hızlı bir şekilde yönlendirmeye odaklandım.

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

Elbette, hiçbir test yapılmadan bu takma ad, birinci argüman olarak geçerli bir dalın geçerli bir adını sağladığımı varsayar ve aksi takdirde tanımlanmamış bir davranışa sahiptir. İkiden fazla şubesi olan kullanım durumları için de uygun değildir, ancak şimdilik bana ihtiyacım olanı alacak.

git pull
git ffwd master
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.