การดู `git ต่างกัน 'กับ vimdiff


209

ฉันตั้งค่าgit diffให้ห่อเป็น vimdiff โดยใช้ " Git Diff with Vimdiff " เป็นแนวทางและทำงานได้ตามที่คาดไว้เว้นแต่จะมีไฟล์จำนวนมากที่มีการเปลี่ยนแปลง

เมื่อมีหลายไฟล์ที่มีการเปลี่ยนแปลงและฉันเรียกใช้git diffมันจะเปิดไฟล์แรกและหลังจากออกจากอินสแตนซ์แรกของ vimdiff ฉันก็มีข้อความต่อไปนี้:

external diff died, stopping at filename

นี่เป็นพฤติกรรมที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ฉันมีการตั้งค่าที่คล้ายกันในอดีตกับ SVN และเมื่อแตกต่างกับไฟล์หลายไฟล์ฉันจะตรวจสอบไฟล์แรกจากนั้นเขียนและออกโดยใช้:wqและไฟล์ถัดไปที่มีความแตกต่างจะเปิดขึ้น

นี่ไม่ใช่กรณีของ Git ฉันพยายาม:n[ext]แล้ว แต่การทำเช่นนั้นไม่ได้เติมไฟล์ต้นฉบับลงในหน้าต่างด้านซ้ายเพื่อให้สามารถแตกต่างกับเวอร์ชันที่แก้ไข

คำตอบ:


337
git config --global diff.tool vimdiff
git config --global difftool.prompt false
git config --global alias.d difftool

การพิมพ์git dจะทำให้เกิดพฤติกรรมที่คาดหวังโดยพิมพ์:wqเป็นกลุ่มไปยังไฟล์ถัดไปในเซ็ตการแก้ไข


22
เพียงสองเซ็นต์ของฉัน: ฉันได้dfนามแฝงdiffและนามแฝงdt difftoolนอกจากนี้การพิมพ์:qaในกลุ่มจะวนไปที่เซ็ตการแก้ไขถัดไปโดยไม่บันทึกอะไรเลย
JC Yamokoski

2
วิธีนี้ดีมากยกเว้นเมื่อบันทึกการเปลี่ยนแปลงคุณต้องพิมพ์ ": w!" แทน: w
Asenar

2
@jonyamo การตั้งค่านามแฝงควรขึ้นอยู่กับความถี่ที่เราใช้คำสั่งบางอย่าง ฉันกำลังมักจะใช้มากกว่าgit diff git difftoolดังนั้นฉันจึงใช้นามแฝงdเป็น 'diff' และ'dt' to difftool ' การใช้งานมีความสำคัญมากกว่าการสร้างสมนามด้วยรูปแบบ
Habeeb Perwad

วิธีทำให้ "git diff" ใช้ vimdiff? คำตอบนี้ทำให้ฉันใช้นามแฝง หากฉันนามแฝงว่า "ต่าง" ไม่ทำงาน
Rombus

6
@Asenar "วิธีนี้ดีมากยกเว้นเมื่อบันทึกการเปลี่ยนแปลงคุณต้องพิมพ์:w!แทน:w" นั่นเป็นเพราะการเรียกคอมไพล์vimdiffด้วย-Rตัวเลือก git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"'คุณสามารถแทนที่มันด้วย ที่จะเปิด vimdiff ในโหมดที่เขียนได้
wisbucky

103

คุณสามารถลองgit difftoolมันถูกออกแบบมาเพื่อทำสิ่งนี้

ก่อนอื่นคุณต้องกำหนดค่าเครื่องมือ diff ให้ vimdiff

git config diff.tool vimdiff

จากนั้นเมื่อคุณต้องการที่จะแตกต่างเพียงแค่ใช้แทนgit difftool git diffมันจะทำงานได้ตามที่คุณคาดหวัง


1
เกือบจะมี! ปรับเปลี่ยนเล็กน้อยมันเป็นสิ่งที่ฉันกำลังมองหา +1 แม้ว่า!
chuckg

1
vimdiff mergetool เพิ่งได้รับการอัปเดต: git.kernel.org/?p=git/… (และอีกสองสามคอมมิท ไม่แน่ใจว่าจะเปิดตัวการบำรุงรักษาครั้งต่อไปเมื่อใด แต่ถ้าคุณยินดีที่จะสร้างจาก git.git การอัพเกรดจะเป็นของคุณ!
Cascabel

21
Git accepts kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge,
and opendiff as valid diff tools. You can also set up a custom tool. 

git config --global diff.tool vimdiff
git config --global diff.tool kdiff3
git config --global diff.tool meld
git config --global diff.tool xxdiff
git config --global diff.tool emerge
git config --global diff.tool gvimdiff
git config --global diff.tool ecmerge

3
คุณตอบสำหรับ mergetool ไม่ใช่ difftool แต่มันก็ยังเป็นคำตอบที่เป็นประโยชน์ +1
dotancohen

@dotancohen จริงๆขอบคุณฉันไม่เคยสังเกตเห็นว่าผิดพลาดโง่ตอนนี้ฉันสามารถแก้ไขคำตอบของฉัน
Nanhe Kumar

1
@NanheKumar, @dotancohen แทนที่mergeด้วยdiffในคำตอบข้างต้นจะทำเคล็ดลับคือ git config --global diff.tool vimdiff
จะ

2

nvimสำหรับผู้ที่ต้องการที่จะใช้เครื่องมือต่างอีกไม่ได้ระบุไว้ในคอมไพล์พูดด้วย นี่คือสิ่งที่ฉันใช้:

git config --global alias.d difftool -x <tool name>

ในกรณีของฉันฉันจะตั้งค่า<tool name>การnvim -dและเรียกคำสั่งต่างกับ

git d <file>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.