ฉันจะตั้งค่าและใช้ 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]*$
ฉันหวังว่านี่จะช่วยทุกคน