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