Bu cevapla pek ilgili değil, ama git pullsadece git fetchonu takip eden hendek atardım git merge. Üç birleştirme yapıyorsunuz, bu da Git'inizin tek ihtiyacınız olan getirme olduğunda üç getirme işlemini çalıştırmasını sağlayacak. Dolayısıyla:
git fetch origin # update all our origin/* remote-tracking branches
git checkout demo # if needed -- your example assumes you're on it
git merge origin/demo # if needed -- see below
git checkout master
git merge origin/master
git merge -X theirs demo # but see below
git push origin master # again, see below
En zorlu birleştirmeyi kontrol etme
Buradaki en ilginç kısım git merge -X theirs. Gibi root545 belirtildiği , -Xseçenekler birleştirme stratejiye geçti ve varsayılan hem edilir recursivestrateji ve alternatif resolvestrateji almak -X oursveya -X theirs(bir veya diğer, ancak ikisini). Ne yaptıklarını anlamak için Git'in çatışmaları nasıl bulduğunu ve ele aldığını bilmeniz gerekir .
Bir birleştirme çakışması bir dosya içinde oluşabilir 1 olduğunda taban hem sürüm farklıdır akım (aynı zamanda, yerel, KAFA veya adı --oursversiyonu) ve (aynı zamanda uzak veya adı verilen diğer --theirsaynı dosyanın) versiyonu. Yani, birleştirme üç revizyonu (üç taahhüt) belirlemiştir: temel, bizimki ve onlarınki. "Temel" sürüm, commit grafiğinde (bununla ilgili daha fazla bilgi için, diğer StackOverflow gönderilerine bakın) görüldüğü gibi commit ve commit arasındaki birleştirme tabanından gelir . Git daha sonra iki takım değişiklik buldu: "ne yaptık" ve "ne yaptılar". Bu değişiklikler (genel olarak) satır satır, tamamen metinsel olarak bulunur.temeli. Git, dosya içeriği konusunda gerçek bir anlayışa sahip değildir; sadece her metin satırını karşılaştırmaktır.
Bu değişiklikler git diffçıktıda gördüğünüz şeylerdir ve her zaman olduğu gibi bağlamları da vardır. Değiştirdiğimiz şeylerin, değiştirdikleri şeylerden farklı satırlarda olması mümkündür, bu nedenle değişiklikler çakışmayacakmış gibi görünür, ancak bağlam da değişmiştir (örneğin, değişikliğimizin dosyanın üstüne veya altına yakın olması nedeniyle, böylece dosya bizim sürümümüzde biter, ancak onların sürümünde, üste veya alta daha fazla metin eklediler).
Değişiklikler üzerinde olursa farklı hatlar -örneğin, biz değiştirmek coloriçin colour17. satırdaki ve değiştirmek frediçin barneyon line 71-o zaman hiçbir çatışma var: Git basitçe alır hem değişiklikleri. Değişiklikler aynı satırlarda meydana gelirse ancak aynı değişikliklerse Git, değişikliğin bir kopyasını alır . Yalnızca değişiklikler aynı satırlarda, ancak farklı değişikliklerse veya içeriğe müdahale eden özel bir durum söz konusuysa, bir değiştirme / değiştirme çakışması alırsınız.
-X oursVe -X theirsbizim veya onların: Seçenekler sadece iki değişikliklerden birini seçerek, bu çatışmayı nasıl çözüleceği Git söyle. Eğer birleşiyor söyledi yana demoiçine (onların) master(bizim) ve değişiklikleri istiyorum demo, istediğiniz olur -X theirs.
-XAncak körü körüne başvurmak tehlikelidir. Değişikliklerimizin satır bazında çelişmemesi, değişikliklerimizin aslında çatışmadığı anlamına gelmez! Klasik bir örnek, değişken bildirimli dillerde görülür. Temel sürüm kullanılmayan bir değişken bildirebilir:
int i;
Bizim versiyonunda, bir derleyici uyarı uzakta-ve go yapmak için kullanılmayan değişkeni silmek onların sürümü, kullandıkları bazı satır sonra bir döngü eklemek idöngü sayacı olarak. İki değişikliği birleştirirsek, ortaya çıkan kod artık derlenmez. -XSeçeneği değişiklikleri üzerinde olduğundan burada hiçbir yardım olduğunu farklı çizgileri .
Otomatik bir test paketiniz varsa, yapmanız gereken en önemli şey, birleştirmeden sonra testleri çalıştırmaktır. Bunu taahhüt ettikten sonra yapabilir ve gerekirse işleri daha sonra düzeltebilirsiniz; ya bunu yapabilirsiniz önce ekleyerek, işlediği --no-commitiçin git mergekomuta. Tüm bunların ayrıntılarını diğer ilanlara bırakacağız.
1 Ayrıca "dosya çapında" işlemlerle ilgili olarak da çelişkiler yaşayabilirsiniz, örneğin, belki bir dosyadaki bir kelimenin yazımını düzeltiriz (böylece bir değişikliğe sahip oluruz) ve tüm dosyayı siler (böylece bir sil). Git, -Xargümanlardan bağımsız olarak bu çatışmaları kendi başına çözmeyecektir .
Daha az birleştirme ve / veya daha akıllı birleştirme ve / veya yeniden ödeme kullanma
Her iki komut dizimizde de üç birleşme var. Birincisi origin/demo, yerel demoolana getirmektir (sizinki git pull, Git'iniz çok eskiyse, güncellenemeyecek origin/demoancak aynı sonucu üretecektir). İkincisi, origin/masteriçeri sokmaktır master.
Kimin güncellediği demove / veya bana göre net değil master. Kendi demoşubenize kendi kodunuzu yazarsanız ve diğerleri kod yazıp onu demoşubeye iterse origin, bu ilk adım birleştirmede çakışmalar olabilir veya gerçek bir birleştirme oluşturabilir. Çoğu zaman, işi birleştirmek için birleştirmek yerine yeniden taban kullanmak daha iyidir (kuşkusuz, bu bir zevk ve fikir meselesidir). Eğer öyleyse, git rebasebunun yerine kullanmak isteyebilirsiniz . Kendi kaydedilmesini hiçbirinde asla Öte yandan, demo, hatta yok gerek bir demodalı. Alternatif olarak, bunu otomatikleştirmek istiyorsanız, ancak hem sizin hem de başkalarının yaptığı taahhütler olduğunda dikkatlice kontrol edebiliyorsanız, kullanmak isteyebilirsiniz.git merge --ff-only origin/demo: Bu, mümkünse demogüncellenenle eşleştirmek için hızlı ileri origin/demosarar ve değilse, tamamen başarısız olur (bu noktada, iki değişiklik grubunu inceleyebilir ve uygun şekilde gerçek bir birleştirme veya yeniden ödeme seçebilirsiniz).
Bu, aynı mantık geçerlidir masterbirleştirme işlemini yapıyoruz rağmen üzerinde master kesinlikle bir ihtiyacın var, bu yüzden master. Bununla birlikte, hızlı ileri birleştirme olmayan birleştirme olarak yapılamazsa, birleştirmenin başarısız olmasını istemeniz daha olasıdır, bu nedenle bu muhtemelen de olmalıdır git merge --ff-only origin/master.
Diyelim ki asla kendi taahhütlerinizi yapmıyorsunuz demo. Bu durumda adı demotamamen terk edebiliriz :
git fetch origin # update origin/*
git checkout master
git merge --ff-only origin/master || die "cannot fast-forward our master"
git merge -X theirs origin/demo || die "complex merge conflict"
git push origin master
Eğer varsa vardır kendi yapıyor demoşube kaydedilmesini, bu yararlı değildir; Mevcut birleştirmeyi de koruyabilir (ancak belki --ff-onlyistediğiniz davranışa bağlı olarak ekleyebilirsiniz ) veya bir geri ödeme yapmaya geçebilirsiniz. Üç yöntemin de başarısız olabileceğini unutmayın: birleştirme bir çakışma ile başarısız olabilir, ile birleştirme --ff-onlyhızlı ileri gidemeyebilir ve yeniden ödeme bir çatışmayla başarısız olabilir (yeniden ödeme, özünde, birleştirmeyi kullanan kiraz toplama taahhütleri ile çalışır. makine ve dolayısıyla bir birleşme çatışması olabilir).
git push -f origin master