Git dallarını master'den güncelleme


676

Git'te yeniyim ve şimdi bu durumdayım:

  • Dört şubem var (master, b1, b2 ve b3).
  • B1-b3 üzerinde çalıştıktan sonra, diğer tüm dallarda olması gereken dal yöneticisinde bir şey değiştirdiğimi fark ettim.
  • İhtiyacım olanı değiştirdim masterve ... işte benim sorunum:

Diğer tüm şubeleri masterşube koduyla nasıl güncelleyebilirim ?



58
Git tarafından zorlaştırılan bir başka basit görev. Git geliştiricileri, Yığın Taşmasını SDLC döngülerinde geri bildirim olarak kullanmalıdır. 300.000 kişi Git'in iş akışında bir şeyin ciddi şekilde yanlış olduğunu belirtmelidir. Bir UX uzmanı tutmaları gerekiyor çünkü açıkça kendi başlarına gidemiyorlar.
jww

Yanıtlar:


620

İki seçeneğiniz var:

Birincisi birleştirme, ancak bu birleştirme için ekstra bir taahhüt yaratır.

Her şubeye göz atın:

git checkout b1

Sonra birleştir:

git merge origin/master

Sonra:

git push origin b1

Alternatif olarak, bir rebase yapabilirsiniz:

git fetch
git rebase origin/master

15
Bu yaklaşımla ilgili bir endişem var. Git log --graph'ı çalıştırdığımda, grafikte master'ın konu dalıyla birleştirildiğini gösterir. Bu uzun vadede herhangi bir soruna neden olur mu? En iyi uygulamanın her zaman konu dalını ustalıkla birleştirmek olduğunu düşündüm. Lütfen yorum yapın.
Patrick

2
Birleştirme iş akışıyla gidiyorsanız bu soruna dikkat edin: randyfay.com/node/89
Hampus Ahlgren

22
Master'ı b1 ile birleştiriyorsunuz. Neden got push origin master... mantıklı değil. Ana dalı değiştirmiyorsunuz. Sanırım 119 upvote ile bir hata: /
Yves Lange

22
Birleştirme yöntemini kullanmayın git rebase master, doğru yanıt kullanmaktır
Weston Ganger

6
Daha sonra okuyanlarımız için - @Kursion'un yazım hatasıyla ilgili endişesi yazarın düzenlemesi ile giderildi. Ayrıca, aşağıda en çok yükselen ikinci cevap temel olarak bu cevapla aynı şeyi söylüyor, ancak şube yapısının bir diyagramı ve neden yeniden pazarlamak istemeyeceğinize dair bir uyarı var.
ötesinde

496

Temel olarak iki seçeneğiniz vardır:

  1. Siz birleştirirsiniz. Bu aslında oldukça basit ve mükemmel bir yerel operasyon:

    git checkout b1
    git merge master
    # repeat for b2 and b3
    

    Bu, tarihi tam olarak olduğu gibi bırakır: Ustadan çatallandınız, tüm dallarda değişiklikler yaptınız ve son olarak ustadan değişiklikleri üç dalın içine dahil ettiniz.

    gitBu durumu gerçekten iyi idare edebilir, her yönden aynı anda gerçekleşen birleşmeler için tasarlanmıştır. Tüm konuları doğru bir şekilde bir araya getirebileceğine güvenebilirsiniz. Şube b1birleştirmek masterveya masterbirleştirmek b1, birleştirme taahhüdünün git ile aynı görünmesini umursamıyor . Tek fark, hangi şubenin bu birleştirme taahhüdüne işaret ettiği.

  2. Sen geri döndün. SVN veya benzeri bir geçmişi olan insanlar bunu daha sezgisel bulurlar. Komutlar birleştirme durumuna benzer:

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    

    İnsanlar bu yaklaşımı severler çünkü tüm dallarda doğrusal bir geçmişi vardır. Bununla birlikte, bu doğrusal tarih bir yalandır ve bunun farkında olmalısınız. Bu taahhüt grafiğini düşünün:

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    

    Birleştirme gerçek tarihle sonuçlanır:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    

    Bununla birlikte, rebase size bu geçmişi verir:

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    

    Nokta kaydedilmesini yani, E', F', ve G'gerçekten var olmamış ve muhtemelen çoğu henüz araştırılmamıştır. Derlemeyebilirler bile. Aslında, bir değişiklik, özellikle masterde gelişimdeki gelişmeler için önemli olduğunda, bir taban yoluyla saçma sapan taahhütler oluşturmak oldukça kolaydır b1.

    Bunun sonucu üç kaydedilmesini hangisinin ayırt edemez olabilir E, Fve Gaslında değerini azalan bir gerileme ortaya git bisect.

    Kullanmaman gerektiğini söylemiyorum git rebase. Kullanımları vardır. Fakat ne zaman kullanırsanız kullanın, tarih hakkında yalan söylediğinin farkında olmanız gerekir. Ve en azından yeni taahhütleri test etmelisiniz.


Bu güzel cevap eklemek için başka bir kaynak dalı (değil master) ve ek adımlar birleştirme edildi (yerel son kodu olması) birleştirmeden önce benim yerel repo güncellemek oldu: git checkout <source branch> git pull. Sonra yukarıdaki ile devam: git checkout b1...
Rod

3
Uzun süredir SVN kullanıcısı olarak, rebase için birleştirme seçeneğini tercih ediyorum: herhangi bir sürüm kontrolü kullanarak yaptığınız değişikliklerin nedenini ve nedenini doğru bir şekilde tutmak çok, çok önemlidir. Görünür tarihi basitleştirmek için yeniden temanın cazibesini görebiliyorum, ancak daha sonra geri dönmeli ve E ', F', G 'nin taahhüt yorumlarına eklemelisiniz - ve tercihen rebazı bu yorumlara otomatik olarak eklemelisiniz. Aksi takdirde, oluşturma / test / test dağıtma işlemi G '' yi bozarsa, değişikliklerin neden tam bilgi olmadan yapıldığını öğrenmeniz gerekir.
16:16

13
Tarih bir yalandır
piratemurray

Teşekkürler i "git merge any-branch-name" bir şube kodu başka bir dalı birleştirmek için kullanın. Yerel olarak ben şube 2 iken şube 1 kodunu test edebilirsiniz
Priti

1
@blamb Birleştirme çakışmaları hem git mergeve ile olur git rebase. Onlardan kaçınmak yok. git rebaseyeniden baslamanın birkaç aşamasını gizlemenize izin verme avantajına sahiptir (yani, her bir aşamadaki çakışma miktarını azaltmak için aynı dalı birkaç sırayla basma). Yine de, bir rebazın tarih hakkında yalan söylemesi, çok aşamalı bir rebase'de iyi bir şekilde sikilmeyi çok daha kolay hale getirir ... Bu yüzden, tarihi birkaç birleştirme taahhüdü ile karıştırmak gerektiğinde bile her zaman birleştirmeyi tercih ederim. .
cmaster - reinstate monica

238

git rebase masterbunu yapmanın doğru yoludur. Birleştirme, birleştirme için bir taahhüt yaratılacağı anlamına gelirken, yeniden temellendirme olmaz.


52
Ne zaman çıkmaya başladığınıza ne dersiniz, eğer tembellik yaparsanız taahhüt geçmişini yeniden yazacaksınız ve bu da uzak şubenizle çakışacaktır. Ben rebase sadece bir çekme veya uzak bir şubeye itmediyseniz kullanılmalıdır düşünüyorum.
Matt Smith

6
Uzak dalda çalışan tek kişi sizseniz, uzak dalınızı yeniden temelli yerel dalla güncelleştirmek için git push - kuvvet kaynağı özelliğini kullanabilirsiniz. stackoverflow.com/questions/8939977/…
stormwild

7
rebase ve her iki eseri birleştirme, rebase özel dallar için en iyisidir, çünkü daha temiz bir geçmiş grafiği verir. bu cevap en iyisidir
Junchen Liu

5
Açıklık (tek kullanıcılı veya küçük ekip için harika) veya dağınık gerçek (çoklu katkıda bulunan kod dalları için - sürdürülebilirlik için gerekli olan (deneyimime göre - YMMV)) arasındaki denge hakkında daha net olmalıyım.
WillC


53

Bir dalda açma-kapama üzerinde çalışıyorsanız veya bir şey üzerinde çalışırken başka dallarda çok şey olduysa, dalınızı ustaya yeniden oluşturmak en iyisidir. Bu, tarihi düzenli tutar ve işleri takip etmeyi çok daha kolay hale getirir.

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

Notlar:

  • Başkalarıyla işbirliği yaptığınız şubeleri yeniden pazarlamayın.
  • Her zaman usta olmayabilecek olan birleştireceğiniz şubeyi yeniden temellendirmelisiniz.

Rebasing üzerine bir bölüm de var http://git-scm.com/book/ch3-6.html ve diğer kaynakların yükleri web'de orada.


Basit çözüm için teşekkürler
diğer Uzun boylu adam

18

@cmaster en ayrıntılı cevabı verdi. Kısaca:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

Şube geçmişini yeniden yazmamalısınız, bunun yerine gelecekteki başvurular için bunları gerçek durumda tutmalısınız. Ustalaşmak için birleşirken, ekstra bir taahhüt yaratır, ancak bu ucuzdur. Taahhütlerin maliyeti yoktur.


13

Ana şube kopyanızla (yedekleme) gibi diğer dalları güncellemek için. Her iki şekilde de yapabilirsiniz (rebase veya merge) ...

  1. Rebase yapın (yedekleme şubesine ek bir taahhüt yapılmaz).
  2. Şubeleri birleştir (yedek şubeye otomatik olarak fazladan bir taahhüt uygulanır).

    Not: Rebase, yeni bir temel oluşturmaktan başka bir şey değildir (yeni bir kopya)

git checkout backup
git merge master
git push

(Yedek2 vb. Varsa diğer şubeler için tekrarlayın.)

git checkout backup
git rebase master
git push

(Yedek2 vb. Varsa diğer şubeler için tekrarlayın.)



1

Bu sorun için iki seçenek vardır.

1) Git Rebase

2) Git Birleştirme

Sadece birleştirme durumunda her ikisiyle de farklılık gösterir, tarihte ekstra taahhüt sahibi olur

1) git ödeme şubesi (b1, b2, b3)

2) git rebase origin / master (Çakışma olması durumunda git rebase yaparak yerel olarak çözümlenir - devam et)

3) Git Push

Alternatif olarak, git merge seçeneği benzer bir moda sahiptir

1) git checkout "your_branch" (b1, b2, b3)

2) Git Merge Master

3) Git Push


1

dalınızı master'dan güncellemek için:

  git checkout master
  git pull
  git checkout your_branch
  git merge 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.