git - yerel silindiğinde ancak dosya uzaktayken birleştirme çakışması


116

Git konusunda çok yeniyim ve yerel depoda ana daldaki birkaç dosyayı sildim, ancak bu dosyalar uzak ana dalda var olan bir birleştirme işlemine nasıl devam etmem gerektiğini merak ettim.

Git-merge yaptıktan sonra ortaya çıkan çakışmaları gösterir.

Git gui kullanarak, uzak dal dosyasının içeriği varken yerel dosyanın silindiğini gösterir.

Bu dosyaların çakışmasını nasıl durdurursunuz? Git gui kullanmanın basit bir yolu var mı?

Çok teşekkürler


Geçmişte yaptığım bir şey, "silinen" dosyaları kaynak denetiminde bırakmak, ancak onları proje / makefile / her neyse dışında bırakmaktı. En azından birleştirme çatışmaları için geçici bir çözüm.
Mark Rushakoff

2
Herhangi bir birleştirme çakışmasını düzelttiğiniz gibi düzeltirsiniz: istenen sürümü (dosya veya dosya eksikliği) dizine ekleyin ve ardından kesin. Hangisini istersin?
Cascabel


@MarkRushakoff "Çatışmayı çözmem gereken bir durumla karşılaştığımda, bunları gerçekten çözmüyorum, sadece onları maskelemek, böylece gelecekte birini (muhtemelen beni değil) ısırırlar" şeklinde tavsiyenizi yeniden ifade ederim. Bu, projeye daha fazla sorun getirmek isteyen biri için gerçekten iyi bir tavsiye.
Victor Yarema

Yanıtlar:


155

Anlaşmazlıkları uygun gördüğünüz şekilde çözmelisiniz. Dosyanın gerçekten kaldırılması gerekiyorsa ve bu değişikliği köken olarak yayınlayacaksanız, dosyayı tekrar kaldırın:

git rm path/to/file

Dosyanın aslında hala izlenmesi gerekiyorsa, ekleyin (çalışma ağacındaki sürüm, başlangıçtaki sürüm olacaktır):

git add path/to/file

Çatışmayı çözmek için bunlardan birini yaptıktan sonra, birleştirme işlemini gerçekleştirin.


Hepsi aynı dizinde ve hepsi aynı son eke sahip birkaç dosyam vardı. Dizindeki dosyaların geri kalanını korurken hepsini bir kerede kaldırmak için bir kısayol var mı?
chiborg

@chiborg: Bu sadece bir kabuk sorusu. cddizine ve git rm *.ext. Sizin kabuk (değil Git) genişler *.exttüm eşleşen dosya adları için.
Cascabel

Ve bazı dosyaları korumak istersem? bayrağı git rmyok -i.
chiborg

@chiborg: Belirli bir son eke sahip her şeyi kaldırmak ve diğer her şeyi olduğu gibi bırakmak istediğinizi söylediniz. Sana nasıl yapılacağını söylediğim tam olarak buydu. Yoksa demek istedin git rm *-suffix.ext? Aynı farklılık. Kabuk joker karakterlerini nasıl kullanacağınızı bulmakta sorun yaşıyorsanız, unix.stackexchange.com adresine sorun. İstediğiniz şeyin globbing ile yapılamayacağını biliyorsanız , silme işlemlerini almak için kullanın rm -ive takip edin git add -u.
Cascabel 1811

2
@Jefromi, eğer belirtiyorsam, -s recursive -X oursneden hala gerekli git rmve git add?
Noel Yap

27

Kabul edilen yanıta ek olarak ek bir ipucu olarak, "tarafımızdan silinmiş" olarak, silinen dosyada yapılan değişiklikleri görmek istiyorsanız, bu değişiklikleri başka yerlerde uygulayabilmeniz için:

git diff ...origin/master -- path/to/file

Bu bir "onlar tarafından silindi" senaryosuysa ve değişiklikleri başka bir yere uygulayabilmek için görmek istiyorsanız, şunları kullanabilirsiniz:

git diff origin/master... -- path/to/file

6
Evet! Bir dosya yeniden adlandırıldığında veya dosya silinmeden önce içeriğinin taşındığında olduğu gibi, birleştirmekte olduğunuz değişiklikleri ortadan kaldırmak istemiyorsanız bu çok önemlidir.
Edward Anderson

8
Bir hatırlatma olarak: Yeniden bağlama sırasında çakışma olduğunda bu işe yaramaz . Açıkça belirtilmesi gerekiyorgit diff mybranch@{1}...origin/master -- path/to/file
nschum

@nschum Teşekkürler! Tam da aradığım şey buydu.
Chuim

2
Ayrıca kullanabilirsiniz git diff --base(diğer cevabıma bakın).
Dorian Marchal

Merhaba Joseph, Bu cevap umut verici görünse de hala sıkıştım. Vaktiniz varsa, buradan cevaplamanızı çok isterim: stackoverflow.com/q/63044843/470749 Teşekkürler!
Ryan

9

Git GUI'de, çakışan dosyayı seçersiniz ve ardından çakışan metnin gösterildiği ana metin alanına sağ tıklayın.

Görünen bağlam menüsünde, "Uzaktan" veya "Yerel" ile gitmeyi seçebilirsiniz. Dolayısıyla, bir dosya uzaktan silinirse, silme işlemini yerel olarak yaymak için "Uzak" ı seçebilirsiniz veya bunun tersi de geçerlidir.

Bunu anlamam bir ay sürdü ... Git GUI gerçekten dokümantasyona sahip olsaydı iyi olurdu ...


4

En yüksek puan alan cevap, çatışmayı çözme yoluna odaklanır.

Bundan önce, muhtemelen yerel olarak kaldırılan dosyalarda uzaktan kumandanın neyi değiştirdiğini bilmek istersiniz.

Bunu yapmak için değişiklikleri şu şekilde görebilirsiniz:

git diff --base

Gönderen https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Çalışma ağacını "temel" sürüm [...] ile karşılaştırın. Dizin bu aşamaları yalnızca birleştirilmemiş girişler için, yani çatışmaları çözerken içerir.


İşte git diff --base stackoverflow.com/a/60484874/470749
Ryan

0

EGit'te de sorunlar buldum. Benim çözümüm şuydu:

  • Git Staging görünümünü kullandı.
  • Karşılaştırıcıyı açmak için aşamalı olmayan değişikliklerde gösterilen her dosyaya çift tıklandı
  • "Tümünü soldan sağa kopyala" simgesine tıklayın
  • Dosyayı kaydedin (aşamalı olmayan listeden kaybolacaktır)

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.