Yama uygularken çatışmaları çözmenin herhangi bir yolu var mı?


124

Pencerelerdeyim

Çeşitli nedenlerle, farklı svn dallarının birden çok git örneğine sahibiz.

Çoğu zaman A deposundaki bir sorunu düzeltmek, bir yama oluşturmak ve onu depo B'ye uygulamak istiyorum. Çakışma olmadığı sürece bu iyi çalışıyor.

Yeniden oluştururken, klasöre sağ tıklayıp tortioseGit'i kullanıp çözümleme seçeneğini seçiyorum. Bu, çatışmalarımın üstesinden gelmeme izin veren güzel bir kullanıcı arayüzü ortaya çıkarır.

Reddedilen yama parçalarıyla bunu başarmanın bir yolu var mı?

İşte yamaları oluşturma / uygulama konusundaki mevcut yaklaşımım

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch

3
Genellikle tüm yama seçenekleri başarısız olduğunda bunu elle yaparım ...
stdcall

Birleştirme başarısız olursa program, çünkü, öyle olamaz için BM-muğlak birleştirme nasıl anlamaya. <<<<, ===, >>>> setleri içeren bir dosya almalısınız ve bunları elle çözmelisiniz.
tacaswell

Evet, el ile yapmak, birkaç 100 rejimden bahsederken gerçek bir pide.
Kenoyer130

İşte o zaman seçtiğiniz git mergetoolgui ile 3 yönlü bir birleştirme yapmak isteyeceksiniz (pencerelerde kdiff'e düşkünüm) ...
g19fanatic

Yanıtlar:


254

Yamanızı oluşturmak için aşağıdakileri yapın:

git format-patch --stdout first_commit^..last_commit > changes.patch

Artık yamaları uygulamaya hazır olduğunuzda:

git am -3 < changes.patch

-3çakışma varsa üç yönlü birleştirme yapacağız. Bu noktada bir yapabilirsiniz git mergetoolBir gui'ye gitmek ya da sadece elle (standart vim kullanarak dosyaları birleştirmek istiyorsanız <<<<<<, ||||||, >>>>>>çatışma çözme).


3
Eklemek için yararlı olabilir --ignore-whitespace --ignore-space-changeiçin git amde. Onsuz gitmeyen önemsiz birleşmelerim oldu.
angularsen

12
git apply -3 changes.patchbenim için de çalışıyor gibi görünüyor
peterflynn

1
Yama temiz bir şekilde uygulanmasa da hala "Birleştirmeye gerek yok" mesajını alıyorum git mergetool. Bunun yerine, kullanılan orijinal yamayı temel commit'i bulmalıydım, bunun üzerine başvurmalı (neyse ki repomda bu vardı) ve sonra yeniden ödeme yapmalıydım.
jozxyqk

4
@Jozxyqk ile aynı sorunu yaşıyorum. Ne git am -3de git apply -3aslında gibi mesajlar almak bile, benim dosyalar halinde çatışma işaretleri düşecek Applied patch to 'configure.ac' with conflicts.ve error: patch failed: .... Bu açık git 2.17.1. Belki bazı dosyalara hiç yama uygulanamadığında, git geri alır?
nh2

1
@ Nh2 ile aynı sorunu aldım, sorunu hiç buldunuz mu?
Eridanis

12

Yamaları uygularken, yeniden oluştururken veya birleştirirken sık sık aynı çakışma kümesiyle karşılaşıyorsanız, git rerere (kaydedilen çözünürlüğü yeniden kullanma) işlevini kullanabilirsiniz. Bu, geçmişte bunları nasıl çözdüğünüze bağlı olarak çatışmaların nasıl çözüleceğini önceden tanımlamanıza olanak tanır. Bunun nasıl çalıştığına ilişkin ayrıntılar için http://git-scm.com/blog/2010/03/08/rerere.html adresine bakın .


5

TortoiseGit, yama dosyalarını açabilen bir birleştirme özelliğine sahiptir.

Burada bir resmi var .


Aslında birleştirme seçeneği aradığım şey olabilir.
Kenoyer130

Gerçekten mi? Uzun zamandır kaplumbağa kullanmadım, ancak bağlantılı sayfada "TortoiseMerge Git yama dosyasını doğrudan açabilir, gözden geçirin ve çalışma kopyasına yama yaparsınız." Metni var, bu yüzden olması gerektiği gibi görünüyor!
ams

yama dosyalarını açar ... ancak bazen yama dosyası formatı kaplumbağa haklarını bozar. diff -u ile hiçbir zaman başarılı olamadım, bunun yerine diff -c çıktı.
thistleknot

Ayrıca yamaları çalışan bir ağaç klasörüne sağ sürükleyebilir ve "Yamayı seri uygula" (0001-xxx.patch, ... 0002-xxy.patch gibi yamalar için) veya "Tek yama dosyası uygula" seçeneğini seçebilirsiniz.
MrTux

2

Benim yaklaşımım:

  • Dosyaların aynı olduğu bir "Entegrasyon" Şubesi oluşturun
  • Yamayı bu Entegrasyon Dalına uygulayın
  • Uzmanlaşmak için birleştirin veya yeniden sıralayın (yeniden düzenlemenin burada yararlı olup olmadığını bilmiyorum, çünkü daha fazla yama uygularken ne olacağını bilmiyorum)
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.