vimdiff และผสานความขัดแย้ง


14

เมื่อทำการผสานสาขาภายใต้การควบคุมของแหล่งที่มามักจะมีปัญหาการผสานที่ขัดแย้งกับผู้พัฒนารายอื่น

ฉันรู้ว่าเราสามารถใช้ vimdiff ในการเปลี่ยนรหัสกับการควบคุมซอร์สแต่ก็มีวิธีที่เราสามารถใช้ vimdiff เพื่อช่วยแก้ไขข้อขัดแย้งในการรวมความขัดแย้ง

โดยส่วนตัวฉันสนใจ git มากขึ้น แต่มันจะมีประโยชน์ที่จะเข้าใจว่ามีปลั๊กอิน / เทคนิคสำหรับเครื่องมือ / ระบบควบคุมแหล่งข้อมูลอื่น ๆ


คุณเคยได้รับMeldลอง?
Eric Sabelhaus

1
@EricSabelhaus: ดีกว่า vimdiff ในการแก้ไขข้อขัดแย้งหรือไม่? เว็บไซต์นี้เกี่ยวกับการถาม / ตอบคำถามเกี่ยวกับกลุ่ม
Martin York

มันขึ้นอยู่กับกรณีการใช้งานที่ฉันคิด ถ้าฉันทำงานกับโค้ดที่อยู่ในระยะไกลฉันจะใช้ vimdiff อย่างแน่นอนที่สุด หากฉันทำงานในเครื่องของฉันฉันจะใช้ Meld เนื่องจากมีฟีเจอร์ UI ที่หลากหลายเพื่อช่วยนักพัฒนาในการผสาน 3 ทางที่ซับซ้อน
Eric Sabelhaus

1
@EricSabelhaus: สำหรับฉันคำfeature rich UIนี้ทำให้เข้าใจผิด; vimdiff อาจไม่มี UI ที่ดีมันมีคุณสมบัติที่หลากหลายอย่างแน่นอน ฉันยังพบว่ามีสภาพแวดล้อมที่มีประสิทธิผลมากกว่าที่ผู้แก้ไข GUI ทั้งหมดที่ฉันใช้ (แต่ฉันใช้มาเป็นเวลานานและเป็นช่วงการเรียนรู้ที่สูงชัน) ฉันอยากรู้อยากเห็นมากขึ้นถ้า Meld ทำอะไรที่กลุ่มไม่ทำอย่างนั้นจะทำให้คุ้มค่าในขณะที่มอง
Martin York

ฉันไม่สามารถพูดได้เป็นพิเศษว่ามันมีชุดคุณสมบัติที่แข็งแกร่งกว่านี้หรือไม่ แต่มันอยู่ในขอบเขตเดียวกับ vimdiff
Eric Sabelhaus

คำตอบ:


18

ปกติฉันจะใช้คอมไพล์ในบรรทัดคำสั่ง

แต่เมื่อมีข้อขัดแย้งในการผสานฉันใช้ Vim เพื่อแก้ไขด้วย (ส่วนตัวฉันทำกับปลั๊กอินผู้ลี้ภัย) หมายเหตุ: ผู้ลี้ภัยเป็นสิ่งที่ดีสำหรับการจัดการคอมไพล์จำนวนมากจากภายใน Vim คุณสมบัติที่ฉันชอบคือ 3 วิธีที่แตกต่างจากการรวมความขัดแย้ง

git รองรับสิ่งนี้ใน vimdiff ผ่าน git mergetool ฉันติดตั้ง fugitive แล้ว แต่คุณสามารถตั้งค่าด้วยตนเอง (ขอบคุณ @Jay Thompson)

ตั้งค่าด้วยตนเอง:

git config --global merge.tool vimdiff
git mergetool <file with conflicts>

เอาต์พุตแตกต่างจากที่อธิบายไว้ด้านล่างเล็กน้อย (ฉันไม่ได้ใช้สิ่งนี้เป็นการส่วนตัว) แต่หลักการเหมือนกัน แต่คุณมีหน้าต่างที่สี่ที่ด้านล่างที่มีผลลัพธ์

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

ตั้งค่าด้วย Fugitive

vim-fugitiveเป็น git wrapper / integration plugin สำหรับ Vim; มันสามารถทำหลายสิ่งหลายอย่างและการแก้ไขความขัดแย้งเป็นหนึ่งในนั้น

<Install the Fugitive Plugin>
vim <file with conflicts>
:Gdiff
  1. ดู 2 (ซ้าย): รหัสที่อยู่ในสาขาของคุณ
  2. ดู 1 (กลาง): รหัสที่ผสาน (มีข้อขัดแย้ง)
  3. ดู 3 (ขวา): รหัสที่รวมเข้ากับรหัสของคุณ

ตอนนี้คุณสามารถดึงและรับข้อความจากมุมมองอื่นสองมุมมองลงในมุมมองส่วนกลาง (ซึ่งจะมีการแก้ไขด้วยตนเองทั้งหมด) เมื่อคุณแก้ไขข้อขัดแย้งทั้งหมดด้วยตนเองแล้วให้ออกจาก vimdiff

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

แม้ว่าคุณสามารถใช้:diffget <view number>และ:diffput <view number>เพื่อดึงและดันสิ่งต่าง ๆ ระหว่างมุมมอง ฉันไม่พบว่ามีประโยชน์มากเป็นการส่วนตัว รหัสทั้งหมดอยู่ในมุมมองกลางแล้ว ดังนั้นฉันแค่ต้องการแก้ไขมุมมองนั้นด้วยตนเองจนกว่าจะแก้ไขข้อขัดแย้งได้ ความสามารถในการดูโค้ดทั้งสองรุ่นที่ด้านใดด้านหนึ่งของหน้าต่างตัวแก้ไขของฉันทั้งสองมีประโยชน์อย่างมาก

ยังเป็นตัวอย่างที่ดีของการใช้งานที่นี่


1
หากคุณไม่ต้องการใช้หรือติดตั้ง Fugitive ด้วยเหตุผลบางอย่างคุณสามารถตั้งค่าgit config --global merge.tool vimdiffและเรียกใช้git mergetoolเพื่อเริ่ม vim ในโหมด diff ได้
Jay Thompson

สิ่งนี้สนับสนุนรูปแบบ "diff3" ของการผสานที่ขัดแย้งกันซึ่งมีการแสดง "บรรพบุรุษร่วมที่ผสาน" หรือไม่
alxndr

@alxndr: ฉันไม่เคยได้ยิน diff3 มาก่อน แต่หลังจาก google รวดเร็ว ผลลัพธ์ของความขัดแย้งที่ผสานในคอมไพล์ (และควบคุมแหล่งอื่น ๆ ที่ฉันได้ใช้) diff3 -Eเป็นเช่นเดียวกับ ดังนั้นภาพด้านบนจึงสร้างจากไฟล์ที่มีเครื่องหมายเหล่านี้
Martin York

ตอนนี้ฉันมองอย่างใกล้ชิดภาพแรกแสดงให้เห็นถึงรูปแบบการผสาน diff3 บานหน้าต่างด้านบนตรงกลาง "BASE" เป็นบรรพบุรุษร่วมกันซึ่งบานหน้าต่างด้านซ้ายและขวาแยกออกจาก
alxndr

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