Khi tôi gõ "git diff", tôi muốn thấy một khác biệt bên cạnh, như với "diff -y" hoặc muốn hiển thị diff trong một công cụ tìm khác biệt tương tác như "kdiff3". Điều này có thể giải quyết như thế nào?
Khi tôi gõ "git diff", tôi muốn thấy một khác biệt bên cạnh, như với "diff -y" hoặc muốn hiển thị diff trong một công cụ tìm khác biệt tương tác như "kdiff3". Điều này có thể giải quyết như thế nào?
Câu trả lời:
Mặc dù Git có triển khai nội bộ của diff, thay vào đó bạn có thể thiết lập một công cụ bên ngoài.
Có hai cách khác nhau để chỉ định một công cụ tìm khác biệt bên ngoài:
GIT_EXTERNAL_DIFF
và các GIT_DIFF_OPTS
biến môi trường.git config
Xem thêm:
git diff --help
Khi thực hiện git diff
, Git kiểm tra cả cài đặt của các biến môi trường trên và .gitconfig
tệp của nó .
Theo mặc định, Git chuyển bảy đối số sau đây cho chương trình diff:
path old-file old-hex old-mode new-file new-hex new-mode
Bạn thường chỉ cần các tham số tệp cũ và tệp mới. Tất nhiên hầu hết các công cụ diff chỉ lấy hai tên tệp làm đối số. Điều này có nghĩa là bạn cần phải viết một tập lệnh bao bọc nhỏ, lấy các đối số mà Git cung cấp cho tập lệnh và đưa chúng vào chương trình git bên ngoài mà bạn chọn.
Giả sử bạn đặt tập lệnh bao bọc của bạn bên dưới ~/scripts/my_diff.sh
:
#!/bin/bash
# un-comment one diff tool you'd like to use
# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5"
# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"
# using Meld
/usr/bin/meld "$2" "$5"
# using VIM
# /usr/bin/vim -d "$2" "$5"
sau đó bạn cần phải thực hiện tập lệnh đó:
chmod a+x ~/scripts/my_diff.sh
sau đó bạn cần cho Git biết cách và nơi để tìm tập lệnh trình bao khác biệt tùy chỉnh của bạn. Bạn có ba lựa chọn để làm điều đó: (Tôi thích chỉnh sửa tệp .gitconfig)
Sử dụng GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
ví dụ: trong tệp .bashrc hoặc .bash_profile bạn có thể đặt:
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
export GIT_EXTERNAL_DIFF
Sử dụng git config
sử dụng "git config" để xác định nơi có thể tìm thấy tập lệnh trình bao bọc của bạn:
git config --global diff.external ~/scripts/my_diff.sh
Chỉnh sửa ~/.gitconfig
tập tin của bạn
bạn có thể chỉnh sửa ~/.gitconfig
tệp của mình để thêm các dòng này:
[diff]
external = ~/scripts/my_diff.sh
Ghi chú:
Tương tự như việc cài đặt công cụ tìm khác biệt tùy chỉnh của bạn, bạn cũng có thể cài đặt một công cụ hợp nhất tùy chỉnh, có thể là một công cụ hợp nhất trực quan để giúp trực quan hóa việc hợp nhất tốt hơn. (xem trang progit.org)
Xem: http://fredpalma.com/518/visual-diff-and-merge-tool/ và https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
meld
?
meld
phiên bản được cấu hình để làm một diff thư mục, nơi tôi có thể chọn (s) tập tin Tôi muốn nhìn thấy các diff cho? Hiện tại nó chạy một meld
lệnh riêng cho mỗi tệp và tôi phải thoát meld
để xem tệp tiếp theo. Tôi muốn meld
cho tôi xem một danh sách các thư mục thay đổi như nó hoạt động khi meld
được sử dụng từ Mercurial.
Sử dụng git difftool
thay vì git diff
. Bạn sẽ không bao giờ quay trở lại.
Đây là một liên kết đến một stackoverflow khác nói về git difftool
: 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?
Đối với các phiên bản mới hơn git
, difftool
lệnh hỗ trợ nhiều công cụ tìm khác biệt bên ngoài. Ví dụ: vimdiff
được hỗ trợ tự động và có thể được mở từ dòng lệnh bằng cách:
cd /path/to/git/repo
git difftool --tool=vimdiff
Các công cụ khác ngoài được hỗ trợ khác được liệt kê qua git difftool --tool-help
đây là một ví dụ đầu ra:
'git difftool --tool=<tool>' may be set to one of the following:
araxis
kompare
vimdiff
vimdiff2
The following tools are valid, but not currently available:
bc3
codecompare
deltawalker
diffuse
ecmerge
emerge
gvimdiff
gvimdiff2
kdiff3
meld
opendiff
tkdiff
xxdiff
This message is displayed because 'diff.tool' is not configured.
. Có lẽ cập nhật câu trả lời với cách cấu hình tối thiểu thứ này, để nó hiển thị các khác biệt cạnh nhau trong thiết bị đầu cuối, đó là những gì OP yêu cầu? Các công cụ GUI khá vô dụng trên máy chủ từ xa nơi bạn kết nối bằng ssh.
git difftool
với vimdiff
không phải lúc nào xếp hàng hai tập tin / bộ đệm một cách chính xác.
git difftool -y
để ngăn chặn dấu nhắc của
git difftool
trong Windows & Linux: stackoverflow.com/a/48979939/4561887
Bạn cũng có thể thử git diff --word-diff
. Nó không chính xác cạnh nhau, nhưng bằng cách nào đó tốt hơn, vì vậy bạn có thể thích nó hơn nhu cầu bên cạnh thực tế của mình.
git diff --word-diff=color
--word-diff=color
cho tôi một lỗi tùy chọn không hợp lệ. Phiên bản nào đã được giới thiệu?
git diff --color-words
làm việc.
git diff --color-words
là cách để đi trên các phiên bản git hiện đại.
ydiff
Trước đây được gọi cdiff
, công cụ này có thể hiển thị cạnh nhau , tăng dần và khác biệt đầy màu sắc .
Thay vì làm git diff
, hãy làm:
ydiff -s -w0
Điều này sẽ khởi chạy ydiff
ở chế độ hiển thị song song cho mỗi tệp có sự khác biệt.
Cài đặt với:
python3 -m pip install --user ydiff
-hoặc là-
brew install ydiff
Đối với git log
, bạn có thể sử dụng:
ydiff -ls -w0
-w0
tự động phát hiện chiều rộng thiết bị đầu cuối của bạn. Xem ydiff
trang kho lưu trữ GitHub để biết chi tiết và bản demo.
Đã thử nghiệm trong Git 2.18.0, ydiff 1.1.
git diff | cdiff -s
với icdiff không?
ydiff -s
từ không gian làm việc git / svn / hg, bạn không cần phải tham gia.
cd <git repo>
rồi chạyydiff -ls <path/to/file>
Bạn có thể thực hiện song song diff
bằng cách sử dụng sdiff
như sau:
$ git difftool -y -x sdiff HEAD^ | less
đâu HEAD^
là một ví dụ mà bạn nên thay thế bằng bất cứ thứ gì bạn muốn khác.
Tôi tìm thấy giải pháp này ở đây , nơi có một vài gợi ý khác. Tuy nhiên, câu trả lời này là câu hỏi của OP ngắn gọn và rõ ràng.
Xem người đàn ông git-Difftool để được giải thích về các đối số.
Lấy ý kiến trên tàu, bạn có thể tạo một git sdiff
lệnh tiện dụng bằng cách viết tập lệnh thực thi sau:
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
Lưu nó như /usr/bin/git-sdiff
và chmod -x
nó. Sau đó, bạn sẽ có thể làm điều này:
$ git sdiff HEAD^
tput cols
thay thế, ví dụ : git difftool -x "sdiff -s -w $(tput cols)"
.
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
sau đó chỉ đơn giản là:
git diff
Nếu bạn muốn thấy sự khác biệt song song trong trình duyệt mà không liên quan đến GitHub, bạn có thể thưởng thức git webdiff , một sự thay thế thả xuống cho git diff
:
$ pip install webdiff
$ git webdiff
Điều này cung cấp một số lợi thế so với các khác biệt GUI truyền thống như tkdiff
ở chỗ nó có thể cung cấp cho bạn tô sáng cú pháp và hiển thị các khác biệt hình ảnh.
Đọc thêm về nó ở đây .
Tôi sử dụng colordiff .
Trên Mac OS X, cài đặt nó với
$ sudo port install colordiff
Trên Linux có thể apt get install colordiff
hoặc một cái gì đó tương tự, tùy thuộc vào bản phân phối của bạn.
Sau đó:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
Hoặc tạo bí danh
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
Sau đó, bạn có thể sử dụng nó
$ git diffy HEAD^ HEAD
Tôi gọi nó là "diffy" bởi vì diff -y
khác biệt bên cạnh trong unix. Colordiff cũng thêm màu sắc, đó là đẹp hơn. Trong tùy chọn -ydw
, y
dành cho bên cạnh, w
là bỏ qua các khoảng trắng và d
là để tạo ra độ lệch tối thiểu (thường bạn sẽ có kết quả tốt hơn là diff)
-y
để bỏ qua Launch 'colordiff' [Y/n]:
lời nhắc.
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
không Có nên không git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
?
Đối với unix, kết hợp chỉ git
và tích hợp diff
:
git show HEAD:path/to/file | diff -y - path/to/file
Tất nhiên, bạn có thể thay thế HEAD bằng bất kỳ tham chiếu git nào khác và có lẽ bạn muốn thêm một cái gì đó giống như -W 170
vào lệnh diff.
Điều này giả định rằng bạn chỉ đang so sánh nội dung thư mục của bạn với một cam kết trong quá khứ. So sánh giữa hai cam kết phức tạp hơn. Nếu vỏ của bạn là bash
bạn có thể sử dụng "quá trình thay thế":
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
trong đó REF1
và REF2
là các tham chiếu git - thẻ, nhánh hoặc băm.
Cá nhân tôi thực sự thích icdiff !
Nếu bạn đang ở Mac OS X
với HomeBrew
, chỉ cần làm brew install icdiff
.
Để có được nhãn tệp chính xác, cộng với các tính năng thú vị khác, tôi có trong ~/.gitconfig
:
[pager]
difftool = true
[diff]
tool = icdiff
[difftool "icdiff"]
cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
Và tôi sử dụng nó như: git difftool
Câu hỏi này xuất hiện khi tôi đang tìm kiếm một cách nhanh chóng để sử dụng cách tích hợp git để xác định vị trí khác biệt. Tiêu chí giải pháp của tôi:
Tôi tìm thấy câu trả lời này để có được màu trong git.
Để có được sự khác biệt bên cạnh thay vì dòng khác nhau, tôi đã điều chỉnh câu trả lời tuyệt vời của mb14 cho câu hỏi này với các tham số sau:
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"
Nếu bạn không thích thêm [- hoặc {+ tùy chọn --word-diff=color
có thể được sử dụng.
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color
Điều đó đã giúp có được sự so sánh phù hợp với cả mã json và xml và mã java.
Tóm lại, các --word-diff-regex
tùy chọn có khả năng hiển thị hữu ích cùng với cài đặt màu để có được trải nghiệm mã nguồn được tô màu cạnh nhau so với khác biệt dòng tiêu chuẩn, khi duyệt qua các tệp lớn có thay đổi dòng nhỏ.
Một số người khác đã đề cập đến cdiff cho git side-side diffing nhưng không ai đưa ra cách thực hiện đầy đủ.
Cài đặt cdiff:
git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s `pwd`/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
# or just create a new terminal
Chỉnh sửa ~ / .gitconfig chèn các dòng này:
[pager]
diff = false
show = false
[diff]
tool = cdiff
external = "cdiff -s $2 $5 #"
[difftool "cdiff"]
cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"
[alias]
showw = show --ext-dif
Máy nhắn tin tắt là cần thiết để cdiff hoạt động với Diff, dù sao nó cũng là máy nhắn tin nên điều này vẫn ổn. Difftool sẽ hoạt động bất kể các cài đặt này.
Bí danh hiển thị là cần thiết vì git show chỉ hỗ trợ các công cụ tìm khác biệt bên ngoài thông qua đối số.
'#' Ở cuối lệnh diff khác là quan trọng. Lệnh diff của Git nối thêm $ @ (tất cả các biến diff có sẵn) vào lệnh diff, nhưng chúng tôi chỉ muốn hai tên tệp. Vì vậy, chúng tôi gọi hai người đó một cách rõ ràng với $ 2 và $ 5, và sau đó ẩn $ @ đằng sau một nhận xét có thể gây nhầm lẫn cho sdiff. Kết quả là một lỗi trông giống như:
fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.
Các lệnh Git hiện tạo độ lệch cạnh nhau:
git diff <SHA1> <SHA2>
git difftool <SHA1> <SHA2>
git showw <SHA>
Sử dụng Cdiff:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
Bây giờ bạn có diff khác nhau thông qua git diff và Difftool. Và bạn có mã nguồn python cdiff để tùy biến người dùng quyền lực nếu bạn cần nó.
Đây là một cách tiếp cận. Nếu bạn chuyển qua ít hơn, chiều rộng xterm được đặt thành 80, không quá nóng. Nhưng nếu bạn tiến hành lệnh với, ví dụ: COLS = 210, bạn có thể sử dụng xterm mở rộng của mình.
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Mở Intellij IDEA , chọn một hoặc nhiều cam kết trong cửa sổ công cụ "Kiểm soát phiên bản", duyệt các tệp đã thay đổi và nhấp đúp vào chúng để kiểm tra các thay đổi cạnh nhau cho mỗi tệp.
Với trình khởi chạy dòng lệnh kèm theo, bạn có thể mang IDEA lên bất cứ nơi nào một cách đơn giản idea some/path
Có rất nhiều câu trả lời tốt về chủ đề này. Giải pháp của tôi cho vấn đề này là viết một kịch bản.
Đặt tên này là 'git-scriptname' (và làm cho nó có thể thực thi được và đặt nó vào PATH của bạn, giống như bất kỳ tập lệnh nào) và bạn có thể gọi nó như một lệnh git bình thường bằng cách chạy
$ git scriptname
Các chức năng thực tế chỉ là dòng cuối cùng. Đây là nguồn:
#!/usr/bin/env zsh
#
# Show a side-by-side diff of a particular file how it currently exists between:
# * the file system
# * in HEAD (latest committed changes)
function usage() {
cat <<-HERE
USAGE
$(basename $1) <file>
Show a side-by-side diff of a particular file between the current versions:
* on the file system (latest edited changes)
* in HEAD (latest committed changes)
HERE
}
if [[ $# = 0 ]]; then
usage $0
exit
fi
file=$1
diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R
Đây có thể là một giải pháp hơi hạn chế, nhưng thực hiện công việc bằng cách sử dụng diff
lệnh của hệ thống mà không cần các công cụ bên ngoài:
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
--suppress-common-lines
(nếu bạn diff
hỗ trợ tùy chọn).diff
dấu thông thường--width=term-width
; trong Bash có thể lấy chiều rộng bằng $COLUMNS
hoặc tput cols
.Điều này có thể được gói vào một tập lệnh git helper để thuận tiện hơn, ví dụ, cách sử dụng như thế này:
git diffy the/file/path --from rev1 --to rev2