Bu cevapla pek ilgili değil, ama git pull
sadece git fetch
onu 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 , -X
seçenekler birleştirme stratejiye geçti ve varsayılan hem edilir recursive
strateji ve alternatif resolve
strateji almak -X ours
veya -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ı --ours
versiyonu) ve (aynı zamanda uzak veya adı verilen diğer --theirs
aynı 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 color
için colour
17. satırdaki ve değiştirmek fred
için barney
on 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 ours
Ve -X theirs
bizim 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 demo
içine (onların) master
(bizim) ve değişiklikleri istiyorum demo
, istediğiniz olur -X theirs
.
-X
Ancak 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 i
döngü sayacı olarak. İki değişikliği birleştirirsek, ortaya çıkan kod artık derlenmez. -X
Seç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-commit
için git merge
komuta. 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, -X
argü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 demo
olana getirmektir (sizinki git pull
, Git'iniz çok eskiyse, güncellenemeyecek origin/demo
ancak aynı sonucu üretecektir). İkincisi, origin/master
içeri sokmaktır master
.
Kimin güncellediği demo
ve / 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 rebase
bunun yerine kullanmak isteyebilirsiniz . Kendi kaydedilmesini hiçbirinde asla Öte yandan, demo
, hatta yok gerek bir demo
dalı. 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 demo
güncellenenle eşleştirmek için hızlı ileri origin/demo
sarar 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 master
birleş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ı demo
tamamen 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-only
istediğ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-only
hı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