Git dalını master ile senkronize etme


276

Git şu anda kafamı yapıyor, aşağıdakiler için en iyi çözümü bulamıyorum.

İki dal, tek denilen vardır usta ve bir adlandırılan mobiledevicesupport . Mobiledevicesupport'u, mobiledevicesupport kararlı olduğunda ana şube ile birleştirilecek / senkronize edilecek sürekli bir şube olarak tutmak istiyorum. Bu, mobiledevicesupport'tan değişiklikleri master'a birleştirir, aynı zamanda master'dan tüm değişiklikleri mobiledevicesupport'a getirir, böylece şube üzerinde çalışmaya devam edebilir ve özellikler iyileştirilebilir veya değiştirilebilir. Bunun merkezi bir depo ve çoklu geliştiricilerle çalışması gerekir.

Lütfen diğer insanların kullandığı benzer iş akışlarına bir örnek verin veya sadece bu fikrin aptal olup olmadığını söyle ve diğer seçenekleri düşünmeliyim. Şu anda iş akışı sağlam görünüyor, ama git'i bu şekilde nasıl çalıştırabileceğimi bilmiyorum.

Teşekkürler, hepsi çok yardımcı olur.

Güncelleme 1: Master'ı mobiledevicesupport ve mobiledevice desteğini master'a birleştirecek olsaydım, her iki dalda da tekrarlanan taahhütler alır mıyım? Ya da git A dalındaki son değişiklikleri B dalına çektiğim ve B dalına birleştirme taahhüdü C eklediğimi ve B dalından A dalındaki son değişiklikleri çektiğimi ve B dalına birleştirme taahhüdü eklediğimi anlayacak kadar akıllı. bir?

Bir resim gönderecektim ama bunun için yeterince üne sahip değilim, bu yüzden aşağıdaki çizim yapmak zorunda kalacak. İki dal sürekli olarak her iki yöne doğru birleşerek çalışır. Ben emin değilim anahtar şey git git taahhütleri oynayacak ve birleştirme üzerinde diğer şube taahhütleri ile her iki dalı doldurur ya da temiz kalır. Daha önce rebase kullandım ama şubeyi bitiriyor ve tüm taahhütleri ustaya koyuyor gibi görünüyor, ya da yanlış yaptım. Şimdilik yardım için teşekkürler.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L

1
Benim gibi, GitHub istemcisi ile nasıl yapılacağını arıyorsanız : help.github.com/articles/merging-branches
cregox

1
Bu soru yüzyıllarca hayatımı kurtardı; @Mr bu harika soruyu ayarlamak için zaman ayırdığınız için büyük çaba için teşekkür ederiz. EZEKIEL
DJphy

Çatal üzerinde çalışıyorsanız, help.github.com/articles/syncing-a-fork
koppor'u

Yanıtlar:


417

evet sadece yap

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

mobiledevicesupport'u master ile senkronize tutmak için

mobiledevicesupport'u master'a koymaya hazır olduğunuzda, önce yukarıdaki gibi master'da birleştirin, sonra ...

git checkout master
git merge mobiledevicesupport
git push origin master

ve bu kadar.

Buradaki varsayım, mobilexxx'in henüz ana dalınıza girmeye hazır olmayan bir konu dalı olmasıdır. Bu yüzden ustaya ancak mobileduppupport iyi bir yerde olduğunda birleşin


Bu benim için makul görünüyor, sanırım bunun işlem tarihini ne kadar kirli yapacağından emin değilim, sorumu olacağını düşündüğüm bir örnekle güncelleyeceğim.
EZEKIEL

1
Oldukça birkaç "birleştirme taahhüdü" olacak, aslında git şubeleriniz arasındaki farkları çözmeye çalışıyor. Eğer bu konuda endişeleniyorsanız VE şubeyi kullanan tek kişi sizseniz, "git merge master" yerine "git rebase master" yapın ve UZAKTAN ŞUBE KOMİTELERİNİ PUSH ETMEYİN. Bunu yaparsanız, kendinizi başlangıç ​​noktasına / mobiledevicesupport'a zorlamak için çok fazla itme (git push --force) bulacağınızı göreceksiniz çünkü (muhtemelen) her zaman ona uygun olmayan bir taahhüt tarihi göndereceksiniz uzak dalda. burada daha fazla ayrıntı git-scm.com/book/en/Git-Branching-Rebasing
concept47

Bunun doğru cevap olduğuna inanıyorum, tam olarak istediğim gibi geliyor. Biraz daha açık hale getirmek için yukarıdaki bir çizimi ekledim, ancak söylediğiniz şey doğruysa, bu tam olarak istediğim şekilde çalışmalıdır. Teşekkür ederim.
EZEKIEL

2
Bunun neden özellikle iyi bir tavsiye olmadığını anlamak için bunu okuyun: kentnguyen.com/development/visualized-git-practices-for-team/… . Bu, Git yöneticisi tarafından yazılmıştır, bu yüzden bu konu ile ilgili ne konuştuğunu bildiğini söylemek muhtemelen doğrudur.
Dan Moulding

2
Bu taahhüt tarihini dağınık hale getirir, cevabımı rebase ile yapın.
Gob00st

43

Değişiklikleri master'dan çalışma dalınıza almak istediğinizde, a git rebase <remote>/master. Herhangi bir çatışma varsa. onları çözmek.

İş kolunuz hazır olduğunda, tekrar iniş yapın ve sonra yapın git push <remote> HEAD:master. Bu, uzaktaki (merkezi repo) ana dalı güncelleyecektir.


3
Kabul edilen cevapta olduğu gibi bunu yapmanın avantajları / dezavantajları nelerdir?
Hampus Ahlgren

33
Sane rebase cehennemde 5 saat geçirene kadar
IcedDante

21
Bu sadece şubeniz özel bir depodaysa geçerlidir. Asla yukarı doğru itilmiş bir şeyi yeniden pazarlamayın. Bu yüzden: git-scm.com/book/en/v2/…
Kleag

3
Yeniden yazmanın tarihin yeniden yazılmasıyla ilgili sorun, yeniden oluşturulmuş taahhüdün SHA'larının değiştirilmesidir ve bu nedenle (örneğin) çıktısına güvenemezsiniz git branch --contains <commit>.
jnns

13

concept47'nin yaklaşımı bunu yapmanın doğru yoludur, ancak taahhüt geçmişinizi açık tutmak için --no-ff seçeneğiyle birleşmenizi tavsiye ederim.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master

9

Evet, yaklaşımınıza katılıyorum. Mobiledevicesupport'u master ile birleştirmek için şunları kullanabilirsiniz:

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

Benzer şekilde, mobiledevicesupport'ta ustayı birleştirebilirsiniz.

S. Çapraz birleştirmenin bir sorun olup olmadığı.

C. Bu, mobil * şubede ve ana şubede son senkronizasyondan itibaren yapılan taahhütlere bağlıdır. Bu örneği alın: Son senkronizasyondan sonra, bu şubelere aşağıdaki taahhütler verilir

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Şimdi, B komutunun a.txt dosyasında bazı değişiklikler yaptığını ve D komutunun da a.txt dosyasında bazı değişiklikler yaptığını varsayalım. Şimdi her birleştirme işleminin etkisine bir göz atalım,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Şimdi, iki tür birleştirme mümkündür

  1. Hızlı ileri birleştirme
  2. Gerçek birleştirme (Manuel çaba gerektirir)

Git önce FF'yi birleştirmeye çalışır ve herhangi bir çakışma bulursa git tarafından çözülemez. Birleştirmede başarısız olur ve birleştirmenizi ister. Bu durumda, a.txt dosyasındaki çakışmaları çözmekle sorumlu yeni bir taahhüt gerçekleşir.

Yani Alt satırda Çapraz birleştirme bir sorun değildir ve sonuçta bunu yapmak zorundasınız ve bu senkronizasyonun anlamıdır. Üretimde herhangi bir şey yapmadan önce dalları birleştirirken ellerinizi kirlettiğinizden emin olun.


1
Peki, bu şekilde çapraz birleşme sorun değil mi?
EZEKIEL

Çapraz birleştirme, senkronizasyon dediğimiz şeydir ve her iki daldaki taahhütler herhangi bir çatışmaya neden olmadıkça bir sorun değildir. Lütfen güncellenmiş cevabıma bakın.
sachinjain024

3

Git birleştirme yoluyla kabul edilen cevap işi bitirir, ancak dağınık bir taahhüt hisotry bırakır, aşağıdaki adımlarla doğru yol 'rebase' olmalıdır (PR'den önce son itmeyi yapmadan önce özellik dalınızı sycn'de tutmak istediğinizi varsayarsak) ).

1 git fetchözellik dalınızdan (çalıştığınız özellik dalının bugüne kadar güncel olduğundan emin olun)

2 git rebase origin/develop

3 Herhangi bir çatışma ortaya çıkarsa, bunları tek tek çözün

4 git rebase --continuetüm çatışmalar ele alındığında kullanın

5 git push --force


1
Bu hem okunması hem de anlaşılması zordur. Lütfen yanıtınızı güncelleyin ve yorumlarınızı komutlardan ayırmak için uygun kod işaretini kullanın.
not2qubit

2

Doğru yönde düşünüyorsunuz. Mobiledevicessupport'u sürekli olarak destekleyin ve mobiledevicesupport'u mobiledevicesupport kararlı olduğunda master ile birleştirin. Her geliştiricinin kendi dalı vardır ve rollerine bağlı olarak master veya mobiledevices destek ile birleşebilir.

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.