Emacs'ta Git çatışmalarını birleştirme


84

Son Git birleştirme, çok sayıda çatışmalara neden oldu. Mevcut yaklaşımım, bir sonraki '<<<' oluşumunu araştırmak ve daha sonra standart metin düzenlemesiyle birleştirme işlemini gerçekleştirmektir.

Soru : Emacs'in Git'teki bilgileri sürümümle, sürümleriyle ve dosyanın temel sürümüyle ilgili kullanarak birleştirmeyi desteklemesinin bir yolu var mı?


Düzenleme: Bu soru, bu konuyla ilgili olandan farklı bir kapsama sahiptir , çünkü ediff'i çağırmakla sınırlı değildir.


7
Magit'i kullanacak olsaydınız, durum arabelleğini yükleyebilir ve ardından eçelişkili olarak gösterilen dosyalara basabilirsiniz . Magit ediffbirleşme işlemini başlatmak için başlatır ve değişikliklerinizi onaylamanız için sizden sonra uyarır , ardından birleştirilmiş dosyayı düzenleyebilirsiniz.
wvxvw 09:15

@Binner: 3 kişi daha bunun bir kopya olduğunu düşündü ve ben de son oydu. Neden: Atıf yapılan diğer konu aynı cevapları ( smergeve aynı vc-resolve-conflictzamanda bir tanesini de verir ediff) verir ve daha uzun süredir vardır. Yine de ilk konunun daha iyi bir başlık kullanabileceğini kabul ediyorum.
Dan

@ Katılmıyorum: farklı bir soru ve cevabın benzer olması bunu değiştirmiyor.
Başlangıç

1
@IqbalAnsari: İnsanların daha kolay bulabilmeleri için diğer başlığın daha iyi bir başlığa ihtiyacı olduğunu düşünüyorum. Aslında, Acemi'nin konu başlığının bunun için iyi olacağını düşünüyorum. Ancak, insanların bu konuyu yeniden açmak isteyip istemediklerini görmek için biraz bekleyelim. Olmazsa, Beginner'ın başlığında ilk parçayı yeniden adlandırmak isterim.
Dan

1
Ve buna değer, bunun iyi cevapları olan iyi bir soru olduğunu düşünüyorum. Sadece bunun aynı zamanda bir kopya olduğunu düşünüyorum - ama diğerleri (bu çoğaltma hakkında) bu görüşü paylaşmayabilir.
Dan

Yanıtlar:


86

Yalnızca smerge-modeçakışan dosyayı açıp yapmak denemek isteyebilirsiniz M-xsmerge-modeRET. Tüm çelişkili bölgeleri vurgulayacaktır. Ayrıca, anlaşmazlıkları kolayca çözmek için anahtar kelimeler ekler, C-hfsmerge-modeRETonları tanımak için belgelendirmesine danışın .

Varsayılan önek

smerge-mode C-c^Hantal için varsayılan önek buluyorum, bu yüzden onu değiştirdim C-cv

(setq smerge-command-prefix "\C-cv")

Önemli tuş bağlantıları

Benim için en önemli bağlantılar:

smerge-nextsmerge-command-prefixnBir sonraki çatışmaya geçmek için bağlı .

smerge-previoussmerge-command-prefixpönceki çatışmaya geçmek için bağlı .

smerge-keep-currentsmerge-command-prefixRETimlecin açık olduğu sürümü saklamak için bağlı .

smerge-keep-minesmerge-command-prefixmdeğişikliklerinizi sürdürmek zorunda kaldı.

smerge-keep-othersmerge-command-prefixodiğer değişiklikleri yapmaya bağlı .

smerge-ediffsmerge-command-prefixEçatışmaları birleştirmek için ediff oturumu başlatmak üzere bağlı . Bu aynıdır vc-resolve-conflicts(bunu belirtmek için @ phils ve @Malabarba'ya teşekkürler).

Smerge modunun otomatik olarak etkinleştirilmesi

GÜNCELLEME: Aşağıdakiler yalnızca önceki Emacs sürümleriyle ilgilidir 25.1, aşağıdakiler sonraki sürümlerde sorunlara neden olabilir, bkz. Https://github.com/magit/magit/issues/3897

Ek olarak smerge-mode, çakışma işaretleyicileri olan bir dosyayı / tamponu ziyaret ederken otomatik olarak etkinleştirmek isteyebilirsiniz , bunu elde etmek için aşağıdaki gibi bir şey kullanabilirsiniz.

(defun my-enable-smerge-maybe ()
  (when (and buffer-file-name (vc-backend buffer-file-name))
    (save-excursion
      (goto-char (point-min))
      (when (re-search-forward "^<<<<<<< " nil t)
        (smerge-mode +1)))))

(add-hook 'buffer-list-update-hook #'my-enable-smerge-maybe)

Kullandığım buffer-list-update-hookve find-file-hookçoğu zaman zaten emacs'ta açık olmayan bir arabellekte çatışmalar aldığımdan beri kullanmamaya dikkat edin find-file-hook.

Ayrıca bu cevapta belirtilen diğer yöntemleri de kontrol edin.


1
(1) Unutma smerge-ediff. (2) Hangi Emacs versiyonundasınız? Geçerli emacs ana dalında, smerge otomatik olarak açılır. (3) Neden buffer-list-update-hookyerine kullanıyorsunuz find-file-hook?
Malabarba 9:15

İlave açıklama için dikkat smerge-ediffve vc-resolve-conflictsaynı şeydir.
phils

@Malabarba 1) Anahtar kelimelerinin smerge-modebelgelerinde belgelendiğinden bahsettim . Belki el kitabını eksiksiz bir şekilde alıntılayabilirim. Geri dönüşünüz için teşekkür ederiz. 2) v24.5'teyim, bazen ana şubeyi denememe rağmen, otomatik olarak çevrilmeyi önemsemiyorum (son bir değişiklik mi?). 3) Zaten açık arabelleklerde çoğu zaman çatışmalar çektiğimden dolayı, ki bu durumda açıkça açmam gerekeceksmerge-mode
Iqbal Ansari

@IqbalAnsari her smerge-modezaman etkin olmamak için herhangi bir neden var mı? Belki de çağrılana kadar pek bir şey yapmaz.
PythonNut 14:15

@PythonNut İyi bir soru, ne yazık ki, her zaman etkin olmaya çalıştığımdan beri asla bir cevabım yok, ama yine de denemeye değer
Iqbal Ansari

32

Düzenleme: Bu cevap beklediğimden daha fazla olumlu oy aldığından, onu biraz genişlettim.

@IqbalAnsari tarafından verilen yanıtı desteklemek için de kullanabilirsiniz vc-resolve-conflicts(başkaları tarafından belirtildiği gibi, bu bir takma addır smerge-ediff). Bu ediffarayüz başlayacaktır . Solda, ilk birleştirme ebeveyn ve sağda ikinci birleştirme ebeveyn olacak. Modelinde sırasıyla MINEve ile etiketlenirler OTHER. Birleştirilmiş tampon aşağıda gösterilmektedir (ekran görüntüsüne bakınız).

<code> ediff </code> arabiriminin ekran görüntüsü

Keybindings

  • Gezinin ile çatışmalar yoluyla nve p.
  • aVeya ile sürümleri kabul edinb .
  • Atası bak ile /!
  • İle ediff oturumundan çıkınq .

other-windowBir çatışmayı çözmek için bir sürümü kabul etmekten daha karmaşık bir durum olması durumunda , birleştirilmiş arabellek ile ve el ile de gezinebilirsiniz . İşiniz bittiğinde, arabellek kaydedebilir ve her zamanki gibi Emacs'ten çıkabilirsiniz. Daha fazla yardım için, sadece oturum ?sırasında kullanın ediff, orada çok yararlı komutların bir sürü var. Hala yarısının ne yaptığını bilmiyorum!


2
Bu IMO en güzel yöntemdir. Ben bağlı olan C-x v <uygulamada I (wvxvw yorumuna göre) Magit ile çağırma olma olasılığı olduğum halde.
phils

1
2000 yılı vc-resolve-conflictbir ad takma olduğundan smerge-ediff, adından da anlaşılacağı gibi bir Emerge oturumu değil, bir Ediff oturumu başlatır. Bu arada, kütüphane başlığı ediff.elkabul emerge.eldan etkilendiğini ve ardından Ediff bugünkü versiyonu Ortaya yerini "diyerek devam ediyor. Bu üstün bir kullanıcı arabirimi sağlar ve bulunan Ortaya değil çok sayıda önemli özelliğe sahiptir. Özellikle, yama yapmak ve olabilir 2 yollu ve 3 yollu dosya karşılaştırma, birleştirme ve dizin işlemleri. "
tarsius

6
Ayrıca magit-ediff-resolve( Emveya eçakışmaları olan bir dosyada) smerge-ediffdahili olarak kullandığını unutmayın . Bununla birlikte, ediff-quit-hookbiraz daha iyi bir oturum sonlandırma deneyimi sağlamak için geçersiz kılar . “Tamponu” kaydedebileceğinizi söylemek yerine (birkaç tampon vardır), tamponu kaydetmek isteyip istemediğinizi sorar (size adını gösterirken).
tarsius

Vimdiff gibi 4 pencere (bizim, ebeveyn, onların, çalışma alanı) göstermek için bir yolu var mı?
user1133275

9

Spacemacs kullanıyorsanız, olası tüm smerge komutlarını içeren bir hydra menüsü getiren "smerge-geçici mod" u etkinleştirmenizi öneririm.

Bunu yapmak için, spacemacs/smerge-transient-state/bodyvarsayılan olarak atanmış olan Mx'i arayın SPC-g-r.

İşte bir ekran görüntüsü:

görüntü tanımını buraya girin

Dosyanızı düzenlemek sonra sezgisel olmalıdır:

  1. Bir nsonraki parçaya gitmek için tuşuna basın .
  2. Bir birleştirme eylemi seçin .
  3. Yapana kadar tekrarlayın.
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.