Uzaktan değişiklikleri nasıl atabilir ve bir dosyayı "çözüldü" olarak nasıl işaretleyebilirim?


197

Bazı yerel dosyalarım var, uzak şubeden çekiyorum ve çakışmalar var. Yerel değişikliklerimi korumak ve çakışmalara neden olan uzaktan değişiklikleri yok saymak istediğimi biliyorum. Gerçekte "tüm çakışmaları çözülmüş olarak işaretle, yerel kullan" diyebileceğim bir komut var mı?


1
Aşağıdaki cevap bana süper aydınlatıcı oldu. Benim için gerçekten net şeyler yapan birkaç ince nokta var, uzman olmayan GIT kullanıcılarının aşağıdaki yazının altındaki tüm yorumları okumasını öneriyorum ve Brian!
Tom DeMille

Yanıtlar:


332

git checkout--oursyerel olarak sahip olduğunuz dosyanın sürümünü kontrol etme seçeneğine sahiptir (aksine --theirs, çektiğiniz sürümdür). Sen geçebilir .için git checkoutağaçtaki her şeyi kontrol etmek onu anlatmak için. Ardından, anlaşmazlıkları çözülmüş olarak işaretlemeniz gerekir, bu git addişlemle yapabileceğiniz ve işinizi tamamladıktan sonra işinize devam edebilirsiniz:

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

Not .içinde git checkoutkomuta. Bu çok önemli ve kaçırması kolay. git checkoutiki modu vardır; biri dal değiştirir ve diğeri dosyaları çalışma kopyasına dizinden kontrol eder (bazen ilk olarak başka bir revizyondan dizine çeker). Nasıl ayırt edileceği, bir dosya adı geçirip geçirmemenizdir; bir dosya adını geçmediyseniz, dalları değiştirmeye çalışır (bir dalı da geçmezseniz, sadece geçerli dalı tekrar kontrol etmeyi dener), ancak değiştirilmiş dosyalar varsa bunu yapmayı reddeder bu etkili olur. Bu nedenle, varolan dosyaların üzerine yazılacak bir davranış istiyorsanız ., ikinci davranışı almak için bir dosya adı veya dosya adı girmeniz gerekir git checkout.

İle dengelemek için, bir dosya içinde geçerken Aynı zamanda olması iyi bir alışkanlık --gibi git checkout --ours -- <filename>. Bunu yapmazsanız ve dosya adı bir dalın veya etiketin adıyla eşleşirse Git, dosya adını kontrol etmek yerine bu düzeltmeyi kontrol etmek istediğinizi düşünür ve bu nedenle checkoutkomutun ilk formunu kullanın .

Git'te çatışmaların ve birleşmenin nasıl işlediğini biraz daha genişleteceğim . Başkasının kodunu birleştirdiğinizde (çekme sırasında da olur; çekme aslında bir getirme ve ardından birleştirme işlemidir), birkaç olası durum vardır.

En basit olanı aynı revizyonda olmanızdır. Bu durumda, "zaten güncel "siniz ve hiçbir şey olmuyor.

Başka bir olasılık, revizyonlarının basitçe sizin bir soyundan gelmesidir, bu durumda varsayılan olarak birleştirme gerçekleşmeden HEADsadece taahhütlerine güncellenen bir "hızlı ileri birleştirme" ye sahip olursunuz (bu, kullanarak bir birleştirme kaydetmek istiyorum --no-ff).

Ardından, iki revizyonu birleştirmeniz gereken durumlara girersiniz. Bu durumda, iki olası sonuç vardır. Birincisi, birleşmenin temiz bir şekilde gerçekleşmesidir; tüm değişiklikler farklı dosyalardadır veya aynı dosyalardadır, ancak her iki değişiklik kümesinin de sorunsuz bir şekilde uygulanabileceği kadar uzaktır. Eğer bu devre dışı olsa Varsayılan olarak, temiz bir birleştirme olduğunda, otomatik olarak, kararlıdır --no-commitişlevi adlandırmak eğer düzenlemek gerekiyorsa bunu önceden (örneğin fooüzere barve başkasının aramaları bu yeni kodu ekler foo, bu temiz birleştirilecek , ancak kırık bir ağaç üretin, bu nedenle herhangi bir kırık taahhütten kaçınmak için birleştirme taahhüdünün bir parçası olarak bunu temizlemek isteyebilirsiniz).

Son olasılık, gerçek bir birleşme ve çatışmaların olmasıdır. Bu durumda, Git kadar birleştirme olabildiğince yapacak ve çatışma belirteçleri (ile üretim dosyaları <<<<<<<, =======ve >>>>>>>sizin çalışma kopyası). Dizinde ("hazırlama alanı" olarak da bilinir; dosyaların git addtaahhütte bulunmadan önce saklandığı yer ), her dosyanın çakışmalı 3 sürümüne sahip olacaksınız; dosyanın birleştirdiğiniz iki dalın atasından orijinal sürümü, birinden gelen sürüm HEAD(birleştirme tarafınız) ve uzak daldan sürüm var.

Çakışmayı çözmek için, çalışma kopyanızdaki dosyayı düzenleyebilir, çakışma işaretleyicilerini kaldırabilir ve kodu çalışacak şekilde düzeltebilirsiniz. Veya, bir ya da birleştirme diğer taraftan, kullanmaktan sürümünü kontrol edebilirsiniz git checkout --oursya git checkout --theirs. Dosyayı istediğiniz duruma getirdikten sonra, dosyayı birleştirmeyi tamamladığınızı ve dosyanın kullanılmaya hazır olduğunu belirtirsiniz git addve ardından birleştirmeyi gerçekleştirebilirsiniz git commit.


7
Muhtemelen git add --allveri havuzuna tüm dosyaları eklediğini unutmayın, böylece .gitignoredesenleriniz mükemmel durumda olmadıkça istenenden daha fazla dosya ekleyebilir . git add -umuhtemelen bu durum için daha uygundur, bir birleştirme çözümlenirken eklemek istemediğiniz izlenen dosyalarda düzenleme yapma olasılığınız düşüktür.
CB Bailey

Ayy üzgünüm. Demek istediğim şey o. Şimdi düzeltildi.
Brian Campbell

1
detaylı cevabınız için teşekkürler. Aslında git checkout --ours denedim ve (şimdi hatırlamıyorum) bir hata mesajı aldı. Söz konusu dosyalar dll (biz sadece saklamak birkaç var, çoğunlukla 3. parti referansları) ve ben sadece 'Tamam benim kopya istiyorum istedik ama hata' birleştirme sırasında ödeme olamaz 'gibi bir şey olduğunu söylemek istedim ..... Bu makaleyi referans olarak tutacağım ve bir dahaki sefere tekrar gerçekleştiğini tekrar deneyin ve çalışıp çalışmadığını veya bu mesajı gönderebilir miyim. Tekrar teşekkürler
Tom DeMille

ama açıklamanız benim için süreç hakkında çok şey temizler, tekrar teşekkürler ... Takip eden soru: Birleştirme temizlendikten sonra .orig dosyalarını silmek için git almanın herhangi bir yolu var mı?
Tom DeMille

2
Yapmanız gerek git checkout --ours .. Bu .önemlidir; bir dosya adıyla (bu durumda, tüm dizin) checkoutbiri dal değiştiren ve diğeri dosyaları dizinden çalışma kopyasına taşıyan iki farklı çalışma modu arasında seçim yapar. Katılıyorum, çok kafa karıştırıcı. Aynı git checkout --ours -- <filename>anda tek bir dosyayı kontrol etmek için de yapabilirsiniz .
Brian Campbell

23

Emin çatışma kökenli olun: Bir sonucudur ise git merge, bkz Brian Campbell 'ın cevabı .

Ancak git rebase, a'nın bir sonucuysa, uzak (onların) değişikliklerini atmak ve yerel değişiklikleri kullanmak için aşağıdakileri yapmanız gerekir:

git checkout --theirs -- .

Rebase sırasında nasıl ve nasıl takas edildiklerini görmek için " Neden ours" ve " theirs" tersine çevrilmiş " " ifadelerine bakın (çünkü yukarı akış şubesi kullanıma alınmıştır).ourstheirs

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.