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 master
birleştirilsin mi aq
?
git pull origin my_branch_name
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 master
birleştirilsin mi aq
?
git pull origin my_branch_name
Yanıtlar:
aq
Şube kontrol ve dan rebase master
.
git checkout aq
git rebase master
git merge
daha iyi olur. Her iki dal da zamanla geliştiyse, hangisinin sizin için en iyi olduğunu düşünmelisiniz.
Sadece git merge origin/master
aq şubenizdeyken yapabilmeniz gerekir .
git checkout aq
git merge origin/master
rebase
yerel ve gönderilmemişse kullanın origin
. merge
Şubeniz zaten itilmişse kullanın . rebase
geçmişi yeniden yazacak.
İ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 .
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.
Ya cherry-pick
dal içine alakalı onaylatabilirsiniz aq
veya birleştirme dalına master
dalına içine aq
.
Benim için halihazırda yerinde değişiklikler yaptım ve en son baz daldan en son istedim. Yapamadım rebase
ve cherry-pick
sonsuza 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
Bu ( buradan ) benim için çalıştı:
git checkout aq
git pull origin master
...
git push
Alıntı yapmak:
git pull origin master
ana 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ıngit push
.
Birkaç seçeneğiniz var. git rebase master aq
taahhüt isimlerini tutacak şubeye, ancak bu uzak bir dalsa BAZI BIRAKMAYIN. Sen edebilirsiniz git merge master aq
Tamamlanmaya 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.
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
git merge a b
şubeleri a
ve b
geçerli dalı birleştirir . Ama git merge a
dalda olduğunuzda a
hiç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/… .)
DÜZENLE:
Belgeler aşağıda Cevabım birleştirme için bir yol master
içine aq
bunu yapılan değişiklikleri listeler birleştirme ayrıntılarını görüntülemek eğer, aq
birleş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 master
yapı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, master
bir 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 aq
beri orijinal arasındaki bölünmüş aq
ve master
nihayet 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.
Senaryo:
Çö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.