Làm cách nào để tôi xem đầu ra 'git diff' với công cụ / trình xem khác nhau ưa thích của tôi?


754

Khi tôi nhập git diff, tôi muốn xem đầu ra bằng công cụ tìm khác biệt trực quan của mình (SourceGear "diffmerge" trên Windows). Làm thế nào để tôi cấu hình git để làm điều này?


108
Bạn có thể sử dụng "git Difftool" thay vì "git diff" trong tất cả các phiên bản mới hơn của git. Điều đó sẽ mở ra một chương trình khác biệt trực quan.
Bệnh dịch hạch

Về kịch bản mới Difftool, tôi đã thêm một câu trả lời bên dưới: stackoverflow.com/questions/255202/iêu
VonC

2
gitx - gitx.frim.nl . Nuff nói.
Alex Grande

1
Hướng dẫn ngắn gọn bạn tìm thấy ở đây: nathanhoad.net/how-to-meld-for-git-diffs-in-ubfox-hardy
Dmitry Bespalov

5
Chuyển đến kho lưu trữ của bạn trong Git Bash. Loại git config diff.tool winmerge. Xác nhận nó hoạt động bằng cách gõ git difftool. Loại bỏ các gõ nhanh chóng git config --global difftool.prompt false. Tôi khuyên dùng p4merge thay vì winmerge.
Michael S.

Câu trả lời:


386

Kể từ Git1.6.3, bạn có thể sử dụng tập lệnh git Difftool : xem câu trả lời của tôi dưới đây .


Có thể bài viết này sẽ giúp bạn. Dưới đây là những phần tốt nhất:

Có hai cách khác nhau để chỉ định một công cụ tìm khác biệt bên ngoài.

Đầu tiên là phương thức bạn đã sử dụng, bằng cách đặt biến GIT_EXTERNAL_DIFF. Tuy nhiên, biến được cho là trỏ đến đường dẫn đầy đủ của tệp thực thi. Ngoài ra, tệp thực thi được chỉ định bởi GIT_EXTERNAL_DIFF sẽ được gọi với một bộ 7 đối số cố định:

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

Vì hầu hết các công cụ tìm khác biệt sẽ yêu cầu một thứ tự khác nhau (và chỉ một số) đối số, rất có thể bạn sẽ phải chỉ định một tập lệnh bao bọc thay vào đó, lần lượt gọi công cụ tìm khác biệt thực sự.

Phương pháp thứ hai, mà tôi thích, là cấu hình công cụ tìm khác biệt bên ngoài thông qua "git config" . Đây là những gì tôi đã làm:

1) Tạo tập lệnh bao bọc "git-diff-wrapper.sh" có chứa một cái gì đó như

-->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)--

Như bạn có thể thấy, chỉ các đối số thứ hai ("tệp cũ") và thứ năm ("tệp mới") sẽ được truyền cho công cụ tìm khác biệt.

2) Loại

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

tại dấu nhắc lệnh, thay thế bằng đường dẫn đến "git-diff-wrapper.sh", vì vậy ~ / .gitconfig của bạn chứa

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

Hãy chắc chắn sử dụng cú pháp đúng để chỉ định các đường dẫn đến tập lệnh bao bọc và công cụ tìm khác biệt, tức là sử dụng dấu gạch chéo chuyển tiếp thay vì dấu gạch chéo ngược. Trong trường hợp của tôi, tôi có

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

trong .gitconfig và

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

trong tập lệnh bao bọc. Nhớ "mèo"!

(Tôi cho rằng ' | cat' chỉ cần thiết đối với một số chương trình mà có thể không trả lại trạng thái trở lại đúng hoặc phù hợp. Bạn có thể muốn thử mà không có mèo dấu nếu công cụ diff của bạn có tư cách trở lại rõ ràng)

( Diomidis Spinellis thêm vào trong các ý kiến :

Các catlệnh là cần thiết, bởi vì diff(1), bởi lối mặc định với một mã lỗi nếu các tập tin khác nhau.
Git hy vọng chương trình tìm khác biệt bên ngoài sẽ thoát với mã lỗi chỉ khi xảy ra lỗi thực tế, ví dụ nếu nó hết bộ nhớ.
Bằng đường ống đầu ra của gitđể catmã lỗi khác không được che đậy.
Hiệu quả hơn, chương trình chỉ có thể chạy exitvới và đối số là 0.)


Đó (bài báo được trích dẫn ở trên) là lý thuyết cho công cụ bên ngoài được xác định thông qua tệp cấu hình (không thông qua biến môi trường).
Trong thực tế (vẫn dành cho định nghĩa tệp cấu hình của công cụ bên ngoài), bạn có thể tham khảo:


1
à, tôi đã thiết lập chương trình tìm khác biệt bên ngoài nhưng không biết về 7 đối số, cảm ơn.
dùng3891

4
Kudos ... cái này rất tiện dụng. Tôi thiết lập điều này với "opendiff" (khởi chạy tiện ích XCode FileMerge bóng bẩy trong Mac OS X).
Ryan Delucchi

@Ryan: thật tuyệt vời :) Bạn đã sử dụng cài đặt "diff.external" được nêu chi tiết trong câu trả lời này hay "git Difftool" trong câu trả lời thứ hai của tôi dưới đây?
VonC

Tuyệt diệu! Cảm ơn bạn, đã thử cả DiffMerge và opendiff; cả hai hoạt động khá tốt.
vfilby

2
Vì vậy, git gửi 7 đối số cho một chương trình khác? Càng tìm hiểu về Git, tôi càng cảm thấy nó được tạo ra cho một người: Lập trình viên gốc. Dvcs này có vẻ giống như một món đồ chơi sáng bóng không làm được gì nhiều.
C Johnson

211

Để hoàn thành câu trả lời cấu hình "diff.external" trước đây của tôi ở trên:

Như Jakub đã đề cập , Git1.6.3 đã giới thiệu git Difftool , ban đầu được đề xuất vào tháng 9 năm 2008:

SỬ DỤNG = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Xem --extcmdtrong phần cuối của câu trả lời này)

$LOCALchứa nội dung của tệp từ bản sửa đổi bắt đầu và $REMOTEchứa nội dung của tệp trong bản sửa đổi kết thúc.
$BASEchứa nội dung của tập tin trong wor

Về cơ bản, nó git-mergetoolđược sửa đổi để hoạt động trên chỉ số git / worktree.

Các trường hợp sử dụng thông thường cho kịch bản này là khi bạn đã hoặc dàn dựng hoặc thay đổi unstaged và bạn muốn xem những thay đổi trong một side-by-side xem diff (ví dụ xxdiff, tkdiff, vv).

git difftool [<filename>*]

Một trường hợp sử dụng khác là khi bạn muốn xem thông tin tương tự nhưng đang so sánh các cam kết tùy ý (đây là phần mà phân tích cú pháp có thể tốt hơn)

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

Trường hợp sử dụng cuối cùng là khi bạn muốn so sánh công việc hiện tại của mình với thứ gì đó không phải là CHÍNH (ví dụ: thẻ)

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

Lưu ý: kể từ Git 2.5, git config diff.tool winmergelà đủ!
Xem " git mergetool winmerge "

kể từ Git 1.7.11 , bạn có tùy chọn --dir-diff, để sinh ra các công cụ tìm khác biệt bên ngoài có thể so sánh hai hệ thống phân cấp thư mục tại một thời điểm sau khi điền hai thư mục tạm thời, thay vì chạy một phiên bản của công cụ bên ngoài một lần cho mỗi cặp tệp.


Trước Git 2.5:

Trường hợp thực tế để cấu hình difftoolvới công cụ tìm khác biệt tùy chỉnh của bạn:

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

Với winmerge.sh được lưu trữ trong một phần thư mục của PATH của bạn:

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

Nếu bạn có một công cụ khác (kdiff3, P4Diff, ...), hãy tạo một tập lệnh shell khác và difftool.myDiffTool.cmdchỉ thị cấu hình phù hợp .
Sau đó, bạn có thể dễ dàng chuyển đổi các công cụ với diff.toolcấu hình.

Bạn cũng có mục blog này của Dave để thêm các chi tiết khác.
(Hoặc câu hỏi này cho các winmergeutùy chọn)

Sự quan tâm với cài đặt này là winmerge.shtập lệnh : bạn có thể tùy chỉnh nó để tính đến các trường hợp đặc biệt.

Xem ví dụ câu trả lời của David Marble dưới đây để biết ví dụ liên quan đến:

  • tập tin mới trong nguồn gốc hoặc đích
  • loại bỏ các tập tin trong nguồn gốc hoặc đích

Như Kem Mason đề cập trong câu trả lời của mình , bạn cũng có thể tránh bất kỳ trình bao bọc nào bằng cách sử dụng --extcmdtùy chọn :

--extcmd=<command>

Chỉ định một lệnh tùy chỉnh để xem khác biệt. git-difftoolbỏ qua các mặc định được cấu hình và chạy $command $LOCAL $REMOTEkhi tùy chọn này được chỉ định.

Ví dụ, đây là cách gitkcó thể chạy / sử dụng bất kỳ diffcông cụ nào .


11
Tôi đã phải thoát $, với $ LOCAL và $ REMOTE để ngăn chúng trở thành "" và "". Tôi sẽ chỉnh sửa để nói git config --globla Difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" \ $ REMOTE \ ""
Carlos Rendon

Ngoài ra, có ý tưởng nào về cách để tùy chọn -s (mở một số khác biệt trong một cửa sổ winmerge) để làm việc trong sơ đồ này không?
Carlos Rendon

1
@Carlos: Frank (xem bình luận ở trên) muốn bạn xem stackoverflow.com/questions/1220309/NH (để mở một số khác biệt trong một cửa sổ winmerge)
VonC

1
Các tùy chọn --start=--end=không được công nhận trong v1.7.11
Michael

1
@SteveChambers Vâng, tôi đã đề cập đến nó trong stackoverflow.com/a/10879804/6309 . Tôi sẽ chỉnh sửa câu trả lời này.
VonC

110

Trong tinh thần trả lời các câu hỏi có phần khác so với hỏi. Hãy thử giải pháp này:

$ meld my_project_using_git

Meld hiểu git và cung cấp điều hướng xung quanh những thay đổi gần đây.


17
Điều đó thật tuyệt, dễ gõ meld .hơn nhiều git difftoolvà phải xem các tệp thay đổi liên tục. Và nó gần với hg vdiffplugin của Mercurial hơn nhiều .
Tom

6
Ngoài ra, meld .hoạt động trên các dự án Mercurial và Subversion cũng vậy, trong trường hợp bất kỳ ai cũng tò mò.
Tom

Hmm, khi tôi làm điều này một danh sách các tập tin sửa đổi hiển thị. Khi tôi nhấp vào một trong số chúng hoặc thực hiện 'so sánh', nó sẽ mở một mình trong một tab riêng biệt. Làm thế nào để tôi có một khác biệt?
misiu_mp

@misiu_mp, tôi vừa thử nó, khi nhấp vào các tệp đã sửa đổi, nó hiển thị diff (tệp cũ cũng như tệp đã sửa đổi).
db42

Tại phiên bản này đã được thêm vào? Nó không xuất hiện để làm việc với phiên bản meld 1.1.5.
Đánh dấu gian hàng

41

Với git Difftool mới , đơn giản như việc thêm nó vào tệp .gitconfig của bạn :

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

Tùy chọn, cũng thêm:

[difftool]
    prompt = false

Ngoài ra hãy kiểm tra diffall , một tập lệnh đơn giản mà tôi đã viết để mở rộng hành vi tìm mặc định khó chịu (IMO) của việc mở từng chuỗi nối tiếp.

.Gitconfig toàn cầu trên Windows nằm trong %USERPROFILE%\.gitconfig


1
$ local là gì và $ remote là gì?
C Johnson

3
+1 cho một phương thức không yêu cầu tập lệnh bao bọc
jhewlett

@CJohnson: Đường dẫn đến tệp gốc và đường dẫn đến tệp đã chỉnh sửa, tương ứng.
jhewlett

trong trường hợp liên kết blog bị chết, đây là câu trả lời SO được liên kết: stackoverflow.com/a/1291578/321973
Tobias Kienzler

1
@CJohnson: $ LOCAL luôn là cam kết mới nhất. Tuy nhiên, $ REMOTE không nhất quán. Khi xem xét các thay đổi trong hộp cát cục bộ, đó là tệp hiện tại / đã chỉnh sửa, nhưng khi phân biệt các cam kết lịch sử, đó là cam kết cha mẹ . IOW cho diffs bình thường $ LOCAL = cũ và $ REMOTE = new. Đối với lịch sử, $ LOCAL = mới hơn và $ REMOTE = cũ hơn.
Granger

40

Vì phiên bản git 1.6.3 có " git Difftool " mà bạn có thể định cấu hình để sử dụng công cụ tìm đồ họa ưa thích của mình. Hiện tại được hỗ trợ ngoài hộp là kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuseopendiff ; nếu công cụ bạn muốn sử dụng không có trong danh sách này, bạn luôn có thể sử dụng difftool.<tool>.cmdtùy chọn cấu hình ''.

"git Difftool" chấp nhận các tùy chọn tương tự như "git diff".


1
Araxis Merge cũng được cấu hình. araxis.com/merge/scm_integration.html
ΩmegaMan

8
sử dụng ví dụ:git difftool -t kdiff3 HEAD
emanaton

24

Tôi có một bổ sung cho điều này. Tôi muốn thường xuyên sử dụng một ứng dụng khác không được hỗ trợ như một trong những công cụ mặc định (ví dụ: kính vạn hoa), thông qua

git difftool -t

Tôi cũng muốn có mặc định diffchỉ là dòng lệnh thông thường, vì vậy việc đặt GIT_EXTERNAL_DIFFbiến không phải là một tùy chọn.

Bạn có thể sử dụng một diffứng dụng tùy ý một lần với lệnh này:

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

Nó chỉ chuyển 2 tệp vào lệnh bạn chỉ định, vì vậy bạn có thể không cần trình bao bọc.


1
Điểm tốt: chưa có ai đề cập đến --extcmdtùy chọn đó . +1. Tôi đã bao gồm nó trong câu trả lời của tôi.
VonC

19

Dựa trên câu trả lời của VonC để đối phó với việc xóa và bổ sung tệp, hãy sử dụng các lệnh và tập lệnh sau:

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

Điều này cũng giống như đưa điều này vào toàn cầu của bạn .gitconfig:

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

Sau đó đặt các mục sau winmerge.shphải nằm trên đường dẫn của bạn:

#!/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

Bổ sung tuyệt vời cho winmerge.shkịch bản. +1. Tôi đã cập nhật câu trả lời của tôi để liên kết với bạn.
VonC

1
winmerge.battrong đoạn trích thứ hai nên làwinmerge.sh
BartoszKP

Bạn có thể làm điều này cho nhiều công cụ? Và liên kết chúng bằng cách mở rộng tập tin?
yucer

12

Giải pháp cho Windows / msys git

Sau khi đọc câu trả lời, tôi phát hiện ra một cách đơn giản hơn là chỉ thay đổi một tệp.

  1. Tạo một tệp bó để gọi chương trình diff của bạn, với đối số 2 và 5. Tệp này phải ở đâu đó trong đường dẫn của bạn. (Nếu bạn không biết đó là đâu, hãy đặt nó vào c: \ windows). Gọi nó, ví dụ, "gitdiff.bat". Của tôi là:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. Đặt biến môi trường để trỏ đến tệp bó của bạn. Ví dụ : GIT_EXTERNAL_DIFF=gitdiff.bat. Hoặc thông qua powershell bằng cách gõ git config --global diff.external gitdiff.bat.

    Điều quan trọng là không sử dụng dấu ngoặc kép hoặc chỉ định bất kỳ thông tin đường dẫn nào, nếu không nó sẽ không hoạt động. Đó là lý do tại sao gitdiff.bat phải ở trong con đường của bạn.

Bây giờ khi bạn gõ "git diff", nó sẽ gọi trình xem khác bên ngoài của bạn.


1
+1 (+10 nếu tôi có thể.) Đây thực sự là giải pháp đơn giản nhất. Tôi đã vật lộn hàng giờ với câu trả lời được chấp nhận và cuối cùng đã bỏ cuộc (một số vấn đề của tôi có lẽ liên quan đến việc chạy Git thông qua PowerShell ...) Tuy nhiên, tôi đã sử dụng git config --global diff.external winmerge.cmd, thay vì đặt GIT_EXTERNAL_DIFFbiến môi trường và nó hoạt động tốt như nhau.
Christoffer Lette

Một số vấn đề với giải pháp này: 1. Không hoạt động đối với các tệp mới. WinMerge yêu cầu tôi nhập tệp thứ hai để so sánh với. 2. Cửa sổ để so sánh tệp tiếp theo chỉ mở ra sau khi bạn đóng cửa sổ WinMerge hiện tại, không có cách nào dễ dàng để xem tất cả các tệp cùng một lúc.
Chúa Giêsu H

9

Nếu bạn đang làm điều này thông qua cygwin, bạn có thể cần phải sử dụng 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`

Vì một số lý do, sử dụng "bc3" không còn hiệu quả với tôi nữa, nhưng nếu tôi sử dụng "ngoài", thì tốt thôi.
idbrii

9

Sau khi xem xét một số công cụ khác bên ngoài khác, tôi thấy rằng diffchế độ xem trong IntelliJ IDEA (và Android Studio) là công cụ tốt nhất đối với tôi.

Bước 1 - thiết lập IntelliJ IDEA để được chạy từ dòng lệnh

Nếu bạn muốn sử dụng IntelliJ IDEA làm công cụ tìm khác biệt của mình, trước tiên bạn nên thiết lập IntelliJ IDEA để được chạy từ dòng lệnh theo hướng dẫn tại đây :

Trên macOS hoặc UNIX:

  1. Hãy chắc chắn rằng IntelliJ IDEA đang chạy.
  2. Trên menu chính, chọn Tools | Create Command-line Launcher. Hộp thoại Tạo tập lệnh khởi chạy mở ra, với đường dẫn và tên được đề xuất của tập lệnh trình khởi chạy. Bạn có thể chấp nhận mặc định hoặc chỉ định đường dẫn của riêng bạn. Hãy thông báo về nó, vì bạn sẽ cần nó sau này. Bên ngoài IntelliJ IDEA, thêm đường dẫn và tên của tập lệnh launcher vào đường dẫn của bạn.

Trên Windows:

  1. Chỉ định vị trí của tệp thực thi IntelliJ IDEA trong biến môi trường hệ thống Đường dẫn. Trong trường hợp này, bạn sẽ có thể gọi các lệnh thực thi IntelliJ IDEA và các lệnh IntelliJ IDEA khác từ bất kỳ thư mục nào.

Bước 2 - cấu hình git để sử dụng IntelliJ IDEA làm Difftool

Thực hiện theo các hướng dẫn trên bài đăng blog này :

Bash

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

Bây giờ thêm phần sau vào cấu hình git của bạn:

[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")

Bạn có thể dùng thử với git difftoolhoặcgit difftool HEAD~1


8

cái này hoạt động với tôi trên windows 7. Không cần script sh trung gian

nội dung của .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

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

Bạn cũng có kdiff3 được định nghĩa là mergetool của bạn? Tâm trí chia sẻ một phần của gitconfig của bạn nếu vậy?
blong

2
Cảm ơn. Điều này không hiệu quả với tôi nhưng nó đã hoạt động khi tôi gỡ bỏ pathvà đổi cmdthành"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Steve Chambers

7

Một bản tóm tắt ngắn gọn về các câu trả lời tuyệt vời ở trên:

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

Sau đó sử dụng nó bằng cách gõ (tùy chọn chỉ định tên tệp):

git difftool

6

Giới thiệu

Để tham khảo tôi muốn đưa biến thể của mình vào câu trả lời của VonC. Hãy nhớ rằng tôi đang sử dụng phiên bản MSys của Git (1.6.0.2 tại thời điểm này) với PATH đã sửa đổi và tự chạy Git từ Powershell (hoặc cmd.exe), không phải vỏ Bash.

Tôi đã giới thiệu một lệnh mới gitdiff,. Chạy lệnh này tạm thời chuyển hướng git diffđể sử dụng chương trình tìm khác biệt trực quan mà bạn chọn (trái ngược với giải pháp của VonC thực hiện vĩnh viễn). Điều này cho phép tôi có cả chức năng Git diff ( git diff) mặc định cũng như chức năng tìm khác biệt trực quan ( gitdiff). Cả hai lệnh đều có cùng tham số, vì vậy, ví dụ để thay đổi trực quan khác nhau trong một tệp cụ thể bạn có thể nhập

gitdiff path/file.txt

Thiết lập

Lưu ý rằng $GitInstallđược sử dụng như một trình giữ chỗ cho thư mục nơi Git được cài đặt.

  1. Tạo một tệp mới, $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. Tạo một tệp mới, $GitInstall\bin\git-diff-visual.cmd(thay thế [visual_diff_exe]trình giữ chỗ bằng đường dẫn đầy đủ đến chương trình khác bạn chọn)

    @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. Bây giờ bạn đã hoàn thành. Chạy gitdifftừ trong kho Git bây giờ sẽ gọi chương trình tìm khác biệt trực quan của bạn cho mọi tệp đã được thay đổi.


6

Đây là một tệp bó hoạt động cho Windows - giả sử DiffMerge được cài đặt ở vị trí mặc định, xử lý x64, xử lý chuyển tiếp để thay thế dấu gạch chéo khi cần thiết và có khả năng tự cài đặt. Nên dễ dàng thay thế DiffMerge bằng chương trình diff yêu thích của bạn.

Để cài đặt:

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

Kịch bản tuyệt vời, nó đã cứu tôi những rắc rối khi tìm kiếm các lệnh DiffMerge. Bạn có thể muốn sửa đổi dòng cài đặt để sử dụng dấu ngoặc kép - Tôi gặp sự cố trên máy của mình: "% 1" == "- cài đặt".
Mario

6

Nếu bạn đang dùng Mac và có XCode, thì bạn đã cài đặt FileMerge. Lệnh terminal là opendiff, vì vậy bạn chỉ cần làmgit difftool -t opendiff


2
Sử dụng tùy chọn -y để tránh lời nhắc khó chịu. Thật không may, git sẽ đợi cho đến khi FileMerge thoát ra trước khi đưa ra tệp thay đổi tiếp theo. Sử dụng tùy chọn -d để thực hiện so sánh thư mục trong một lần chụp.
miner49r

Tùy chọn -t dường như yêu cầu đường dẫn đầy đủ. Có lẽ sử dụng git Difftool --extcmd = opendiff thì tốt hơn.
yucer

6

Cài đặt meld

 # apt-get install meld

Sau đó chọn nó là Difftool

 $ git config --global diff.tool meld

Nếu bạn muốn chạy nó trên loại bàn điều khiển:

 $ git difftool

Nếu bạn muốn sử dụng loại chế độ đồ họa:

 $ git mergetool

Và đầu ra sẽ là:

 '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):

Vì vậy, chỉ cần nhấn enter để sử dụng meld (mặc định), điều này sẽ mở chế độ đồ họa, thực hiện phép thuật lưu và nhấn để giải quyết việc hợp nhất. Đó là tất cả


5

Đối với phiên bản linux về cách định cấu hình công cụ tìm khác biệt trên các phiên bản git trước 1.6.3 (1.6.3 đã thêm Difftool vào git), đây là một hướng dẫn ngắn gọn tuyệt vời,

tóm lại:

Bước 1: thêm phần này vào .gitconfig của bạn

[diff]
  external = git_diff_wrapper
[pager]
  diff =

Bước 2: tạo một tệp có tên git_diff_wrapper, đặt nó ở đâu đó trong $ PATH của bạn

#!/bin/sh

vimdiff "$2" "$5"

4

Trên Mac OS X,

git difftool -t diffuse 

thực hiện công việc cho tôi trong thư mục git. Để cài đặt khuếch tán, người ta có thể sử dụng cổng -

sudo port install diffuse

3

bạn có thể sử dụng git difftool.

ví dụ: nếu bạn có meld , bạn có thể chỉnh sửa các nhánh masterdevelbằng cách:

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

3

Những điều sau đây có thể được lượm lặt từ các câu trả lời khác ở đây, nhưng đối với tôi thật khó, (quá nhiều thông tin), vì vậy đây là câu trả lời 'chỉ cần gõ nó' cho tkdiff:

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

Bạn có thể thay thế tên thực thi của công cụ tìm khác nhau yêu thích của bạn cho tkdiff. Miễn là (ví dụ: tkdiff), (hoặc công cụ khuếch tán yêu thích của bạn) nằm trong PATH của bạn, nó sẽ được khởi chạy.


đây là cách đơn giản nhất và nhanh nhất
Zameer Fouzan

2

Tôi đã thử những thứ ưa thích ở đây (với tkdiff) và không có gì làm việc cho tôi. Vì vậy, tôi đã viết kịch bản sau đây, tkgitdiff. Nó làm những gì tôi cần nó để làm.

$ 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

Tôi sử dụng kompare trên Ubuntu:

sudo apt-get install kompare

Để so sánh hai nhánh:

git difftool -t kompare <my_branch> master

1

Tôi đã sử dụng bit này trong ~/.gitconfigmột thời gian dài:

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

Với git-meld:

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

Nhưng bây giờ tôi cảm thấy mệt mỏi vì luôn sử dụng meld trong môi trường đồ họa và việc gọi các khác thường với thiết lập này không phải là chuyện nhỏ, vì vậy tôi đã chuyển sang:

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

Với thiết lập này, những thứ như thế này hoạt động:

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

Và tôi vẫn nhận được để giữ cho tốt cũ git diff.


0

Nếu bạn tình cờ đã có một công cụ tìm khác biệt được liên kết với filetypes (giả sử, vì bạn đã cài đặt TortoiseSVN đi kèm với trình xem khác biệt), bạn có thể chuyển git diffđầu ra thông thường sang tệp "tạm thời", sau đó chỉ cần mở tệp đó trực tiếp mà không cần biết bất cứ điều gì về người xem:

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

Đặt nó làm bí danh toàn cầu hoạt động thậm chí còn tốt hơn: git what

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

0

Nếu bạn không phải là một trong dòng lệnh thì nếu bạn cài đặt rùa git, bạn có thể nhấp chuột phải vào một tập tin để có được một menu con tortoisegit với tùy chọn "Diff later".

Khi bạn chọn tệp này trên tệp đầu tiên, sau đó bạn có thể nhấp chuột phải vào tệp thứ hai, đi tới menu con tortoisegit và chọn "Diff with == yourfilehere ==" Điều này sẽ đưa ra kết quả cho tortoisegitmerge gui.


0

Bạn có thể muốn dùng thử xd http://github.com/ji Khánhtang/xd , đây là trình bao bọc GUI cho GIT / SVN diff. Nó KHÔNG phải là một công cụ khác. Bạn chạy xdkhi bạn muốn chạy git diffhoặc svn diffnó sẽ hiển thị cho bạn một danh sách các tệp, cửa sổ xem trước và bạn có thể khởi chạy bất kỳ công cụ khác nào bạn thích, bao gồm tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), meld, khuếch tán, kompare và kdiff3. Bạn cũng có thể chạy bất kỳ công cụ tùy chỉnh.

Thật không may, công cụ này không hỗ trợ Windows.

Tiết lộ : Tôi là tác giả của công cụ này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.