การตั้งค่าและใช้ Meld เป็น git difftool และ mergetool ของคุณ


255

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

มีโปรแกรมที่แตกต่างกันมากมายที่สามารถใช้เป็น git difftool และ mergetool ของคุณได้และแน่นอนว่าไม่มีมติใดที่ดีที่สุด (ความคิดเห็นข้อกำหนดและระบบปฏิบัติการจะแตกต่างกันอย่างชัดเจน)

Meld เป็นตัวเลือกฟรียอดนิยมโอเพนซอร์ซและข้ามแพลตฟอร์ม (UNIX / Linux, OSX, Windows) ดังที่แสดงในคำถามStackOverflow เครื่องมือผสานภาพที่ดีที่สุดสำหรับ Git คืออะไร ซึ่งคำตอบที่เสนอให้ Meld มีมากกว่า 3 เท่าของคะแนนเป็นเครื่องมืออื่น ๆ

คำถาม 2 ข้อต่อไปนี้จะได้รับคำตอบในคำตอบของฉันด้านล่าง:

  • ฉันจะตั้งค่าและใช้ Meld เป็น git difftool ได้อย่างไร
  • ฉันจะตั้งค่าและใช้ Meld เป็น git mergetool ของฉันได้อย่างไร

หมายเหตุ: ไม่จำเป็นต้องใช้โปรแกรมเดียวกันกับทั้ง difftool และ mergetool ของคุณโปรแกรมต่าง ๆ สามารถตั้งค่าได้ทั้งสองอย่าง


1
โพสต์ที่เกี่ยวข้อง - วิธีการกำหนดค่าเครื่องมือต่างใน Git ทั่วไป
RBT

คำตอบ:


423

ฉันจะตั้งค่าและใช้ Meld เป็น git difftool ได้อย่างไร

git difftoolแสดง diff โดยใช้โปรแกรม GUI diff (เช่น Meld) แทนการแสดงเอาต์พุต diff ในเทอร์มินัลของคุณ

แม้ว่าคุณสามารถตั้งค่าโปรแกรม GUI บนบรรทัดคำสั่งโดยใช้-t <tool> / --tool=<tool>มันเหมาะสมกว่าในการกำหนดค่าใน.gitconfigไฟล์ของคุณ [หมายเหตุ: ดูส่วนต่างๆเกี่ยวกับการหลีกเลี่ยงคำพูดและเส้นทาง Windows ที่ด้านล่าง]

# Add the following to your .gitconfig file.
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"

[หมายเหตุ: การตั้งค่าเหล่านี้จะไม่เปลี่ยนแปลงพฤติกรรมgit diffที่จะทำงานต่อไปตามปกติ]

คุณสามารถใช้ในตรงทางเดียวกับที่คุณใช้git difftool git diffเช่น

git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name

หากกำหนดค่าไว้อย่างถูกต้องหน้าต่าง Meld จะเปิดขึ้นเพื่อแสดงส่วนต่างโดยใช้ส่วนต่อประสาน GUI

ลำดับของบานหน้าต่างหน้าต่าง Meld GUI สามารถควบคุมได้ด้วยลำดับ$LOCALและ$REMOTEในcmdกล่าวคือไฟล์ใดที่แสดงในบานหน้าต่างด้านซ้ายและในบานหน้าต่างด้านขวา หากคุณต้องการให้มันเป็นอย่างอื่นเพียงแค่สลับมันแบบนี้:

    cmd = meld "$REMOTE" "$LOCAL"

ในที่สุดprompt = falseบรรทัดก็หยุดคอมไพล์ไม่ให้คุณเป็นว่าคุณต้องการเปิด Meld หรือไม่โดยค่าเริ่มต้น git จะออกพรอมต์


ฉันจะตั้งค่าและใช้ Meld เป็น git mergetool ของฉันได้อย่างไร

git mergetoolช่วยให้คุณใช้โปรแกรม GUI ผสาน (เช่น Meld) เพื่อแก้ไขข้อขัดแย้งการผสานที่เกิดขึ้นระหว่างการรวม

เช่น difftool คุณสามารถตั้งค่าโปรแกรม GUI บนบรรทัดคำสั่งโดยใช้-t <tool> / --tool=<tool>แต่ก่อนหน้านี้มันเหมาะสมกว่าที่จะกำหนดค่าใน.gitconfigไฟล์ของคุณ [หมายเหตุ: ดูส่วนที่เกี่ยวกับการหลีกเลี่ยงคำพูดและเส้นทางของ Windows ที่ด้านล่าง]

# Add the following to your .gitconfig file.
[merge]
    tool = meld
[mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

คุณไม่ได้ใช้git mergetoolเพื่อทำการผสานจริง ก่อนที่จะใช้งานgit mergetoolคุณจะทำการผสานตามปกติด้วย git เช่น

git checkout master
git merge branch_name

หากมีข้อผิดพลาดการรวมคอมไพล์จะแสดงดังนี้:

$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.

ณ จุดนี้file_nameจะมีไฟล์ที่ผสานบางส่วนกับข้อมูลความขัดแย้งในการผสาน (นั่นคือไฟล์ที่มี>>>>>>>และ<<<<<<<รายการทั้งหมดในนั้น)

ขณะนี้ Mergetool สามารถใช้เพื่อแก้ไขข้อขัดแย้งในการผสาน คุณเริ่มต้นได้ง่ายๆด้วย:

git mergetool

หากกำหนดค่าไว้อย่างถูกต้องหน้าต่าง Meld จะเปิดขึ้นโดยแสดงไฟล์ 3 ไฟล์ แต่ละไฟล์จะอยู่ในบานหน้าต่างแยกต่างหากของส่วนต่อประสาน GUI

ใน.gitconfigรายการตัวอย่างด้านบนแนะนำ 2 บรรทัดเป็น[mergetool "meld"] cmdบรรทัด ในความเป็นจริงมีวิธีการทุกชนิดสำหรับผู้ใช้ขั้นสูงในการกำหนดค่าcmdบรรทัด แต่มันอยู่นอกเหนือขอบเขตของคำตอบนี้

คำตอบนี้มี 2 cmdบรรทัดทางเลือกซึ่งจะรองรับผู้ใช้ส่วนใหญ่และเป็นจุดเริ่มต้นที่ดีสำหรับผู้ใช้ขั้นสูงที่ต้องการนำเครื่องมือไปสู่ความซับซ้อนในระดับต่อไป

ประการแรกนี่คือความหมายของพารามิเตอร์:

  • $LOCAL เป็นไฟล์ในสาขาปัจจุบัน (เช่นมาสเตอร์)
  • $REMOTE เป็นไฟล์ในสาขาที่กำลังผสาน (เช่น branch_name)
  • $MERGED เป็นไฟล์ที่ถูกผสานบางส่วนด้วยข้อมูลความขัดแย้งในการผสาน
  • $BASEเป็นบรรพบุรุษของการแบ่งปันที่ใช้ร่วมกัน$LOCALและ$REMOTEนี่คือการพูดไฟล์เหมือนเดิมเมื่อสาขาที่มี$REMOTEการสร้างขึ้นมา แต่เดิม

ฉันขอแนะนำให้คุณใช้อย่างใดอย่างหนึ่ง:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"

หรือ:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
    # See 'Note On Output File' which explains --output "$MERGED".

ทางเลือกว่าจะใช้$MERGEDหรือ$BASEในระหว่างและ$LOCAL$REMOTE

Melde จะแสดงทั้ง 3 บานด้วย$LOCALและ$REMOTEในบานหน้าต่างซ้ายและขวาและทั้งสอง$MERGEDหรือ$BASEในบานหน้าต่างกลาง

ในทั้งสองกรณีบานหน้าต่างตรงกลางเป็นไฟล์ที่คุณควรแก้ไขเพื่อแก้ไขข้อขัดแย้งในการรวม ความแตกต่างคือตำแหน่งที่คุณต้องการเริ่มแก้ไข $MERGEDสำหรับไฟล์ที่มีไฟล์ที่ผสานบางส่วนที่มีข้อมูลการผสานความขัดแย้งหรือ$BASEสำหรับใช้ร่วมกันกระทำบรรพบุรุษของและ$LOCAL $REMOTE[เนื่องจากทั้งสองcmdบรรทัดมีประโยชน์ฉันจึงเก็บทั้งสองไว้ใน.gitconfigไฟล์ของฉัน เวลาส่วนใหญ่ที่ฉันใช้$MERGEDบรรทัดและ$BASEบรรทัดถูกคอมเม้นต์ แต่สามารถสลับการคอมเม้นต์ได้ถ้าฉันต้องการใช้$BASEบรรทัดแทน]

หมายเหตุเกี่ยวกับไฟล์ที่ส่งออก: ไม่ต้องกังวลว่า--output "$MERGED"จะใช้ในการcmdคำนึงถึง$MERGEDหรือไม่ว่าจะ$BASEใช้ก่อนหน้านี้ในcmdบรรทัด --outputตัวเลือกเพียงแค่บอก Meld สิ่งที่คอมไพล์ชื่อไฟล์ที่ต้องการไฟล์แก้ปัญหาความขัดแย้งที่จะถูกบันทึกไว้ใน. Meld จะช่วยแก้ไขความขัดแย้งของคุณในแฟ้มที่ไม่คำนึงถึงว่าคุณจะใช้$MERGEDหรือ$BASEเป็นจุดเริ่มต้นการแก้ไขของคุณ

หลังจากแก้ไขบานหน้าต่างกลางเพื่อแก้ไขข้อขัดแย้งในการผสานเพียงบันทึกไฟล์และปิดหน้าต่าง Meld Git จะทำการอัปเดตโดยอัตโนมัติและไฟล์ในสาขาปัจจุบัน (เช่นมาสเตอร์) จะมีทุกอย่างที่คุณอยู่ในบานหน้าต่างตรงกลาง

git จะทำการสำรองข้อมูลของไฟล์ที่ถูกผสานบางส่วนพร้อมกับข้อมูลความขัดแย้งในไฟล์โดยผนวก.origเข้ากับชื่อไฟล์เดิม file_name.origเช่น หลังจากตรวจสอบว่าคุณมีความสุขกับการผสานและดำเนินการทดสอบใด ๆ ที่คุณอาจต้องการทำ.origไฟล์สามารถลบได้

ณ จุดนี้คุณสามารถทำการคอมมิทเพื่อทำการเปลี่ยนแปลงได้

หากในขณะที่คุณกำลังแก้ไขข้อขัดแย้งการผสานใน Meld คุณต้องการละทิ้งการใช้ Meld จากนั้นออกจาก Meld โดยไม่บันทึกไฟล์การแก้ไขผสานในบานหน้าต่างตรงกลาง คอมไพล์จะตอบกลับด้วยข้อความfile_name seems unchangedแล้วถามWas the merge successful? [y/n]ถ้าคุณตอบnแล้วการแก้ไขความขัดแย้งผสานจะถูกยกเลิกและไฟล์จะยังคงไม่เปลี่ยนแปลง โปรดทราบว่าหากคุณบันทึกไฟล์ใน Meld ณ จุดใดก็ตามคุณจะไม่ได้รับคำเตือนและพรอมต์จากคอมไพล์ [แน่นอนคุณสามารถลบไฟล์และแทนที่ด้วย.origไฟล์สำรองข้อมูลที่คอมไพล์สร้างขึ้นสำหรับคุณ]

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

มันจะเหมาะสมที่จะสร้างโครงการหุ่นเพื่อทดสอบการใช้งานgit mergetoolก่อนที่จะใช้ในการถ่ายทอดสดโครงการ อย่าลืมใช้ชื่อไฟล์ที่มีช่องว่างในการทดสอบของคุณในกรณีที่ระบบปฏิบัติการของคุณต้องการให้คุณหลีกเลี่ยงคำพูดในcmdบรรทัดดูด้านล่าง


การหลีกเลี่ยงอักขระคำพูด

ระบบปฏิบัติการบางระบบอาจจำเป็นต้องมีคำพูดในการcmdหลบหนี ผู้ใช้ที่มีประสบการณ์น้อยควรจำไว้ว่าบรรทัดคำสั่ง config ควรทดสอบด้วยชื่อไฟล์ที่มีช่องว่างและหากcmdบรรทัดไม่ทำงานกับชื่อไฟล์ที่มีช่องว่างให้ลองหลีกเลี่ยงคำพูด เช่น

cmd = meld \"$LOCAL\" \"$REMOTE\"

ในบางกรณีอาจจำเป็นต้องใช้การหลีกเลี่ยงการอ้างที่ซับซ้อนมากขึ้น ลิงค์เส้นทางที่ 1 ของ Windows ด้านล่างมีตัวอย่างของการอ้างอิงสามครั้งในแต่ละครั้ง มันน่าเบื่อ แต่บางครั้งก็จำเป็น เช่น

cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"

เส้นทาง Windows

ผู้ใช้ Windows อาจต้องเพิ่มการกำหนดค่าเพิ่มเติมในcmdบรรทัดMeld พวกเขาอาจจำเป็นต้องใช้เส้นทางแบบเต็มmeldcซึ่งได้รับการออกแบบให้เรียกบน Windows จากบรรทัดคำสั่งหรืออาจต้องการหรือต้องการใช้ wrapper พวกเขาควรอ่านหน้าStackOverflow ที่ลิงค์ด้านล่างซึ่งเกี่ยวกับการตั้งค่าcmdบรรทัดMeld ที่ถูกต้องสำหรับ Windows ตั้งแต่ฉันเป็นผู้ใช้ลินุกซ์ผมไม่สามารถที่จะทดสอบต่างๆของ Windows cmdเส้นและไม่มีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องอื่นมากกว่าที่จะแนะนำให้ใช้ตัวอย่างของฉันด้วยนอกเหนือจากเส้นทางแบบเต็มไป Meld หรือที่meldcหรือเพิ่มโฟลเดอร์โปรแกรม Meld pathที่คุณ

ละเว้นช่องว่างต่อท้ายด้วย Meld

Meld มีการกำหนดค่าตามความชอบจำนวนมากที่สามารถกำหนดค่าได้ใน GUI

ในText Filtersแท็บการตั้งค่ามีตัวกรองที่มีประโยชน์หลายตัวที่จะไม่สนใจสิ่งต่าง ๆ เช่นความคิดเห็นเมื่อดำเนินการ diff แม้ว่าจะมีตัวกรองที่ต้องเพิกเฉยAll whitespaceและLeading whitespaceไม่มีTrailing whitespaceตัวกรองการข้าม (นี่เป็นข้อเสนอแนะเพิ่มเติมในรายการส่งเมล Meld แต่ไม่มีในรุ่นของฉัน)

การละเว้นช่องว่างต่อท้ายมักจะมีประโยชน์มากโดยเฉพาะอย่างยิ่งเมื่อทำงานร่วมกันและสามารถเพิ่มด้วยตนเองได้อย่างง่ายดายด้วยนิพจน์ทั่วไปอย่างง่ายในText Filtersแท็บค่ากำหนดของ Meld

# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$

ฉันหวังว่านี่จะช่วยทุกคน


2
ขอขอบคุณที่ง่ายมากที่จะใช้[mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"ใน~/.gitconfigแล้วก็แก้ปัญหาความขัดแย้งที่ไฮไลต์สีแดงในกระทะกลางและประหยัด! ควรเป็นการตั้งค่าเริ่มต้น
KrisWebDev

1
$LOCAL $MERGED $REMOTEเป็นการตั้งค่าที่ฉันใช้เวลาส่วนใหญ่เมื่อมีข้อขัดแย้งเล็กน้อยเพื่อแก้ไขว่ายอดเยี่ยมและเป็นค่าเริ่มต้นของฉันเช่นกัน $LOCAL $BASE $REMOTEมาเป็นของตัวเองจริงๆเมื่อมีสิ่งที่ต้องทำมากมายและคุณรู้ว่าส่วนใดของรหัสที่มาจากไฟล์ใด บรรพบุรุษที่มีความรับผิดชอบร่วมกันนั้นอาจเป็นจุดเริ่มต้นที่ไม่เกะกะและบางครั้งความขัดแย้งที่เกิดขึ้นก็จะเกิดขึ้นและฐานที่สะอาดก็เป็นพร
mattst

4
หมายเหตุ:หากคุณอยู่บน OSX และติดตั้งรวมกันผ่าน homebrew พารามิเตอร์เอาต์พุตจะต้องมี=สิ่งนี้:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alteisen

2
สำหรับผู้ใช้ Mac ที่ติดตั้ง. dmg และพบว่า 'meld' ไม่ได้อยู่ในเส้นทางของพวกเขาโปรดทำตามคำแนะนำชุดอื่นที่นี่: yousseb.github.io/meld
KC Baltz

3
นั่นคือมากดีกว่าคำอธิบายที่Git การกำหนดค่า - mergetool ขอบคุณมากโดยเฉพาะอย่างยิ่งสำหรับการอธิบายความแตกต่างระหว่าง $ MERGED และ $ BASE ช่วยฉันไม่ให้บ้า!
ChrisG

81

ในขณะที่คำตอบอื่น ๆ นั้นถูกต้องนี่เป็นวิธีที่เร็วที่สุดในการก้าวไปข้างหน้าและกำหนดค่า Meld เป็นเครื่องมือ diff ภาพของคุณ เพียงคัดลอก / วางนี้:

git config --global diff.tool meld
git config --global difftool.prompt false

ตอนนี้ทำงานgit difftoolในไดเรกทอรีและ Meld จะเปิดตัวสำหรับแต่ละไฟล์ที่แตกต่างกัน

หมายเหตุด้าน: Meld ช้ากว่าการเปรียบเทียบไฟล์ CSV อย่างน่าประหลาดใจและไม่มีเครื่องมือ Linux diff ที่ฉันพบว่าเร็วกว่าเครื่องมือ Windows ตัวนี้ที่ชื่อว่าCompare It! (ปรับปรุงล่าสุดในปี 2010)


13
คุณอาจต้องการgit config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'บรรทัดด้วย นี่คือการ "เริ่มต้น" แต่ทันทีที่คุณกำหนดค่าmergetoolที่difftoolจะเริ่มใช้การกำหนดค่า mergetool เป็นค่าเริ่มต้นถ้าการตั้งค่าต่างไม่พบ เนื่องจากโดยทั่วไปแล้วการรวมจะได้รับการกำหนดค่าให้ส่งไฟล์สามไฟล์สำหรับการรวมแบบ 3 ทางหมายความว่าหน้าต่างmeld ต่าง ๆของคุณจะมีบานหน้าต่างสามบานที่ไม่เหมาะสม
BeeOnRope

ทำไมไม่ตรวจสอบการกำหนดค่าหลังจากตั้งค่าด้วย $ git config -l
agfe2

56

สำหรับ Windows เรียกใช้คำสั่งเหล่านี้ใน Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global mergetool.prompt false

(อัปเดตพา ธ ไฟล์สำหรับ Meld.exe หากคุณแตกต่าง)

สำหรับลินุกซ์ เรียกใช้คำสั่งเหล่านี้ใน Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

คุณสามารถตรวจสอบเส้นทางของ Meld ได้โดยใช้คำสั่งนี้:

which meld

1
ฉันพบข้อผิดพลาดเมื่อฉันรัน gft difftool "เครื่องมือ diff รวมไม่สามารถใช้งานได้ใน 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork

@AllenVork: คุณยืนยันว่า Meld.exe อยู่ในโฟลเดอร์ที่คุณระบุหรือไม่? คุณสามารถใช้งานนอก Git ได้หรือไม่? อะไรกลับมา Git เมื่อคุณเรียกใช้git config --global --get-regex diff*?
MarredCheese

ฉันแก้ไขมันแล้ว ฉันเปลี่ยนเป็น "D: /software/melddiff/Meld.exe" และใช้งานได้รูปแบบของ. gitconfig เป็น ubuntu ไม่ใช่ windows
Allen Vork

ไม่ควรที่มันได้รับ: git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"?
Jonathan Rosenne

@AllenVork คุณใช้คอมไพล์กับ cygwin หรือไม่?
เอเดรียน

25

ฉันชอบที่จะตั้งค่า meld เป็นคำสั่งแยกต่างหากเช่น:

git config --global alias.meld '!git difftool -t meld --dir-diff'

สิ่งนี้ทำให้คล้ายกับสคริปต์ git-meld.pl ที่นี่: https://github.com/wmanley/git-meld

จากนั้นคุณสามารถเรียกใช้

git meld

ฉันเพิ่งได้ทำงานร่วมกับ Cygwin และตอนนี้มันก็พัง มันคงที่ ขอบคุณ! (แม้ว่าฉันจะลบ--dir-diffส่วนที่เป็นความชอบส่วนตัว)
PfunnyGuy

3

สำหรับ Windows 10 ฉันต้องใส่มันใน. gitconfig ของฉัน:

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

ทุกสิ่งทุกอย่างที่คุณจำเป็นต้องรู้ถูกเขียนในคำตอบที่ยอดเยี่ยมนี้โดย mattst เพิ่มเติมข้างต้น

PS: ด้วยเหตุผลบางอย่างการทำงานกับ Meld 3.18.x เท่านั้น Meld 3.20.x ทำให้ฉันมีข้อผิดพลาด


1

นี่คือคำตอบที่มีเป้าหมายเพื่อให้นักพัฒนาส่วนใหญ่ใช้ Windows เพราะไวยากรณ์เส้นทางของเครื่องมือ diff แตกต่างจากแพลตฟอร์มอื่น

ฉันใช้ Kdiff3 เป็น git mergetool แต่เมื่อต้องการตั้งค่า gft difftool เป็น Meld ฉันได้ติดตั้ง Meld รุ่นล่าสุดจากMeldmerge.org แล้วเพิ่มต่อไปนี้ใน. gitconfig ทั่วโลกของฉันโดยใช้:

git config --global -e

หมายเหตุหากคุณต้องการ Sublime Text 3 แทน Vim เริ่มต้นเป็น core ditor คุณสามารถเพิ่มสิ่งนี้ลงในไฟล์. gitconfig:

[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'

จากนั้นคุณเพิ่ม Inn Meld เป็น difftool

[diff]
tool = meld
guitool = meld 

[difftool "meld"]
cmd = \"C:/Program Files (x86)/Meld/Meld.exe\" \"$LOCAL\" \"$REMOTE\" --label \"DIFF 
(ORIGINAL MY)\"
prompt = false
path = C:\\Program Files (x86)\\Meld\\Meld.exe

หมายเหตุเครื่องหมายสแลชใน cmd ด้านบนบน Windows จำเป็นต้องใช้

นอกจากนี้ยังเป็นไปได้ที่จะตั้งค่านามแฝงเพื่อแสดงคอมไพล์ปัจจุบันด้วย ตัวเลือก--dir-diff นี่จะแสดงรายการไฟล์ที่เปลี่ยนแปลงภายใน Meld ซึ่งมีประโยชน์เมื่อคุณแก้ไขไฟล์หลายไฟล์ (เป็นสถานการณ์ที่พบบ่อยมาก)

นามแฝงมีลักษณะดังนี้ภายในไฟล์. gitconfig ใต้ส่วน[alias] :

showchanges = difftool --dir-diff

เพื่อแสดงการเปลี่ยนแปลงที่ฉันทำกับรหัสฉันเพียงแค่ป้อนคำสั่งต่อไปนี้:

git showchanges

ภาพต่อไปนี้แสดงให้เห็นว่าตัวเลือก --dir-diff สามารถแสดงรายการไฟล์ที่เปลี่ยนแปลง (ตัวอย่าง): แสดงรายการของไฟล์พร้อมการเปลี่ยนแปลงระหว่าง $ LOCAL และ $ REMOTE

จากนั้นเป็นไปได้ที่จะคลิกที่แต่ละไฟล์และแสดงการเปลี่ยนแปลงภายใน Meld


0

มันอาจมีความซับซ้อนในการคำนวณส่วนต่างในหัวของคุณจากส่วนต่าง ๆ ใน $ MERGED และนำไปใช้ ในการตั้งค่าของฉัน meld ช่วยด้วยการแสดงให้คุณเห็นความแตกต่างเหล่านี้โดยใช้:

[merge]
    tool = mymeld
    conflictstyle = diff3

[mergetool "mymeld"]
    cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED

มันดูแปลก แต่มีขั้นตอนการทำงานที่สะดวกมากโดยใช้สามแท็บ:

  1. ในแท็บ 1 คุณเห็น (จากซ้ายไปขวา) การเปลี่ยนแปลงที่คุณควรทำในแท็บ 2 เพื่อแก้ไขข้อขัดแย้งที่ผสาน

  2. ในด้านขวาของแท็บ 2 คุณใช้ "การเปลี่ยนแปลงที่คุณควรทำ" และคัดลอกเนื้อหาไฟล์ทั้งหมดไปยังคลิปบอร์ด (ใช้ ctrl-a และ ctrl-c)

  3. ในแท็บ 3 แทนที่ด้านขวาด้วยเนื้อหาของคลิปบอร์ด หากทุกอย่างถูกต้องตอนนี้คุณจะเห็น - จากซ้ายไปขวา - การเปลี่ยนแปลงเดียวกับที่แสดงในแท็บ 1 (แต่มีบริบทแตกต่างกัน) บันทึกการเปลี่ยนแปลงที่ทำในแท็บนี้

หมายเหตุ:

  • อย่าแก้ไขอะไรในแท็บ 1
  • อย่าบันทึกสิ่งใดในแท็บ 2 เนื่องจากจะทำให้ป๊อปอัปน่ารำคาญในแท็บ 3

นี่เป็นสิ่งที่ดีกว่าการรวม 3-way (local / base / remote) ในแท็บเดียวหรือไม่?
André Werlang

@ AndréWerlangข้อดีของการผสาน 3 ทิศทางในแท็บเดียวก็คือคุณจะต้องจัดการกับการเปลี่ยนแปลงที่ขัดแย้งกันเท่านั้น (การเปลี่ยนแปลงอื่น ๆ จะถูกผสานโดยอัตโนมัติ) แต่ฉันชอบวิธีการ "ของฉัน" ในกรณีที่มันยากที่จะเข้าใจในการรวม 3-way สิ่งที่เปลี่ยนแปลงและวิธีการรวมในวิธีที่รักษาการเปลี่ยนแปลงทั้งหมด หากในบางจุดการผสาน 3 ทางไม่ทำให้ฉันสับสนอีกต่อไปฉันอาจเปลี่ยนกลับไปเป็นแบบเดิมได้
mnieber

ในฐานะผู้ใช้ด้านที่ชัดเจนคุณสามารถใช้$BASEแทน$MERGEDเพื่อเริ่มการดำเนินการผสาน
André Werlang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.