ฉันจะดูเอาต์พุต 'git diff' ด้วยเครื่องมือ / โปรแกรมดูไฟล์ diff ที่ต้องการได้อย่างไร


754

เมื่อฉันพิมพ์git diffฉันต้องการดูผลลัพธ์ด้วยเครื่องมือกระจายภาพที่ฉันเลือก (SourceGear "diffmerge" บน Windows) ฉันจะกำหนดค่า git ให้ทำเช่นนี้ได้อย่างไร


108
คุณสามารถใช้ "git difftool" แทน "git diff" ใน git รุ่นใหม่ทั้งหมด ที่จะเปิดโปรแกรม diff ภาพ
PlagueHammer

เกี่ยวกับสคริปต์ใหม่ difftool ฉันได้เพิ่มคำตอบด้านล่าง: stackoverflow.com/questions/255202/…
VonC

2
gitx - gitx.frim.nl Nuff กล่าวว่า.
Alex Grande


5
ไปที่พื้นที่เก็บข้อมูลของคุณใน Git Bash ประเภทgit config diff.tool winmerge. git difftoolตรวจสอบการทำงานโดยการพิมพ์ กำจัดการพิมพ์ที่git config --global difftool.prompt falseรวดเร็ว ฉันแนะนำ p4merge แทน winmerge
Michael S.

คำตอบ:


386

ตั้งแต่ Git1.6.3 คุณสามารถใช้สคริปต์ difftool คอมไพล์ : ดูคำตอบของฉันด้านล่าง


อาจเป็นบทความนี้จะช่วยคุณ นี่คือส่วนที่ดีที่สุด:

มีสองวิธีที่แตกต่างกันในการระบุเครื่องมือ diff ภายนอก

วิธีแรกคือวิธีที่คุณใช้โดยตั้งค่าตัวแปร GIT_EXTERNAL_DIFF อย่างไรก็ตามตัวแปรควรจะชี้ไปที่เส้นทางแบบเต็มของปฏิบัติการ ยิ่งกว่านั้นไฟล์เรียกทำงานที่ระบุโดย GIT_EXTERNAL_DIFF จะถูกเรียกด้วยชุดอาร์กิวเมนต์ 7 ตัวที่แก้ไขแล้ว:

path old-file old-hex old-mode new-file new-hex new-mode

เนื่องจากเครื่องมือต่าง ๆ ส่วนใหญ่จะต้องการลำดับของอาร์กิวเมนต์ที่แตกต่างกัน (และมีเพียงบางส่วน) คุณมักจะต้องระบุสคริปต์ตัวตัดคำแทนซึ่งจะเรียกเครื่องมือ diff จริง

วิธีที่สองที่ผมต้องการคือการกำหนดค่าเครื่องมือ diff ภายนอกผ่านทาง "คอมไพล์ตั้งค่า" นี่คือสิ่งที่ฉันทำ:

1) สร้างสคริปต์ตัวตัด "git-diff-wrapper.sh" ซึ่งมีบางสิ่งบางอย่างเช่น

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

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

2) ประเภท

$ git config --global diff.external <path_to_wrapper_script>

ที่พรอมต์คำสั่งแทนที่ด้วยพา ธ ไปที่ "git-diff-wrapper.sh" ดังนั้น ~ / .gitconfig ของคุณจะมี

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

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

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

ใน. gitconfig และ

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

ในสคริปต์ตัวตัด ระวัง "แมว" ต่อท้าย!

(ฉันสมมติว่า ' | cat' จำเป็นสำหรับบางโปรแกรมเท่านั้นซึ่งอาจไม่ส่งคืนสถานะการส่งคืนที่เหมาะสมหรือสอดคล้องกันคุณอาจต้องการลองโดยไม่ต้องใช้แมวท้ายหากเครื่องมือ diff ของคุณมีสถานะส่งคืนอย่างชัดเจน)

( Diomidis Spinellisเพิ่มในความคิดเห็น :

catคำสั่งเป็นสิ่งจำเป็นเพราะdiff(1)โดยออกค่าเริ่มต้นที่มีรหัสข้อผิดพลาดถ้าไฟล์ที่แตกต่างกัน
Git คาดว่าโปรแกรม diff ภายนอกจะออกด้วยรหัสข้อผิดพลาดเฉพาะเมื่อเกิดข้อผิดพลาดจริงเช่นถ้าหน่วยความจำไม่เพียงพอ
โดยท่อส่งออกของgitไปยังcatรหัสข้อผิดพลาดที่ไม่ใช่ศูนย์จะสวมหน้ากาก
มีประสิทธิภาพมากขึ้นโปรแกรมสามารถทำงานexitด้วยและอาร์กิวเมนต์ของ 0)


นั่น (บทความที่ยกมาข้างต้น) เป็นทฤษฎีสำหรับเครื่องมือภายนอกที่กำหนดผ่านไฟล์กำหนดค่า (ไม่ผ่านตัวแปรสภาพแวดล้อม)
ในทางปฏิบัติ (ยังคงใช้สำหรับการกำหนดไฟล์กำหนดค่าของเครื่องมือภายนอก) คุณสามารถอ้างถึง:


1
อ่าฉันได้ตั้งโปรแกรม diff ภายนอก แต่ไม่รู้เกี่ยวกับ 7 ข้อโต้แย้งขอบคุณ
3891

4
รุ่งโรจน์ ... มันมีประโยชน์มาก ฉันตั้งค่านี้ด้วย "opendiff" (ซึ่งเรียกใช้ยูทิลิตี้ XCode FileMerge ที่ลื่นไหลภายใต้ Mac OS X)
Ryan Delucchi

@ Ryan: มันเยี่ยมมาก :) คุณใช้การตั้งค่า "diff.external" ที่มีรายละเอียดในคำตอบนี้หรือ "git difftool" ของคำตอบที่สองของฉันด้านล่างหรือไม่?
VonC

Fantastic! ขอบคุณลองทั้ง DiffMerge และ opendiff ทำงานได้ค่อนข้างดี
vfilby

2
ดังนั้น git จึงส่ง 7 ข้อโต้แย้งไปยังโปรแกรม diff? ยิ่งฉันเรียนรู้เกี่ยวกับ Git มากเท่าไหร่ฉันก็ยิ่งรู้สึกว่ามันถูกสร้างขึ้นมาสำหรับหนึ่งคน: โปรแกรมเมอร์คนแรก dvcs นี้ดูเหมือนของเล่นที่เป็นประกายที่ไม่ทำอะไรมาก
C Johnson

211

เพื่อให้คำตอบการตั้งค่า "diff.external"ก่อนหน้าของฉันเสร็จสมบูรณ์ด้านบน:

ในฐานะที่เป็นที่กล่าวถึงโดย Jakub , Git1.6.3 แนะนำคอมไพล์difftoolเสนอเดิมในเดือนกันยายน 2008:

USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(ดู--extcmdในส่วนสุดท้ายของคำตอบนี้)

$LOCALมีเนื้อหาของไฟล์จากการแก้ไขเริ่มต้นและ$REMOTEมีเนื้อหาของไฟล์ในการแก้ไขสิ้นสุด
$BASEมีเนื้อหาของไฟล์ในว

มันgit-mergetoolถูกดัดแปลงโดยทั่วไปเพื่อทำงานกับดัชนี git / worktree

กรณีการใช้งานปกติสำหรับสคริปต์นี้คือเมื่อคุณมีการจัดฉากหรือเปลี่ยนแปลง unstaged และคุณต้องการที่จะเห็นการเปลี่ยนแปลงในมุมมองที่แตกต่างด้านข้าง (เช่นxxdiff, tkdiffฯลฯ )

git difftool [<filename>*]

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

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

กรณีใช้งานล่าสุดคือเมื่อคุณต้องการเปรียบเทียบ worktree ปัจจุบันของคุณกับสิ่งอื่นที่ไม่ใช่ HEAD (เช่นแท็ก)

git difftool --commit=v1.0.0 [-- <filename>*]

หมายเหตุ: ตั้งแต่ Git 2.5 git config diff.tool winmergeก็พอแล้ว!
ดูที่ " git mergetool winmerge "

และเนื่องจาก Git 1.7.11คุณมีตัวเลือก--dir-diffเพื่อวางไข่เครื่องมือ diff ภายนอกที่สามารถเปรียบเทียบลำดับชั้นไดเรกทอรีสองครั้งในเวลาหนึ่งหลังจากที่เติมไดเรกทอรีชั่วคราวสองไดเรกทอรีแทนที่จะเรียกใช้อินสแตนซ์ของเครื่องมือภายนอกหนึ่งครั้งต่อคู่ไฟล์


ก่อนที่ Git 2.5:

กรณีปฏิบัติสำหรับการกำหนดค่าdifftoolด้วยเครื่องมือ diff ที่กำหนดเองของคุณ:

C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false

ด้วย winmerge.sh เก็บไว้ในส่วนไดเรกทอรีของ PATH ของคุณ:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

หากคุณมีเครื่องมืออื่น (kdiff3, P4Diff, ... ) ให้สร้างเชลล์สคริปต์อื่นและกำหนดค่าdifftool.myDiffTool.cmdคำสั่งที่เหมาะสม
จากนั้นคุณสามารถสลับเครื่องมือด้วยการdiff.toolกำหนดค่า

คุณมีรายการบล็อกนี้โดย Daveเพื่อเพิ่มรายละเอียดอื่น ๆ
(หรือคำถามนี้สำหรับwinmergeuตัวเลือก)

ความสนใจในการตั้งค่านี้คือwinmerge.shสคริปต์ : คุณสามารถปรับแต่งให้คำนึงถึงกรณีพิเศษ

ดูตัวอย่างคำตอบของDavid Marble ด้านล่างเพื่อดูตัวอย่างที่เกี่ยวข้องกับ:

  • ไฟล์ใหม่ในแหล่งกำเนิดหรือปลายทาง
  • ลบไฟล์ในแหล่งกำเนิดหรือปลายทาง

ในขณะที่Kem Masonกล่าวถึงคำตอบของเขาคุณสามารถหลีกเลี่ยงกระดาษห่อโดยใช้--extcmdตัวเลือก :

--extcmd=<command>

ระบุคำสั่งที่กำหนดเองสำหรับการดูต่าง git-difftoolละเว้นค่าดีฟอลต์ที่กำหนดค่าไว้และรัน$command $LOCAL $REMOTEเมื่อระบุอ็อพชันนี้

ตัวอย่างเช่นนี้เป็นวิธีที่gitkสามารถทำงาน / ใช้diffเครื่องมือ


11
ฉันต้องหลบหนี $ สำหรับ $ LOCAL และ $ REMOTE เพื่อป้องกันไม่ให้กลายเป็น "" และ "" ฉันจะแก้ไขเพื่อพูด git config --globla difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" LOCAL \ "\" \ REMOTE \ ""
Carlos Rendon

นอกจากนี้ยังมีความคิดเกี่ยวกับวิธีรับตัวเลือก -s (เปิดหลาย diffs ในหน้าต่าง winmerge เดียว) เพื่อทำงานในโครงการนี้
Carlos Rendon

1
@Carlos: Frank (ดูความคิดเห็นด้านบน) อยากให้คุณดูstackoverflow.com/questions/1220309/ … (สำหรับการเปิดหลาย diffs ในหน้าต่าง winmerge เดียว)
VonC

1
--start=และ--end=ตัวเลือกที่จะไม่ได้รับการยอมรับใน v1.7.11
ไมเคิล

1
@SteveChambers ใช่ฉันกล่าวว่าในstackoverflow.com/a/10879804/6309 ฉันจะแก้ไขคำตอบนี้
VonC

110

ในจิตวิญญาณของการตอบคำถามที่ค่อนข้างแตกต่างจากที่ถาม ลองวิธีนี้:

$ meld my_project_using_git

Meld เข้าใจคอมไพล์และให้การนำทางเกี่ยวกับการเปลี่ยนแปลงล่าสุด


17
เยี่ยมมากพิมพ์ได้ง่ายmeld .กว่าgit difftoolและต้องดูไฟล์ที่เปลี่ยนแปลงตามลำดับ และใกล้กับhg vdiffปลั๊กอินของ Mercurial มาก
ทอม

6
นอกจากนี้ยังmeld .ทำงานในโครงการ Mercurial และการโค่นล้มด้วยเช่นกันในกรณีที่มีใครอยากรู้อยากเห็น
ทอม

อืมเมื่อฉันทำสิ่งนี้รายการไฟล์ที่แก้ไขจะแสดงขึ้น เมื่อฉันคลิกที่หนึ่งในนั้นหรือ 'เปรียบเทียบ' มันเปิดขึ้นมาคนเดียวในแท็บแยก ฉันจะได้รับความแตกต่างได้อย่างไร
misiu_mp

@misiu_mp ฉันลองแล้วเมื่อคลิกที่ไฟล์ที่แก้ไขมันจะแสดง diff (ไฟล์เก่ารวมถึงไฟล์ที่ถูกแก้ไข)
db42

มีการเพิ่มรุ่นใดในเวอร์ชันนี้ 1.1.5มันจะไม่ปรากฏในการทำงานกับรุ่นผสม
Mark Booth

41

ด้วย git difftoolใหม่มันง่ายพอ ๆ กับการเพิ่มสิ่งนี้ลงในไฟล์. gitconfigของคุณ:

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

อีกทางเลือกหนึ่งให้เพิ่ม:

[difftool]
    prompt = false

นอกจากนี้ลองดูdiffallเป็นสคริปต์ง่ายๆที่ฉันเขียนเพื่อขยายพฤติกรรม diff ที่ผิดปกติ (IMO) เริ่มต้นของการเปิดแต่ละรายการในอนุกรม

.gitconfig ทั่วโลกบน Windows อยู่ใน %USERPROFILE%\.gitconfig


1
$ local คืออะไรและ $ remote คืออะไร
C Johnson

3
+1 สำหรับวิธีที่ไม่ต้องใช้สคริปต์ตัวตัดคำ
jhewlett

@CJohnson: พา ธ ไปยังไฟล์ต้นฉบับและพา ธ ไปยังไฟล์ที่แก้ไขตามลำดับ
jhewlett

ในกรณีที่บล็อกลิงค์เสียชีวิตนี่คือคำตอบ SO ที่เชื่อมโยง: stackoverflow.com/a/1291578/321973
Tobias Kienzler

1
@CJohnson: $ LOCAL เป็นความมุ่งมั่นล่าสุดเสมอ อย่างไรก็ตาม $ REMOTE ไม่สอดคล้องกัน เมื่อมองไปที่การเปลี่ยนแปลงใน sandbox ของท้องถิ่นก็ปัจจุบัน / ไฟล์ที่แก้ไข แต่เมื่อ diffing กระทำประวัติศาสตร์ก็เป็นผู้ปกครองกระทำ IOW สำหรับปกติจะแตกต่างจาก $ LOCAL = เก่าและ $ REMOTE = ใหม่ สำหรับประวัติ $ LOCAL = ใหม่กว่าและ $ REMOTE = เก่ากว่า
Granger

40

ตั้งแต่ git เวอร์ชั่น 1.6.3 มี " git difftool " ซึ่งคุณสามารถกำหนดค่าให้ใช้เครื่องมือดิฟดิฟที่คุณโปรดปราน ขณะนี้ได้รับการสนับสนุนนอกกล่องคือkdiff3, kompare, tkdiff, meld, xxdiff, โผล่ออกมา, vimdiff, gvimdiff, ecmerge, diffuseและopendiff ; หากเครื่องมือที่คุณต้องการใช้ไม่ได้อยู่ในรายการนี้คุณสามารถใช้difftool.<tool>.cmdตัวเลือกการกำหนดค่า '' ได้ตลอดเวลา

"git difftool" ยอมรับตัวเลือกเดียวกับ "git diff"


1
Araxis Merge ได้รับการกำหนดค่าเช่นกัน araxis.com/merge/scm_integration.html
ΩmegaMan

8
การใช้งานตัวอย่าง:git difftool -t kdiff3 HEAD
emanaton

24

ฉันมีหนึ่งนอกเหนือจากนี้ ฉันชอบที่จะใช้แอพต่าง ๆ ที่ไม่ได้รับการสนับสนุนเป็นหนึ่งในเครื่องมือเริ่มต้น (เช่นภาพลานตา) ผ่านทาง

git difftool -t

ฉันยังต้องการให้ค่าเริ่มต้นdiffเป็นเพียงบรรทัดคำสั่งปกติดังนั้นการตั้งค่าGIT_EXTERNAL_DIFFตัวแปรจึงไม่ใช่ตัวเลือก

คุณสามารถใช้diffแอปตามอำเภอใจเป็นแบบครั้งเดียวด้วยคำสั่งนี้:

git difftool --extcmd=/usr/bin/ksdiff

มันแค่ส่งไฟล์ 2 ไฟล์ไปยังคำสั่งที่คุณระบุดังนั้นคุณอาจไม่จำเป็นต้องใช้ wrapper


1
จุดดี: ไม่มีใครพูดถึง--extcmdตัวเลือกนั้น +1 ฉันได้รวมไว้ในคำตอบของฉัน
VonC

19

การสร้างคำตอบของ VonC เพื่อจัดการกับการลบและเพิ่มเติมไฟล์ให้ใช้คำสั่งและสคริปต์ต่อไปนี้:

> git config --global diff.tool winmerge
> git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\""
> git config --global difftool.prompt false

ซึ่งเหมือนกับการวางในโลกของคุณ.gitconfig:

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
    prompt = false

จากนั้นให้ใส่สิ่งต่อไปนี้winmerge.shซึ่งต้องอยู่บนเส้นทางของคุณ:

#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
    echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
    echo "added: $3"
else
    echo "changed: $3"
    "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi

นอกจากนี้ที่ยอดเยี่ยมกับwinmerge.shสคริปต์ +1 ฉันได้อัปเดตคำตอบเพื่อเชื่อมโยงกับคุณแล้ว
VonC

1
winmerge.batในข้อมูลโค้ดที่สองควรเป็นwinmerge.sh
BartoszKP

คุณสามารถทำสิ่งนี้ด้วยเครื่องมือมากมายได้หรือไม่? และเชื่อมโยงพวกเขาด้วยนามสกุลไฟล์?
yucer

12

โซลูชันสำหรับ Windows / msys git

หลังจากอ่านคำตอบแล้วฉันค้นพบวิธีที่ง่ายกว่าซึ่งเกี่ยวข้องกับการเปลี่ยนไฟล์เดียวเท่านั้น

  1. สร้างแบตช์ไฟล์เพื่อเรียกใช้โปรแกรม diff ของคุณโดยมีอาร์กิวเมนต์ 2 และ 5 ไฟล์นี้จะต้องอยู่ในเส้นทางของคุณ (หากคุณไม่ทราบว่าอยู่ที่ไหนให้ใส่ไว้ใน c: \ windows) เรียกมันว่า "gitdiff.bat" ของฉันคือ:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. ตั้งค่าตัวแปรสภาพแวดล้อมให้ชี้ไปที่ไฟล์แบตช์ของคุณ ตัวอย่างเช่นGIT_EXTERNAL_DIFF=gitdiff.bat. หรือผ่าน PowerShell git config --global diff.external gitdiff.batโดยการพิมพ์

    เป็นสิ่งสำคัญที่จะไม่ใช้เครื่องหมายคำพูดหรือระบุข้อมูลเส้นทางใด ๆ มิฉะนั้นจะไม่ทำงาน นั่นเป็นเหตุผลที่ gitdiff.bat ต้องอยู่ในเส้นทางของคุณ

ตอนนี้เมื่อคุณพิมพ์ "git diff" มันจะเรียกใช้โปรแกรมดู diff ภายนอกของคุณ


1
+1 (+10 ถ้าทำได้) นี่เป็นทางออกที่ง่ายที่สุด ฉันพยายามเป็นเวลาหลายชั่วโมงด้วยคำตอบที่ยอมรับและสุดท้ายก็เลิก (ปัญหาของฉันบางอย่างอาจเกี่ยวข้องกับการใช้ Git ผ่าน PowerShell ... ) อย่างไรก็ตามฉันใช้git config --global diff.external winmerge.cmdแทนที่จะตั้งค่าGIT_EXTERNAL_DIFFตัวแปรสภาพแวดล้อมและทำงานได้ดีเท่า ๆ กัน
Christoffer Lette

ปัญหาสองสามข้อในการแก้ไขปัญหานี้: 1. ใช้งานไม่ได้กับไฟล์ใหม่ WinMerge ขอให้ฉันใส่ไฟล์ที่สองเพื่อเปรียบเทียบ 2. หน้าต่างเพื่อเปรียบเทียบไฟล์ถัดไปจะเปิดขึ้นหลังจากคุณปิดหน้าต่าง WinMerge ปัจจุบันเท่านั้นไม่มีวิธีง่ายๆในการดูไฟล์ทั้งหมดในเวลาเดียวกัน
พระเยซู H

9

หากคุณทำสิ่งนี้ผ่าน cygwin คุณอาจต้องใช้cygpath :

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`

ด้วยเหตุผลบางอย่างการใช้ "bc3" ไม่ได้ผลสำหรับฉันอีกต่อไป แต่ถ้าฉันใช้ "เกิน" แทนมันก็ใช้ได้
idbrii

9

หลังจากดูเครื่องมือ diff ภายนอกอื่น ๆ ฉันพบว่าdiffมุมมองใน IntelliJ IDEA (และ Android Studio) เป็นเครื่องมือที่ดีที่สุดสำหรับฉัน

ขั้นตอนที่ 1 - ตั้งค่า IntelliJ IDEA ที่จะเรียกใช้จากบรรทัดคำสั่ง

หากคุณต้องการใช้ IntelliJ IDEA เป็นเครื่องมือ diff ของคุณอันดับแรกควรตั้งค่า IntelliJ IDEA ให้เรียกใช้จากบรรทัดคำสั่งโดยทำตามคำแนะนำที่นี่ :

บน macOS หรือ UNIX:

  1. ตรวจสอบให้แน่ใจว่า IntelliJ IDEA ทำงานอยู่
  2. Tools | Create Command-line Launcherบนเมนูหลักเลือก กล่องโต้ตอบสร้างสคริปต์เรียกใช้จะเปิดขึ้นพร้อมกับเส้นทางและชื่อของสคริปต์เรียกใช้ที่แนะนำ คุณสามารถยอมรับค่าเริ่มต้นหรือระบุเส้นทางของคุณเอง แจ้งให้ทราบตามที่คุณต้องการในภายหลัง นอก IntelliJ IDEA ให้เพิ่มเส้นทางและชื่อของตัวเรียกใช้งานสคริปต์ไปยังเส้นทางของคุณ

บน Windows:

  1. ระบุตำแหน่งของ IntelliJ IDEA ที่ปฏิบัติการได้ในตัวแปรสภาพแวดล้อมระบบ Path ในกรณีนี้คุณจะสามารถเรียกใช้งานคำสั่ง IntelliJ IDEA และคำสั่ง IntelliJ IDEA อื่น ๆ จากไดเรกทอรีใด ๆ

ขั้นตอนที่ 2 - กำหนดค่า git เพื่อใช้ IntelliJ IDEA เป็น difftool

ทำตามคำแนะนำในโพสต์บล็อกนี้ :

ทุบตี

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

ปลา

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

ตอนนี้เพิ่มสิ่งต่อไปนี้ในการกำหนดค่า git ของคุณ:

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

คุณสามารถลองกับgit difftoolหรือgit difftool HEAD~1


8

สิ่งนี้ใช้ได้กับฉันใน windows 7 ไม่จำเป็นต้องมีสคริปต์ sh ตัวกลาง

เนื้อหาของ. gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"

คุณมี kdiff3 ที่นิยามเป็น mergetool ของคุณหรือไม่ การแบ่งปันความคิดของ gitconfig นั้นเป็นเช่นนั้นหรือไม่?
blong

2
ขอบคุณ สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่มันใช้งานได้เมื่อฉันลบpathและเปลี่ยนcmdเป็น"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Steve Chambers

7

สรุปสั้น ๆ ของคำตอบที่ดีข้างต้น:

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

จากนั้นใช้งานโดยพิมพ์ (เลือกระบุชื่อไฟล์ด้วย):

git difftool

6

บทนำ

สำหรับการอ้างอิงฉันต้องการที่จะรวมการเปลี่ยนแปลงของฉันในคำตอบของ VonC โปรดทราบว่าฉันใช้ Git รุ่น MSys (1.6.0.2 ในขณะนี้) ที่มี PATH ที่ถูกปรับเปลี่ยนและรัน Git เองจาก Powershell (หรือ cmd.exe) ไม่ใช่ Bash shell

ฉันแนะนำคำสั่งใหม่gitdiff. การรันคำสั่งนี้เป็นการเปลี่ยนเส้นทางชั่วคราวgit diffเพื่อใช้โปรแกรม diff diff ที่คุณเลือก (ตรงข้ามกับโซลูชันของ VonC ที่ทำอย่างถาวร) สิ่งนี้ทำให้ฉันมีทั้งฟังก์ชั่น Git diff ( git diff) เริ่มต้นและฟังก์ชั่นdiff diff ( gitdiff) ทั้งสองคำสั่งใช้พารามิเตอร์เดียวกันดังนั้นตัวอย่างเช่นเมื่อต้องการเปลี่ยนแปลงการมองเห็นในไฟล์เฉพาะที่คุณสามารถพิมพ์ได้

gitdiff path/file.txt

ติดตั้ง

โปรดทราบว่า$GitInstallจะใช้เป็นตัวยึดตำแหน่งสำหรับไดเรกทอรีที่ติดตั้ง Git

  1. สร้างไฟล์ใหม่ $GitInstall\cmd\gitdiff.cmd

    @echo off
    setlocal
    for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
    if "%HOME%"=="" @set HOME=%USERPROFILE%
    set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
    set GIT_PAGER=cat
    git diff %*
    endlocal
    
  2. สร้างไฟล์ใหม่$GitInstall\bin\git-diff-visual.cmd(แทนที่[visual_diff_exe]ตัวยึดตำแหน่งด้วยพา ธ เต็มไปยังโปรแกรม diff ที่คุณต้องการ)

    @echo off
    rem diff is called by git with 7 parameters:
    rem path old-file old-hex old-mode new-file new-hex new-mode
    echo Diffing "%5"
    "[visual_diff_exe]" "%2" "%5"
    exit 0
    
  3. คุณทำเสร็จแล้ว การเรียกใช้gitdiffจากภายในที่เก็บ Git ควรเรียกใช้โปรแกรม diff ที่แสดงผลสำหรับไฟล์ทุกไฟล์ที่มีการเปลี่ยนแปลง


6

ต่อไปนี้เป็นไฟล์แบทช์ที่ใช้งานได้กับ Windows - สมมติว่าติดตั้ง DiffMerge ในตำแหน่งเริ่มต้นจัดการ x64 จัดการการส่งต่อแบ็กสแลชแทนตามความจำเป็นและมีความสามารถในการติดตั้งตัวเอง ควรเปลี่ยน DiffMerge ด้วยโปรแกรม diff ที่คุณโปรดปราน

ติดตั้ง:

gitvdiff --install 

gitvdiff.bat:

@echo off

REM ---- Install? ----
REM To install, run gitvdiff --install

if %1==--install goto install



REM ---- Find DiffMerge ----

if DEFINED ProgramFiles^(x86^) (
    Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
    Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)



REM ---- Switch forward slashes to back slashes ----

set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%


REM ---- Launch DiffMerge ----

%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%

goto :EOF



REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off


:EOF

สคริปต์ที่ยอดเยี่ยมมันช่วยฉันในการมองหาคำสั่ง DiffMerge คุณอาจต้องการแก้ไขบรรทัดการติดตั้งเพื่อใช้อัญประกาศ - ฉันมีปัญหากับเครื่อง: "% 1" == "- ติดตั้ง"
Mario

6

หากคุณใช้ Mac และมี XCode แสดงว่าคุณได้ติดตั้ง FileMerge แล้ว คำสั่งเทอร์มินัลเป็น opendiff ดังนั้นคุณสามารถทำได้git difftool -t opendiff


2
ใช้ตัวเลือก -y เพื่อหลีกเลี่ยงการแจ้งที่น่ารำคาญ น่าเสียดายที่คอมไพล์จะรอจนกว่า FileMerge จะหยุดก่อนที่จะเสนอไฟล์ที่เปลี่ยนแปลงถัดไป ใช้ตัวเลือก -d เพื่อทำการเปรียบเทียบไดเรกทอรีในนัดเดียว
miner49r

ตัวเลือก -t ดูเหมือนจะต้องการเส้นทางที่สมบูรณ์ อาจใช้ git difftool --extcmd = opendiff ดีกว่า
yucer

6

ติดตั้ง meld

 # apt-get install meld

จากนั้นเลือกที่เป็น difftool

 $ git config --global diff.tool meld

หากคุณต้องการเรียกใช้บนประเภทคอนโซล:

 $ git difftool

หากคุณต้องการใช้ประเภทโหมดกราฟิก:

 $ git mergetool

และผลลัพธ์จะเป็น:

 'git mergetool' will now attempt to use one of the following tools:
 meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
 diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
 Merging:
 www/css/style.css
 www/js/controllers.js

 Normal merge conflict for 'www/css/style.css':
   {local}: modified file
   {remote}: modified file
 Hit return to start merge resolution tool (meld):

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


5

สำหรับรุ่น linux ของวิธีกำหนดค่าเครื่องมือ diff บนเวอร์ชัน git ก่อนหน้า 1.6.3 (1.6.3 เพิ่ม difftool เพื่อคอมไพล์) นี่คือการสอนที่กระชับ

โดยย่อ:

ขั้นตอนที่ 1: เพิ่มสิ่งนี้ใน. gitconfig ของคุณ

[diff]
  external = git_diff_wrapper
[pager]
  diff =

ขั้นตอนที่ 2: สร้างไฟล์ชื่อ git_diff_wrapper วางไว้ในตำแหน่งที่ $ PATH ของคุณ

#!/bin/sh

vimdiff "$2" "$5"

4

บน Mac OS X

git difftool -t diffuse 

ทำงานให้ฉันในโฟลเดอร์คอมไพล์หรือไม่ สำหรับการติดตั้งแบบกระจายสามารถใช้พอร์ต -

sudo port install diffuse

3

git difftoolคุณสามารถใช้

ตัวอย่างเช่นหากคุณรวมไว้คุณสามารถแก้ไขสาขาmasterและdevelโดย:

git config --global diff.external meld
git difftool master..devel

3

ต่อไปนี้สามารถรวบรวมได้จากคำตอบอื่น ๆ ที่นี่ แต่สำหรับฉันมันยาก (ข้อมูลมากเกินไป) ดังนั้นนี่คือคำตอบ 'เพียงพิมพ์ใน' สำหรับ tkdiff:

git difftool --tool=tkdiff <path to the file to be diffed>

คุณสามารถแทนที่ชื่อที่ปฏิบัติการได้ของเครื่องมือการกระจายที่คุณชื่นชอบสำหรับ tkdiff ตราบใดที่ (เช่น tkdiff), (หรือเครื่องมือการกระจายที่คุณชื่นชอบ) อยู่ใน PATH ของคุณมันจะเปิดตัว


นี่เป็นวิธีที่ง่ายที่สุดและเร็วที่สุด
Zameer Fouzan

2

ฉันลองสิ่งแฟนซีที่นี่ (พร้อม tkdiff) และไม่มีอะไรทำงานให้ฉัน ดังนั้นฉันจึงเขียนสคริปต์ต่อไปนี้ tkgitdiff มันทำในสิ่งที่ฉันต้องการ

$ cat tkgitdiff
#!/bin/sh

#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#

newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile


1

ฉันใช้บิตนี้~/.gitconfigมานานแล้ว:

[diff]
    external = ~/Dropbox/source/bash/git-meld

ด้วยgit-meld:

#!/bin/bash
if [ "$DISPLAY" = "" ];
then
    diff $2 $5
else
    meld $2 $5
fi

แต่ตอนนี้ฉันเบื่อที่จะใช้ meld ในสภาพแวดล้อมแบบกราฟิกมาตลอดและมันก็ไม่สำคัญที่จะเรียกใช้ diff ต่างจากการตั้งค่านี้ดังนั้นฉันจึงเปลี่ยนมาใช้สิ่งนี้:

[alias]
    v =  "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"

ด้วยการตั้งค่านี้สิ่งต่าง ๆ ที่ใช้งานได้:

git v
git v --staged
git v -t kompare
git v --staged -t tkdiff

และฉันยังคงรักษาความดีเอาgit diffไว้


0

หากคุณมีเครื่องมือ diff ที่เชื่อมโยงกับ filetypes อยู่แล้ว (เช่นเนื่องจากคุณติดตั้ง TortoiseSVN ซึ่งมาพร้อมกับ diff Viewer) คุณสามารถไพพ์git diffเอาต์พุตปกติไปยังไฟล์ "temp" จากนั้นก็เปิดไฟล์นั้นโดยตรงโดยไม่จำเป็นต้องรู้ อะไรก็ได้เกี่ยวกับผู้ชม:

git diff > "~/temp.diff" && start "~/temp.diff"

การตั้งค่าเป็นชื่อแทนระดับโลกจะทำงานได้ดียิ่งขึ้น: git what

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"

0

หากคุณไม่ได้เป็นหนึ่งในบรรทัดคำสั่งแล้วถ้าคุณติดตั้งคอมไพล์เต่าคุณสามารถคลิกขวาที่ไฟล์เพื่อรับเมนูย่อย tortoisegit ด้วยตัวเลือก "Diff ภายหลัง"

เมื่อคุณเลือกไฟล์นี้ในไฟล์แรกคุณสามารถคลิกขวาที่ไฟล์ที่สองไปที่เมนูย่อย tortoisegit แล้วเลือก "Diff with == yourfilehere ==" ซึ่งจะให้ tortoisegitmerge gui สำหรับผลลัพธ์


0

คุณอาจต้องการลอง xd http://github.com/jiqingtang/xdซึ่งเป็น GUI wrapper สำหรับ GIT / SVN diff มันไม่ใช่เครื่องมือต่าง คุณเรียกใช้xdเมื่อคุณต้องการเรียกใช้git diffหรือsvn diffมันจะแสดงรายการไฟล์หน้าต่างแสดงตัวอย่างและคุณสามารถเรียกใช้เครื่องมือต่าง ๆ ที่คุณต้องการรวมถึง tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), รวม kompare และ kdiff3 คุณยังสามารถเรียกใช้เครื่องมือที่กำหนดเองได้

น่าเสียดายที่เครื่องมือไม่รองรับ Windows

การเปิดเผยข้อมูล : ฉันเป็นผู้สร้างเครื่องมือนี้

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