วิธีผสานความขัดแย้งของ Git ใน Emacs


84

การผสาน Git ล่าสุดของฉันส่งผลให้เกิดความขัดแย้งจำนวนมาก แนวทางปัจจุบันของฉันคือค้นหาการเกิดขึ้นครั้งถัดไปของ '<<<' จากนั้นทำการผสานโดยการแก้ไขข้อความมาตรฐาน

คำถาม : มีวิธีที่ Emacs สามารถรองรับการผสานโดยใช้ข้อมูลที่มีอยู่ใน Git เกี่ยวกับเวอร์ชันของฉันเวอร์ชันของพวกเขาและเวอร์ชันพื้นฐานของไฟล์ได้หรือไม่


แก้ไข: คำถามนี้มีขอบเขตที่แตกต่างจากคำถามที่เกี่ยวข้องเนื่องจากไม่ จำกัด การเรียกใช้ ediff


7
หากคุณต้องใช้ Magit คุณสามารถโหลดบัฟเฟอร์สถานะแล้วกดeไฟล์ที่แสดงว่าขัดแย้งกัน Magit จะเปิดตัวediffเพื่อทำการผสานและแจ้งให้คุณทราบภายหลังเพื่อยืนยันการเปลี่ยนแปลงของคุณจากนั้นคุณสามารถเรียกใช้ไฟล์ที่ผสาน
wvxvw

@ ผู้เริ่มต้น: 3 คนอื่น ๆ คิดว่ามันซ้ำกันและฉันเป็นคะแนนสุดท้าย เหตุใดเธรดอื่น ๆ ที่อ้างถึงจึงให้คำตอบเดียวกัน ( smergeและvc-resolve-conflictรวมถึงอีกข้อหนึ่งediff) และมีความยาวกว่า ฉันยอมรับว่าเธรดแรกสามารถใช้ชื่อที่ดีกว่าได้
แดน

@ ฉันไม่เห็นด้วย: มันเป็นคำถามที่แตกต่างกันและคำตอบที่คล้ายกันไม่เปลี่ยนที่
เริ่มต้น

1
@IqbalAnsari: ฉันคิดว่าหัวข้ออื่น ๆ ต้องการชื่อที่ดีกว่าเพื่อให้ผู้คนสามารถค้นหาได้ง่ายขึ้น ในความเป็นจริงฉันคิดว่าหัวข้อของผู้เริ่มต้นจะดีสำหรับมัน อย่างไรก็ตามเราจะรอสักครู่เพื่อดูว่าผู้คนต้องการเปิดกระทู้นี้อีกครั้งหรือไม่ ถ้าไม่ฉันจะเปลี่ยนชื่อหัวข้อแรกเป็นชื่อผู้เริ่มต้น
แดน

1
และสำหรับสิ่งที่คุ้มค่าฉันคิดว่านี่เป็นคำถามที่ดีพร้อมคำตอบที่ดี เป็นเพียงแค่ฉันคิดว่ามันซ้ำซ้อน - แต่คนอื่นไม่สามารถแบ่งปันความคิดเห็นนั้น (เกี่ยวกับการทำซ้ำนั่นคือ)
แดน

คำตอบ:


86

คุณอาจต้องการที่จะลองเพียงแค่เปิดไฟล์ขัดแย้งและทำsmerge-mode M-xsmerge-modeRETมันจะเน้นภูมิภาคที่ขัดแย้งทั้งหมด นอกจากนี้ยังเพิ่ม keybindings ได้อย่างง่ายดายแก้ปัญหาความขัดแย้งที่ปรึกษา Documenation มันC-hfsmerge-modeRETรู้ว่าพวกเขา

คำนำหน้าเริ่มต้น

ฉันพบว่าคำนำหน้าเริ่มต้นสำหรับความsmerge-mode C-c^ยุ่งยากดังนั้นฉันจึงเปลี่ยนเป็น C-cv

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

ปุ่มลัดที่สำคัญ

สำหรับฉันการผูกที่สำคัญที่สุดคือ:

smerge-nextผูกไว้เพื่อsmerge-command-prefixnย้ายไปยังความขัดแย้งต่อไป

smerge-previousผูกไว้เพื่อsmerge-command-prefixpย้ายไปยังความขัดแย้งก่อนหน้า

smerge-keep-currentผูกไว้เพื่อsmerge-command-prefixRETรักษาเวอร์ชันที่เคอร์เซอร์เปิดอยู่

smerge-keep-mineผูกพันกับsmerge-command-prefixmการเปลี่ยนแปลงของคุณ

smerge-keep-otherผูกพันกับsmerge-command-prefixoการเปลี่ยนแปลงอื่น ๆ

smerge-ediffผูกไว้เพื่อsmerge-command-prefixEเริ่มเซสชัน ediff เพื่อรวมความขัดแย้ง สิ่งนี้เหมือนกับvc-resolve-conflicts(ขอบคุณ @phils และ @Malabarba สำหรับการชี้เรื่องนี้)

เปิดใช้งานโหมด smerge โดยอัตโนมัติ

อัปเดต: ข้อมูลต่อไปนี้เกี่ยวข้องเฉพาะกับรุ่น Emacs ก่อนหน้า25.1นี้อาจทำให้เกิดปัญหากับรุ่นต่อ ๆ ไปได้ที่https://github.com/magit/magit/magit/issues/3897

นอกจากนี้คุณอาจสนใจเปิดใช้งานโดยอัตโนมัติsmerge-modeเมื่อไปที่ไฟล์ / บัฟเฟอร์ด้วยเครื่องหมายข้อขัดแย้งคุณสามารถใช้สิ่งต่อไปนี้เพื่อให้บรรลุสิ่งนี้

(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)

โปรดทราบว่าฉันกำลังใช้งานอยู่buffer-list-update-hookและไม่ใช่find-file-hookเพราะหลายครั้งที่ฉันได้รับข้อขัดแย้งในบัฟเฟอร์ซึ่งเปิดใช้แล้วใน emacs ซึ่งกรณีfind-file-hookนี้ไม่มีความช่วยเหลือ

ตรวจสอบวิธีการอื่นที่กล่าวถึงในคำตอบนี้ด้วย


1
(1)smerge-ediffอย่าลืม (2)คุณใช้ Emacs เวอร์ชั่นใด? ในสาขาหลักของ emacs ปัจจุบันการรวมข้อมูลจะเปิดโดยอัตโนมัติ (3)ทำไมคุณใช้buffer-list-update-hookแทนfind-file-hook?
Malabarba

สำหรับคำชี้แจงเพิ่มเติมให้สังเกตว่าsmerge-ediffและvc-resolve-conflictsเป็นสิ่งเดียวกัน
phils

@Malabarba 1)ฉันไม่ได้พูดถึงว่าsmerge-modeมีการบันทึกการเชื่อมโยงคีย์ไว้ในเอกสารของมันหรือไม่ บางทีฉันสามารถอ้างอิงคู่มือที่นี่เพื่อความสมบูรณ์ ขอบคุณสำหรับความคิดเห็น. 2)ฉันใช้ v24.5 แม้ว่าฉันจะลองใช้กิ่งไม้เป็นบางครั้งฉันจำไม่ได้ว่าการหันเหความสนใจถูกเปิดโดยอัตโนมัติ (เป็นการเปลี่ยนแปลงล่าสุดหรือไม่) 3)นั่นเป็นเพราะเวลาส่วนใหญ่ที่ฉันได้รับความขัดแย้งในบัฟเฟอร์เปิดแล้วซึ่งในกรณีนี้ฉันจะต้องเปิดอย่างชัดเจนsmerge-mode
Iqbal Ansari

@IqbalAnsari มีเหตุผลใดบ้างที่ไม่smerge-modeเปิดใช้งานตลอดเวลา บางทีมันอาจจะไม่ได้ทำอะไรมากมายจนกระทั่งถูกเรียก
PythonNut

@ PythonNut คำถามที่ดีน่าเสียดายที่ฉันไม่มีคำตอบเพราะฉันไม่เคยพยายามทำให้มันเปิดใช้งานตลอดเวลามันคุ้มค่าที่จะลอง
Iqbal Ansari

32

แก้ไข: เนื่องจากคำตอบนี้มี upvotes มากกว่าที่ฉันคาดไว้ฉันจึงขยายออกเล็กน้อย

เพื่อเสริมคำตอบโดย @IqbalAnsari คุณสามารถใช้vc-resolve-conflicts(ตามที่คนอื่นพูดถึงมันเป็นชื่อแทนsmerge-ediff) นี่จะเป็นการเริ่มediffอินเทอร์เฟซ ทางด้านซ้ายจะเป็นพาเรนต์ผสานแรกและอีกอันรวมอยู่ด้านขวา พวกเขามีข้อความกำกับใน modeline ด้วยMINEและOTHERตามลำดับ บัฟเฟอร์ที่ผสานแสดงอยู่ด้านล่าง (ดูภาพหน้าจอ)

สกรีนช็อตของอินเทอร์เฟซ <code> ediff </code>

keybindings

  • นำทางผ่านความขัดแย้งด้วยและnp
  • ยอมรับรุ่นด้วยหรือab
  • ดูบรรพบุรุษด้วย/!
  • ออกจากเซสชั่น ediff qด้วย

คุณสามารถนำทางไปยังบัฟเฟอร์ที่ผสานด้วยother-windowและการแก้ไขด้วยมือในกรณีที่การแก้ไขข้อขัดแย้งมีความซับซ้อนมากกว่าการยอมรับเวอร์ชัน เมื่อเสร็จแล้วคุณสามารถบันทึกบัฟเฟอร์และออกจาก Emacs ได้ตามปกติ สำหรับความช่วยเหลือเพิ่มเติมเพียงใช้?ระหว่างediffเซสชันมีคำสั่งที่มีประโยชน์มากมายในนั้น ฉันยังไม่รู้ว่าครึ่งหนึ่งของพวกเขาทำอะไร!


2
นี่คือวิธีที่อร่อยที่สุด IMO ฉันผูกพันกับมันC-x v <แม้ว่าในทางปฏิบัติฉันมีแนวโน้มที่จะกล่าวอ้างกับ Magit (ตามความคิดเห็นของ wvxvw)
phils

1
ตั้งแต่ปี 2000 vc-resolve-conflictเป็นชื่อแทนsmerge-ediffซึ่งตามชื่อแนะนำเริ่มเซสชัน Ediff ไม่ใช่เซสชัน Emerge ยังไงก็ตามส่วนหัวของไลบรารีที่ediff.elรับทราบemerge.elอิทธิพลและจากนั้นก็พูดว่า "Ediff รุ่นปัจจุบันแทนที่ Emerge ซึ่งให้ส่วนติดต่อผู้ใช้ที่เหนือกว่าและมีคุณสมบัติที่สำคัญมากมายที่ไม่พบใน Emerge โดยเฉพาะมันสามารถทำการปะและ การเปรียบเทียบการผสานและการทำไดเรกทอรีของไฟล์สองทางและ 3 ทาง "
Tarsius

6
นอกจากนี้โปรดทราบว่าmagit-ediff-resolve( Emหรือeในไฟล์ที่มีข้อขัดแย้ง) จะใช้smerge-ediffภายใน อย่างไรก็ตามมันจะแทนที่ediff-quit-hookเพื่อมอบประสบการณ์การตกแต่งเซสชันที่ดีขึ้นเล็กน้อย แทนที่จะบอกคุณว่าคุณสามารถบันทึก "บัฟเฟอร์" (มีหลายบัฟเฟอร์) มันจะถามคุณว่าคุณต้องการบันทึกบัฟเฟอร์ (ในขณะที่แสดงชื่อของคุณหรือไม่)
tarsius

มีวิธีการแสดง 4 windows (เราผู้ปกครองพวกเขาพื้นที่ทำงาน) เช่น vimdiff หรือไม่?
user1133275

9

หากคุณบังเอิญใช้ Spacemacs ฉันขอแนะนำให้เปิดใช้งาน "smerge-transient-mode" ซึ่งแสดงเมนูไฮดราพร้อมกับคำสั่ง smerge ที่เป็นไปได้ทั้งหมด

ในการทำเช่นนั้นให้เรียก Mx spacemacs/smerge-transient-state/bodyซึ่งเป็นค่าเริ่มต้นตามที่กำหนดSPC-g-rไว้

นี่คือภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่

การแก้ไขไฟล์ของคุณควรเป็นเรื่องง่าย:

  1. กดnเพื่อไปยังก้อนใหญ่ถัดไป
  2. เลือกการกระทำที่ผสาน
  3. ทำซ้ำจนกว่าจะเสร็จ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.