Git'te master'dan şubeye değişiklikler alın


691

Depomda aqüzerinde çalıştığım bir şubem var.

Sonra yeni işler yaptım ve hatalar girdim master.

Bu taahhütleri aqşubeye sokmanın en iyi yolu nedir ? Başka bir yeni dal oluşturup masterbirleştirilsin mi aq?


3
Gelecekte, hata düzeltme dalınızı, düzeltmelere ihtiyaç duyacak ortak bir ana ve diğer dallardan da başlatabilirsiniz, böylece başka hiçbir şey almadan, tüm bu dallarla birleştirebilirsiniz.
Cascabel

2
@Jefromi, ancak proje üzerinde çalışan tek kişi o değilse onun kontrolü dışında. diğer insanlar efendiyi günceller. cehennem, siz üçüncü bir daldan ustayı güncelleyebilirsiniz ve durum kaçınılmaz ve genel bir çözüme ihtiyaç duyar.
ahnbizcad

@ahnbizcad Eminim kendi şubesini nereden başlattığını kontrol ediyor. Şubesi birleşmek isteyeceği kişilerin ortak bir atasıysa ve insanlar daha sonra bu dallara eklerse, yine de ortak bir ata olacaktır.
Cascabel

çocuklar soru, bu komut yapar,git pull origin my_branch_name
Basheer AL-MOMANI

Yanıtlar:


795

aqŞube kontrol ve dan rebase master.

git checkout aq
git rebase master

Rebase başka bir şubeden gelebilir mi? Yani. git rebase otherbranch? Görünüşe göre sorum biraz uzakta, bir daldan ayrıldım ve sonra orijinal dalda değişiklikler yaptım.
Slee

2
Eğer haklıysam, çekme talebinde rebase tüm ana taahhütleri gösterecektir. Eğer birleştirme / orijin masterı kullanırsanız tüm ana taahhütler 1 taahhüt olarak gösterilecektir, bu da kod incelemesini kolaylaştırır.
Foo Bar Kullanıcısı

4
Bazen git mergedaha iyi olur. Her iki dal da zamanla geliştiyse, hangisinin sizin için en iyi olduğunu düşünmelisiniz.
erick2red

70
Partiye geç, ama bu ne zaman yeniden birleştirmek vs birleştirmek için büyük bir genel bakış: atlassian.com/git/tutorials/merging-vs-rebasing/…
ebuat3989

7
Şube aq ile ilgili önceki taahhütleriniz halka açıksa rebase yapmayın. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

Sadece git merge origin/masteraq şubenizdeyken yapabilmeniz gerekir .

git checkout aq
git merge origin/master

55
Rebase “daha ​​iyi” ise, tamamen özel duruma bağlıdır.
Bombe

13
neden "git merge origin / master" yerine "git merge master" ı çağırmıyorsunuz?
Michael Küller

145
Şubeniz rebaseyerel ve gönderilmemişse kullanın origin. mergeŞubeniz zaten itilmişse kullanın . rebasegeçmişi yeniden yazacak.
çöp kovası

17
@Toskan, yerel ustanızın uzaktan kumanda ile güncel olmadığı sorunlarla karşılaşabilirsiniz. Bu şekilde, kodun uzak kopyasında birleştiğinizden emin olursunuz.
Chris Kooken

8
@garbagecollector Rebase'ye karşıyım (yapabilirim, ama rebase olmayacağım) Rebase ile kumar oynamak için hiçbir neden göremiyorum. Sadece işleri gereksiz yere karmaşık hale getirir. Her zaman "Bunu uzaktan kumanda ettim mi?" düşünmek ve yeni gelenlere açıklamak acı verici. Bazı insanlar birleşme taahhütlerinden kaçındığını söylüyor. Ama birleştirme taahhütleri almak istiyorum . Bunlar dağınık değildir, dallar birleştirildiğinde belgelenir. Son kez, hepimiz usta olmayı taahhüt ediyormuş gibi davranmayı bırakabilir miyiz? Günlükte birleştirme işlemlerinden çok hoşlanmıyorsanız, bunları --no-merges ile filtreleyin.
nurettin

92

İlk önce ustalaşmak için göz atın:

git checkout master

Tüm değişiklikleri, düzeltmeleri ve taahhütleri yapın ve ustanızı itin.

Şubenize geri dönün, 'aq' ve master'ı birleştirin:

git checkout aq
git merge master

Şubeniz master ile güncel olacak. Birleşmenin iyi ve temel bir örneği 3.2 Git Dallanma - Temel Dallanma ve Birleştirme'dir .


25

Ana hata düzeltmelerinin diğer taahhütler arasında olmadığının garantisi yoktur, bu nedenle birleştirilemezsiniz. Yapmak

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

bu taahhütlerin hata düzeltmelerini temsil ettiğini varsayarsak.

Ancak bugünden sonra, hata düzeltmelerini ayrı bir dalda tutun. Sadece

git merge hotfixes

hepsini normal geliştirici dalına döndürmek istediğinizde.


17

Ya cherry-pickdal içine alakalı onaylatabilirsiniz aqveya birleştirme dalına masterdalına içine aq.


5
@Kendiniz cevap verdiniz ... bu durum için çözüm değil
mtet88

13

Şununla birleştir: aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8

Kolay yol

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

Benim için halihazırda yerinde değişiklikler yaptım ve en son baz daldan en son istedim. Yapamadım rebaseve cherry-picksonsuza dek sürecekti, bu yüzden aşağıdakileri yaptım:

git fetch origin <base branch name>  
git merge FETCH_HEAD

bu durumda:

git fetch origin master  
git merge FETCH_HEAD

7

Bu ( buradan ) benim için çalıştı:

git checkout aq
git pull origin master
...
git push

Alıntı yapmak:

git pull origin masterana dalın içeriğini dalınızla alır ve birleştirir ve birleştirme taahhüdü oluşturur. Herhangi bir birleştirme çakışması varsa, bu aşamada size bildirilir ve devam etmeden önce birleştirme işlemlerini çözmeniz gerekir . Yeni birleştirme taahhüdünüz dahil olmak üzere yerel taahhütlerinizi uzak sunucuya aktarmaya hazır olduğunuzda çalıştırın git push.


Bu çözümün özellikle bir birleştirme gerekiyorsa, yani ana dal bir nedenden ötürü yeniden oluşturulamıyorsa mükemmel olduğunu belirtmek önemlidir.
cudacoder

3

Birkaç seçeneğiniz var. git rebase master aqtaahhüt isimlerini tutacak şubeye, ancak bu uzak bir dalsa BAZI BIRAKMAYIN. Sen edebilirsiniz git merge master aqTamamlanmaya isimleri saklanması önemli yoksa. Taahhüt adlarını saklamak istiyorsanız ve bu uzak bir git cherry-pick <commit hash>dalsa, şubenize taahhüt eder.


0

Bunu tek bir satır çalıştırarak da yapabilirsiniz.
git merge aq master

Bu şuna eşdeğerdir:

git checkout aq
git merge master

Bu yaptığını sandığınız şeyi yapmıyor. git merge a bşubeleri ave bgeçerli dalı birleştirir . Ama git merge adalda olduğunuzda ahiçbir şey yapmaz (bu yüzden bu biraz düşündüğünüzü yapıyor gibi görünüyor). (Bkz. Git-scm.com/docs/git-merge#Documentation/… .)
MikeBeaton

0

DÜZENLE:

Belgeler aşağıda Cevabım birleştirme için bir yol masteriçine aqbunu yapılan değişiklikleri listeler birleştirme ayrıntılarını görüntülemek eğer, aqbirleştirme öncesinde değil, değişiklikler yapılır master. Düşündüğünüzde bile bunun muhtemelen istediğiniz şey olmadığını fark ettim!

Sadece:

git checkout aq
git merge master

iyi.

Evet, bu basit birleştirme , diğer noktaya değil, o noktada masteryapılan değişikliklerin olduğunu gösterecektir aq; ama sorun değil - çünkü olan buydu! Daha sonra, dalınızı nihayet birleştirdiğinizde, masterbir birleştirme nihayet yapılan tüm değişikliklerinizi nihayetinde gösterecektir master(bu tam olarak istediğiniz şeydir ve insanların bu bilgileri yine de bulmasını beklediği taahhüttür).

Kontrol ettim ve ettik de tam olarak gösterir, aynı değişiklikleri (yapılan değişikliklerin tümü aşağıda yaklaşım aqberi orijinal arasındaki bölünmüş aqve masternihayet birleştirme şeyi geri yukarıda normal bir yaklaşımla, gibi) master. Bu yüzden sadece gerçek dezavantajı (aşırı karmaşık ve standart dışı olmanın dışında ...: - /) son değişiklikleri geri alırsanız git reset --hard HEAD~<n>ve bu birleşmeyi geçerse , aşağıdaki sürüm elle düzeltmeniz gereken 'yanlış' dal (örneğin git reflog& ile git reset --hard [sha]).


[Yani, daha önce düşündüğüm şey şuydu:]

Şununla ilgili bir sorun var:

git checkout aq
git merge master

çünkü birleştirme işleminde gösterilen değişiklikler (örneğin Github, Bitbucket veya en sevdiğiniz yerel git geçmişi görüntüleyicisine şimdi veya daha sonra bakarsanız) master'da yapılan değişikliklerdir, bu sizin istediğiniz şey olmayabilir.

Diğer yandan

git checkout master
git merge aq

gösterileri muhtemelen hangi aq yapılan değişiklikleri olduğunu ne istediğini. (Veya en azından istediğim şey budur!) Ama doğru değişiklikleri gösteren birleştirme yanlış dalda!

Nasıl başa çıkılır?!

Aq üzerinde yapılan değişiklikleri (yukarıdaki ikinci birleşmeye göre), ancak aq dalını etkileyen birleştirme ile gösteren bir birleştirme taahhüdü ile sonuçlanan tam işlem:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

Bu: aq'yi master'a birleştirir, aynı birlemeyi aq'ye hızlı bir şekilde iletir, master'a geri alır ve sizi tekrar aq'ye geri koyar!

Bir şeyleri özlüyormuşum gibi hissediyorum - bu açıkça istediğiniz bir şey ve yapılması zor bir şey gibi görünüyor.

Ayrıca, rebase eşdeğer DEĞİLDİR. Aq üzerinde yapılan taahhütlerin zaman damgalarını ve kimliğini kaybeder, ki bu da istediğim şey değil.


0

Senaryo:

  • Ustadan şube-1 diyerek bir şube oluşturdum ve yerelime çektim.
  • Arkadaşım master-say şube-2'den bir şube yarattı.
  • Master için bazı kod değişiklikleri yaptı.
  • Şimdi bu değişiklikleri ana daldan yerel şubeme almak istiyorum.

Çözüm

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

"Git stash uygula" komutunu çalıştırdıktan sonra dosyanızda çakışma bulabilirsiniz. Manuel olarak düzeltmeniz gerekiyor ve şimdi itmeye hazırsınız.

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.