เมื่อฉันพิมพ์ "git diff" ฉันต้องการเห็น diff แบบเคียงข้างกันเช่น "diff -y" หรือต้องการแสดง diff ในเครื่องมือ diff แบบโต้ตอบเช่น "kdiff3" สิ่งนี้สามารถทำได้?
เมื่อฉันพิมพ์ "git diff" ฉันต้องการเห็น diff แบบเคียงข้างกันเช่น "diff -y" หรือต้องการแสดง diff ในเครื่องมือ diff แบบโต้ตอบเช่น "kdiff3" สิ่งนี้สามารถทำได้?
คำตอบ:
แม้ว่า Git จะมีการนำไปใช้ภายใน diff แต่คุณสามารถตั้งค่าเครื่องมือภายนอกแทน
มีสองวิธีที่แตกต่างกันในการระบุเครื่องมือ diff ภายนอก:
GIT_EXTERNAL_DIFF
และGIT_DIFF_OPTS
ตัวแปรสภาพแวดล้อมgit config
ดูสิ่งนี้ด้วย:
git diff --help
เมื่อทำ a git diff
, Git จะตรวจสอบทั้งการตั้งค่าตัวแปรสภาพแวดล้อมข้างต้นและ.gitconfig
ไฟล์
โดยค่าเริ่มต้น Git ส่งผ่านเจ็ดอาร์กิวเมนต์ต่อไปนี้ไปยังโปรแกรม diff:
path old-file old-hex old-mode new-file new-hex new-mode
โดยทั่วไปคุณต้องการเพียงพารามิเตอร์ไฟล์เก่าและไฟล์ใหม่ แน่นอนที่สุดเครื่องมือต่าง ๆ ใช้ชื่อไฟล์สองชื่อเป็นอาร์กิวเมนต์เท่านั้น ซึ่งหมายความว่าคุณต้องเขียน wrapper-script ขนาดเล็กซึ่งใช้อาร์กิวเมนต์ที่ Git จัดให้กับสคริปต์และส่งต่อไปยังโปรแกรม git ภายนอกที่คุณเลือก
สมมติว่าคุณวางเสื้อคลุมสคริปต์ไว้ใต้~/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"
จากนั้นคุณต้องทำให้สคริปต์นั้นทำงานได้:
chmod a+x ~/scripts/my_diff.sh
จากนั้นคุณต้องบอก Git อย่างไรและจะหาสคริปต์ wrapper diff ของคุณได้อย่างไร คุณมีสามทางเลือกว่าจะทำอย่างไร: (ฉันชอบแก้ไขไฟล์. gitconfig)
การใช้ GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
เช่นในไฟล์. bashrc หรือ. bash_profile ของคุณคุณสามารถตั้งค่า:
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
export GIT_EXTERNAL_DIFF
การใช้ git config
ใช้ "git config" เพื่อกำหนดตำแหน่งที่สามารถพบสคริปต์ตัวตัดคำของคุณ:
git config --global diff.external ~/scripts/my_diff.sh
การแก้ไขของคุณ ~/.gitconfig
ไฟล์
คุณสามารถแก้ไข~/.gitconfig
ไฟล์ของคุณเพื่อเพิ่มบรรทัดเหล่านี้:
[diff]
external = ~/scripts/my_diff.sh
บันทึก:
เช่นเดียวกับการติดตั้งเครื่องมือ diff แบบกำหนดเองของคุณคุณยังสามารถติดตั้งเครื่องมือผสานแบบกำหนดเองซึ่งอาจเป็นเครื่องมือการผสานภาพเพื่อช่วยให้มองเห็นการผสานได้ดียิ่งขึ้น (ดูที่หน้า progit.org)
ดู: http://fredpalma.com/518/visual-diff-and-merge-tool/และhttps://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
meld
?
meld
รุ่นที่มีการกำหนดค่าที่จะทำ diff ไดเรกทอรีที่ฉันสามารถเลือกไฟล์ (s) ผมอยากจะเห็นความแตกต่างสำหรับ? ขณะนี้มันรันmeld
คำสั่งแยกต่างหากสำหรับแต่ละไฟล์และฉันต้องออกmeld
เพื่อที่จะดูไฟล์ต่อไป ฉันควรmeld
แสดงรายการไดเรกทอรีของไฟล์ที่ถูกเปลี่ยนแปลงเหมือนที่มันทำงานเมื่อmeld
ใช้จาก Mercurial
ใช้git difftool
แทนgit diff
แทนคุณจะไม่ย้อนกลับไป
นี่คือลิงก์ไปยังสแต็คโอเวอร์โฟลว์อื่นที่พูดถึงgit difftool
: ฉันจะดูผลลัพธ์ 'git diff' ด้วยเครื่องมือ / โปรแกรมดูไฟล์ diff ของฉันได้อย่างไร
สำหรับรุ่นใหม่ของgit
การdifftool
สั่งสนับสนุนเครื่องมือ diff ภายนอกมากออกจากกล่อง ตัวอย่างเช่นvimdiff
รองรับอัตโนมัติและสามารถเปิดได้จากบรรทัดคำสั่งโดย:
cd /path/to/git/repo
git difftool --tool=vimdiff
เครื่องมือ diff ภายนอกอื่น ๆ ที่รองรับแสดงไว้git difftool --tool-help
ที่นี่เป็นตัวอย่างผลลัพธ์:
'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.
หรือบางทีคุณอาจจะกลับไปถ้าคุณได้รับ อาจอัพเดตคำตอบด้วยวิธีการตั้งค่าสิ่งนี้น้อยที่สุดเพื่อให้มันแสดงผลแบบเคียงข้างกันในเทอร์มินัลซึ่งเป็นสิ่งที่ OP ขอหรือไม่ เครื่องมือ GUI ค่อนข้างไร้ประโยชน์บนเซิร์ฟเวอร์ระยะไกลที่คุณเชื่อมต่อโดยใช้ ssh
git difftool
โดยที่vimdiff
ไม่ได้เรียงไฟล์ / บัฟเฟอร์ทั้งสองให้ถูกต้องเสมอไป
git difftool -y
เพื่อป้องกันไม่ให้ tkdiff พรอมต์
git difftool
ใน Windows & Linux: stackoverflow.com/a/48979939/4561887
git diff --word-diff
นอกจากนี้คุณยังสามารถลอง มันไม่ได้อยู่เคียงข้างกัน แต่อย่างใดดีกว่าดังนั้นคุณอาจต้องการความต้องการที่แท้จริงของคุณแบบเคียงข้างกัน
git diff --word-diff=color
--word-diff=color
ทำให้ฉันมีข้อผิดพลาดตัวเลือกที่ไม่ถูกต้อง เวอร์ชั่นไหนที่เปิดตัว?
git diff --color-words
ทำงานได้ดี
git diff --color-words
เป็นวิธีที่จะไปรุ่น git ที่ทันสมัย
ydiff
เมื่อก่อนเรียกว่าcdiff
เครื่องมือนี้สามารถแสดงแบบเคียงข้างกันเพิ่มขึ้นและมีสีสันที่แตกต่าง
แทนที่จะทำgit diff
ทำ:
ydiff -s -w0
นี้จะเปิดตัว ydiff
ในโหมดการแสดงผลแบบเคียงข้างกันสำหรับแต่ละไฟล์ที่มีความแตกต่าง
ติดตั้งด้วย:
python3 -m pip install --user ydiff
-หรือ-
brew install ydiff
สำหรับgit log
คุณสามารถใช้:
ydiff -ls -w0
-w0
ตรวจจับความกว้างเทอร์มินัลของคุณโดยอัตโนมัติ ดูydiff
หน้าพื้นที่เก็บข้อมูล GitHubสำหรับรายละเอียดและการสาธิต
ทดสอบใน Git 2.18.0, ydiff 1.1
git diff | cdiff -s
กับ icdiff ได้หรือไม่?
ydiff -s
จากพื้นที่ทำงาน git / svn / hg คุณไม่ต้องไปป์
cd <git repo>
แล้วเรียกใช้ydiff -ls <path/to/file>
คุณสามารถทำแบบเคียงข้างกันโดยdiff
ใช้sdiff
ดังนี้:
$ git difftool -y -x sdiff HEAD^ | less
ที่ไหน HEAD^
เป็นตัวอย่างที่คุณควรเปลี่ยนกับสิ่งที่คุณต้องการที่จะต่อต้าน diff
ฉันพบวิธีแก้ปัญหานี้ที่นี่ซึ่งมีข้อเสนอแนะอื่น ๆ อีกสองสามรายการด้วย อย่างไรก็ตามคำตอบเดียวนี้เป็นคำถามของ OP อย่างกระชับและชัดเจน
ดูman git-difftoolเพื่อดูคำอธิบายของข้อโต้แย้ง
การแสดงความคิดเห็นบนกระดานคุณสามารถสร้างgit sdiff
คำสั่งที่มีประโยชน์ได้โดยการเขียนสคริปต์ที่สามารถเรียกใช้งานได้ดังต่อไปนี้:
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
บันทึกเป็น/usr/bin/git-sdiff
และchmod -x
มัน จากนั้นคุณจะสามารถทำสิ่งนี้:
$ git sdiff HEAD^
tput cols
git difftool -x "sdiff -s -w $(tput cols)"
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
แล้วก็:
git diff
หากคุณต้องการเห็นความแตกต่างแบบเคียงข้างกันในเบราว์เซอร์โดยไม่เกี่ยวข้องกับ GitHub คุณอาจสนุกกับgit webdiffซึ่งเป็นสิ่งทดแทนสำหรับgit diff
:
$ pip install webdiff
$ git webdiff
สิ่งนี้มีข้อได้เปรียบเหนือกว่า GUI ที่แตกต่างกันหลายอย่างเช่น tkdiff
ซึ่งช่วยให้คุณสามารถเน้นไวยากรณ์และแสดงภาพที่แตกต่างได้
บน Mac OS X ให้ติดตั้งด้วย
$ sudo port install colordiff
บน Linux อาจเป็นไปได้apt get install colordiff
หรืออะไรทำนองนั้นขึ้นอยู่กับ distro ของคุณ
แล้ว:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
หรือสร้างนามแฝง
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
จากนั้นคุณสามารถใช้มัน
$ git diffy HEAD^ HEAD
ฉันเรียกมันว่า "diffy" เพราะdiff -y
diff-by-side เป็นยูนิกซ์ Colordiff ยังเพิ่มสีสันนั่นก็ดีกว่า ในตัวเลือก-ydw
ที่y
เป็นด้านข้างที่w
เป็นช่องว่างที่จะไม่สนใจและd
เป็นในการผลิตต่างน้อยที่สุด (โดยปกติคุณจะได้รับผลที่ดีกว่าเป็น diff)
-y
เพื่อข้ามLaunch 'colordiff' [Y/n]:
พรอมต์
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
เหรอ ไม่ควรgit config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
หรือ
สำหรับ unix การรวม just git
และ built-in diff
:
git show HEAD:path/to/file | diff -y - path/to/file
แน่นอนคุณสามารถแทนที่ HEAD ด้วยการอ้างอิง git อื่น ๆ และคุณอาจต้องการเพิ่มบางอย่างเช่น-W 170
คำสั่ง diff
สมมติว่าคุณเพิ่งเปรียบเทียบเนื้อหาไดเรกทอรีของคุณกับการกระทำที่ผ่านมา การเปรียบเทียบระหว่างสองคอมมิทนั้นซับซ้อนมากขึ้น หากเชลล์ของคุณคือbash
คุณสามารถใช้ "การทดแทนกระบวนการ":
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
ที่ไหนREF1
และREF2
มีการอ้างอิง Git - แท็กสาขาหรือแฮช
โดยส่วนตัวแล้วฉันชอบicdiff !
หากคุณอยู่ในMac OS X
ที่มีเพียงแค่ทำHomeBrew
brew install icdiff
เพื่อให้ได้เลเบลไฟล์อย่างถูกต้องรวมทั้งฟีเจอร์เด็ด ๆ อื่น ๆ ฉันมีใน~/.gitconfig
:
[pager]
difftool = true
[diff]
tool = icdiff
[difftool "icdiff"]
cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
และฉันใช้มันเหมือน: git difftool
คำถามนี้ปรากฏขึ้นเมื่อฉันค้นหาวิธีที่รวดเร็วในการใช้วิธี git builtin เพื่อค้นหาความแตกต่าง เกณฑ์การแก้ปัญหาของฉัน:
ฉันพบคำตอบนี้เพื่อให้ได้สีในคอมไพล์
เพื่อให้ได้ต่างกันแทน diff diff ฉัน tweaked mb14ของคำตอบที่ดีกับคำถามนี้ด้วยพารามิเตอร์ต่อไปนี้:
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"
หากคุณไม่ชอบ [- หรือ {+ พิเศษ--word-diff=color
สามารถใช้ตัวเลือกได้
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color
ที่ช่วยในการเปรียบเทียบที่เหมาะสมกับทั้งข้อความ json และ xml และรหัสจาวา
โดยสรุป--word-diff-regex
ตัวเลือกมีการมองเห็นที่เป็นประโยชน์ร่วมกับการตั้งค่าสีเพื่อให้ได้รับซอร์สโค้ดแบบเคียงข้างกันเมื่อเปรียบเทียบกับบรรทัดมาตรฐานที่ต่างกันเมื่อเรียกดูไฟล์ขนาดใหญ่ที่มีการเปลี่ยนแปลงบรรทัดเล็ก ๆ
อีกหลายคนพูดถึงcdiffสำหรับคอมไพล์แบบเคียงข้างกัน แต่ไม่มีใครให้การใช้งานเต็มที่
ตั้งค่า 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
แก้ไข ~ / .gitconfig แทรกบรรทัดเหล่านี้:
[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
การปิดเพจเจอร์จำเป็นสำหรับ cdiff ในการทำงานกับ Diff มันเป็นเพจเจอร์เป็นหลักอยู่แล้วดังนั้นนี่จึงเป็นเรื่องปกติ Difftool จะทำงานโดยไม่คำนึงถึงการตั้งค่าเหล่านี้
จำเป็นต้องใช้นามแฝงการแสดงเนื่องจาก git show สนับสนุนเครื่องมือ diff ภายนอกผ่านการโต้แย้งเท่านั้น
'#' ในตอนท้ายของคำสั่ง diff ภายนอกเป็นสิ่งสำคัญ คำสั่ง diff ของ Git จะเพิ่ม $ @ (ตัวแปร diff ที่มีอยู่ทั้งหมด) ให้กับคำสั่ง diff แต่เราต้องการแค่สองชื่อไฟล์เท่านั้น ดังนั้นเราจึงเรียกสองสิ่งนี้อย่างชัดเจนด้วย $ 2 และ $ 5 จากนั้นซ่อน $ @ ไว้หลังความคิดเห็นซึ่งอาจสร้างความสับสนให้กับ sdiff ทำให้เกิดข้อผิดพลาดที่ดูเหมือนว่า:
fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.
คำสั่ง Git ที่ทำให้เกิดความแตกต่างแบบเคียงข้างกัน:
git diff <SHA1> <SHA2>
git difftool <SHA1> <SHA2>
git showw <SHA>
การใช้ Cdiff:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
ตอนนี้คุณมี diff ต่างกันผ่าน git diff และ difftool และคุณมีซอร์สโค้ด cdiff สำหรับการปรับแต่งผู้ใช้ระดับสูงหากคุณต้องการ
นี่คือวิธีการ หากคุณผ่านน้อยกว่าความกว้าง xterm ถูกตั้งค่าเป็น 80 ซึ่งไม่ร้อนมาก แต่ถ้าคุณดำเนินการคำสั่งด้วยเช่น COLS = 210 คุณสามารถใช้ xterm ที่ขยายของคุณได้
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
เปิดIntellij IDEAเลือกการกระทำเดียวหรือหลายรายการในหน้าต่างเครื่องมือ "การควบคุมเวอร์ชัน" เรียกดูไฟล์ที่เปลี่ยนแปลงแล้วคลิกสองครั้งเพื่อตรวจสอบการเปลี่ยนแปลงแบบเคียงข้างกันสำหรับแต่ละไฟล์
ด้วยตัวเรียกใช้งานบรรทัดคำสั่งที่ให้มาคุณสามารถนำ IDEA ขึ้นมาได้ทุกที่ด้วยวิธีง่ายๆ idea some/path
มีคำตอบที่ดีมากมายในกระทู้นี้ ทางออกของฉันสำหรับปัญหานี้คือการเขียนสคริปต์
ตั้งชื่อนี้ว่า 'git-scriptname' (และทำให้มันใช้งานได้และนำไปไว้ใน PATH ของคุณเช่นสคริปต์ใด ๆ ) และคุณสามารถเรียกใช้มันเหมือนคำสั่ง git ปกติโดยการเรียกใช้
$ git scriptname
ฟังก์ชันการทำงานจริงเป็นเพียงบรรทัดสุดท้าย นี่คือแหล่งที่มา:
#!/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
นี่อาจเป็นวิธีที่ค่อนข้าง จำกัด แต่ทำงานโดยใช้diff
คำสั่งของระบบโดยไม่มีเครื่องมือภายนอก:
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
--suppress-common-lines
(หากคุณdiff
สนับสนุนตัวเลือก)diff
เครื่องหมายปกติ--width=term-width
; ในทุบตีจะได้รับความกว้างเป็นหรือ$COLUMNS
tput cols
สิ่งนี้สามารถรวมอยู่ใน git-script ของผู้ช่วยเหลือได้เช่นกันเพื่อความสะดวกยิ่งขึ้นตัวอย่างเช่นการใช้งานเช่นนี้:
git diffy the/file/path --from rev1 --to rev2