Geçerli dal başka bir dalda nasıl birleştirilir


182

İki dalım var, usta ve geliştirici. Her zaman dev üzerinde çalışıyorum ve sadece üretim kullanımı için onaylandıktan sonra ana şubeye kodu kontrol ediyorum. Bunu yaptığımda, aşağıdakileri yapmak zorundayım:

git checkout master
git merge dev
git checkout dev

Bu çok ayrıntılı ve sık sık yaptığım için, en aza indirmek istiyorum. Önce ana dalı kontrol etmek zorunda kalmadan mevcut şube geliştiricimden diğer şube yöneticisine birleştirmek için kullanabileceğim herhangi bir git komutu var mı? Belki şöyle bir şey:

git merge dev to master

harika olurdu. Git belgelerine baktım ve hiçbir şey görmedim.


1
Bunun için git push'u kullanmayı denediniz mi?
Jay Sullivan

11
İtme önerileri nelerdir? Bu , kendi deposunda birleşmek yerine uzaktan kumandaları güncellemek içindir .
Cascabel

4
Jefromi haklı, itme burada yararlı değil. Uzak bir şubeden değil, başka bir yerel şubeden bahsediyorum.
Chris

2
Kaydedilmemiş yerel değişiklikleri bile kötüdür: git stash, git checkout master, git merge dev, git checkout dev, git stash pop.
Mu Mind

2
Güzel soru. Bunu da istedim çünkü güncel olmayan bir şubeye çekmek istedim. Dalları değiştirmekten kaçınmak istedim çünkü çalışma ağacındaki herhangi bir dosya değişirse bir derlemeyi başlatan bir işlemim var.
Kelvin

Yanıtlar:


94

1. Yerel deponuz için uzak bir takma ad ekleyin, örn:

git remote add self file:///path/to/your/repository

(Veya pencerelerde git remote add self C:\path\to\your\repository)

2. Uzaktan kumandayı itin, örn:

git push self dev:master

2
Altmodüller! Bu sadece sorulan sorunun problemini çözmekle kalmaz, aynı zamanda sadece bir alt modüle sahipken dal değiştirme problemini de çözer. Harika bir ipucu!
eddiemoya

2
+1 Bu yaratıcı ve çalışma ağacına hiç dokunmuyor. Sadece bir açıklama: /path/to/your/repositoryçalışma ağacınıza giden yol, yani .gitdizini eklemeyin . Ayrıca, bu söylemeye gerek yok: repo taşırsanız uzaktan güncellenmesi gerekir.
Kelvin

Bunu pencerelerde çalışmak için hiç şansım yok ... git remote add self file:///c/projectssadece kullanım notları ile geri geliyor
Maslow

2
@ JosephK.Strauss Öncelikle mevcut dalda ( dev) ustası birleştirebilir ve daha sonra birleştirme işlemini kullanarak itebilirsiniz git push self dev:master.
Leonid Shvechikov

4
Neden uzak takma ad? .Benim için para cezası çalıştı: git push . head:master.
geon

60

@Zerome'ın şu anki en yüksek oyu alan cevabı iyi bir cevap ama biraz gereksiz.

Git deponuzun tabanında bunu yapabilirsiniz: git push . dev:master

Ağacın herhangi bir yerinde çalışacak daha genelleştirilmiş bir çözüm:

git push $(git rev-parse --show-toplevel) dev:master

3
git push . dev:masterhayatımı çok basitleştirdi! Şimdiye kadarki en iyi cevap, teşekkür ederim
Jeremy Belolo

birleşmiş ustayı github gibi uzak bir depoya mı atacaksın? yaparak bir adımı kurtargit push origin dev:master
Alex R

1
merge --no-ffDavranışı bununla çoğaltmak mümkün mü ?
Şubat'ta exhuma

1
Geçersiz uzak ad "" alıyorum . " Windows'da. Hala yapmam gerekiyor git remote add self file:///myRepomu?
kiewic

1
Ama bu gerçekten bir birleştirme yapmıyor ... dev'in ustanın önünde olması işe yarayacak, ama ya değilse?
Thomas Levesque

44

En iyi seçeneğiniz, yalnızca global gitconfig ( ~/.gitconfig) yönteminize yerleştirilmiş bir takma ad kullanmak olacaktır :

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

böylece herhangi bir depodan çağırabilirsiniz.

git merge-to master dev

3
Birleştirme otomatik değilse, ancak birleştirme çözünürlüğü gerektiriyorsa ne olur? (Bu durumda, usta üzerinde hiçbir iş yapılmadığını varsayıyorum, bu olmayacak, ama yine de) ...
Stein G. Strindhaug

@Stein: Kullandığımdan beri &&değil ;, birleştirmede başarısız olur ve geri dönmeye çalışmaz. Umarım kullanıcı "birleştirme başarısız" mesajını görmek ve onunla başa çıkmak için yeterince akıllı.
Cascabel

6
Bu merge-to = "!f() { export tmp_branch=git şubesini tercih ederim | grep '*' | tr -d '*' ; git checkout $1 && echo git merge $tmp_branch && echo git checkout $tmp_branch; unset $tmp_branch; }; f", Kendim birleştirme istiyorum eğer öyleyse, ben şu anda olduğum dalında yazmak zorunda yapmayalım deviçine masterve hattayım devŞimdilik sadece yazıngit merge-to master
Steve

2
Doğru backticks ve yankı olmadan daha iyi sürüm:merge-to = "!f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '`; git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset $tmp_branch; }; f"
Simon Epskamp

2
unset komutu doğru değil. giderilen: merge-to = "! f () {export tmp_branch = git branch | grep '* ' | tr -d '* '; git checkout $ 1 && git merge --no-ff $ tmp_branch && git checkout $ tmp_branch; unset tmp_branch;}; f"
sassman

38

Geçerli şubeye yazmanızı gerektirmeyen Jefromi diğer adından küçük bir değişiklik.

Yani gibi kullanın: git merge-to dev.

Bu, devşubeye geçer, CURRENT ile birleştirir ve sonra geri döner.

Örneğin, masterdalda olduğunuzu varsayarsak , efendiyi dev ile birleştirir ve yine de efendide olursunuz.

Kesinlikle benim dotfiles gider :)

[alias]
  merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"

6

Bu eski, ama ...

Yukarıdaki @ kevin-lyda ve @ dmytrii-nagirniak'ın çözümlerini birleştirir. bu takma ad geçerli dalı belirtilen dalda birleştirir. İçeriği almak için remotes yöntemini kullanır ve git komutlarını kullanır.

[alias]
    merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"

Gibi kullanım için:

git merge-to other-branch-name

4

Geçerli dalı, diğer dalı kontrol etmeden başka bir dalda birleştirmek için:

Hızlı ileri birleştirme

Bu gerçekten kolay. Tanım olarak, bir hızlı ileri birleştirme, dal işaretçisinin işleme ağacında ileriye doğru hareket ettiği anlamına gelir. Tek yapmanız gereken bunu simüle etmek:

git branch -f master dev

Uyarılar: Bu master, aynı zamanda devdalda veya başka bir dalda olan bir taahhüdü işaret ettiğini varsayar . Değilse, iş kaybetme riskiniz vardır! git mergeHızlı ileri alma mümkün olmadığında bir birleştirme taahhüdü oluşturacak (veya şikayet edecek) aksine , bu yöntem sessizce şube işaretçisini başka bir taahhüde işaret etmeye zorlar .

Bu aynı zamanda repo üzerinde çalışan tek kişi olduğunuzu ve / veya ne yaptığınızı bildiğinizi varsayar.

İpucu: Bir işlem yaptıysanız git fetchve yeni taahhütleriniz origin/mastervarsa, masterşubeyi aşağıdakileri kullanarak kontrol etmeden taşıyabilirsiniz :

git branch -f master origin/master

Birleştirme taahhüdü ile birleştirme

Bu her zaman mümkün değil. Bir birleştirme taahhüdü oluşturmak için bir birleştirme işlemi yapmanız gerekir. Birleştirme işlemi yapmak için, diğer dalda geçerli dalda olmayan taahhütlerinizin olması gerekir.

İçinde kaydedilmesini var ise masterşunlardır şube değil de devyapabilirsiniz şube:

Feragatname: Bu sadece bir kavram kanıtıdır, sadece kontrol etmeden diğer şubeyle birleştirmenin bazen mümkün olduğunu göstermek için . Her gün kullanmak isterseniz, büyük olasılıkla kabuk yeniden yönlendirme kullanarak bir takma ad yapmak veya bunun için bir kabuk komut dosyası yapmak istersiniz. Sonra tekrar, soruda gösterilen daha kısa işlem için bir kabuk komut dosyası yapabilirsiniz.

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

Açıklama:

  1. Mevcut şubeyle aynı taahhüde işaret eden geçici bir şubeye göz atın.
  2. masterGeçici şubeyle birleştirin ve tamamlama mesajı düzenleyicisini başlatın. Eğer birleştirme istiyorsanız taahhüt gibi bakmak , birleştirilmesi vardı deviçine şube masterbundan, düzenleyebilir it:

    Merge branch 'master' into temp
    

    buna:

    Merge branch 'dev'
    

    İpucu: Daha hızlı olmak -m "Merge branch 'dev'"yerine kullanabilirsiniz -e.

  3. masterŞube işaretçisini birleştirme işlemine işaret edecek şekilde güncelleyin .
  4. devŞube kontrol edin .
  5. Geçici dalı silmeye zorlayın.

Bu hala çalışma ağacınıza dokunur, ancak asgari düzeyde. Sadece mastergeliştirme değişikliklerini bir kez daha getirmek için ağacı orijinal haline kadar geri döndürmez . Bazıları umursamayabilir, bazıları için önemli olabilir.


1

Birçok kez şubeden geliyorsunuz ve mevcut şubeyi birleştirmek istiyorsunuz. Bu durumda şunları yapabilirsiniz:

git co - && git merge @{-1}

Örneğin:

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master

1

Benim çözümüm aşağıdaki cevaplarla diğer cevaplara benzer:

  • okunabilirlik için işlev birden çok satıra bölünmüştür
  • fonksiyon çağırır set -ex her komut yazdırılacak ve komut başarısız olursa işlev hemen çıkar.
  • takma ad, ilk (hedef dal) dışındaki bağımsız değişkenlerini git merge
  • işlev, : git mergesekme tamamlamanın bazı kabuk kurulumlarıyla (ör gitfast. oh-my-zsh'dan) çalışmasını sağlayan bir null komutu içerir.
[alias]
  merge-to = "!f() { : git merge ; \
      set -ex ; \
      local this=$(git rev-parse --abbrev-ref HEAD) ; \
      local target=$1 ; \
      shift ; \
      git checkout $target ; \
      git merge $this \"$@\" ; \
      git checkout $this ; \
    } ; f"
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.