जब मैं "git diff" टाइप करता हूं, तो मैं एक साइड-बाय-साइड अंतर देखना चाहता हूं, जैसे "diff -y" के साथ, या "kdiff3" जैसे इंटरैक्टिव डिफरेंशियल टूल में अंतर प्रदर्शित करना पसंद करता हूं। यह कैसे किया जा सकता है?
जब मैं "git diff" टाइप करता हूं, तो मैं एक साइड-बाय-साइड अंतर देखना चाहता हूं, जैसे "diff -y" के साथ, या "kdiff3" जैसे इंटरैक्टिव डिफरेंशियल टूल में अंतर प्रदर्शित करना पसंद करता हूं। यह कैसे किया जा सकता है?
जवाबों:
हालांकि Git में अंतर का आंतरिक कार्यान्वयन है, आप इसके बजाय एक बाहरी उपकरण सेट कर सकते हैं।
बाहरी भिन्न उपकरण को निर्दिष्ट करने के दो अलग-अलग तरीके हैं:
GIT_EXTERNAL_DIFF
और GIT_DIFF_OPTS
पर्यावरण चर सेट करना ।git config
यह सभी देखें:
git diff --help
ए करते समय git diff
, Git उपरोक्त पर्यावरण चर और इसकी .gitconfig
फ़ाइल की दोनों सेटिंग्स की जाँच करता है ।
डिफ़ॉल्ट रूप से, Git निम्नलिखित सात तर्कों को प्रोग्राम में बदल देता है:
path old-file old-hex old-mode new-file new-hex new-mode
आपको आमतौर पर केवल पुराने-फ़ाइल और नए-फ़ाइल मापदंडों की आवश्यकता होती है। बेशक सबसे अलग उपकरण केवल एक तर्क के रूप में दो फ़ाइल नाम लेते हैं। इसका मतलब है कि आपको एक छोटी आवरण-पटकथा लिखने की ज़रूरत है, जो उन तर्कों को लेती है जो गिट स्क्रिप्ट को प्रदान करता है, और उन्हें आपकी पसंद के बाहरी गिट प्रोग्राम पर हाथ करता है।
मान लीजिए कि आप अपनी आवरण-लिपि को नीचे रखते हैं ~/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
फिर आपको यह बताने की जरूरत है कि कैसे और कहां अपने कस्टम रेपर स्क्रिप्ट को ढूंढना है। आपके पास यह करने के लिए तीन विकल्प हैं: (मैं .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
ध्यान दें:
इसी तरह अपने कस्टम डिफ टूल को स्थापित करने के लिए, आप एक कस्टम मर्ज-टूल भी स्थापित कर सकते हैं, जो मर्ज को देखने में मदद करने के लिए दृश्य विलय उपकरण हो सकता है। (progit.org पेज देखें)
देखें: http://fredpalma.com/518/visual-diff-and-merge-tool/ और https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
meld
,?
meld
निर्देशिका को अलग करने के लिए संस्करण को कॉन्फ़िगर किया जा सकता है, जहां मैं यह चुन सकता हूं कि मैं किस फ़ाइल (ओं) के लिए अंतर देखना चाहता हूं? वर्तमान में यह meld
प्रत्येक फ़ाइल के लिए एक अलग कमांड चलाता है , और मुझे meld
अगली फ़ाइल देखने के लिए छोड़ना होगा । मैं नहीं बल्कि meld
मुझे बदले हुए फ़ाइलों की एक निर्देशिका सूची दिखाता हूँ जैसे यह व्यवहार करता है जब meld
मर्क्यूरियल से उपयोग किया जाता है।
के git difftool
बजाय का उपयोग करें git diff
। तुम कभी वापस नहीं जाओगे।
यहां एक और स्टैकओवरफ्लो का लिंक दिया गया है, जिसके बारे में बात करते हैं git difftool
: मैं अपने पसंदीदा डिफॉल्ट टूल / दर्शक के साथ 'git diff' आउटपुट कैसे देख सकता हूं?
के नए संस्करणों के लिए git
, difftool
कमांड कई बाहरी भिन्न उपकरणों का समर्थन करता है। उदाहरण के लिए vimdiff
ऑटो समर्थित है और कमांड लाइन से इसे खोला जा सकता है:
cd /path/to/git/repo
git difftool --tool=vimdiff
अन्य समर्थित बाहरी अंतर उपकरण 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.
। शायद न्यूनतम उत्तर के साथ अपडेट करें कि इस चीज़ को कैसे कॉन्फ़िगर किया जाए, ताकि यह टर्मिनल में साइड-बाय-साइड अलग-अलग दिखाई दे, यही ओपी ने पूछा है? जीयूआई उपकरण दूरस्थ सर्वर पर काफी बेकार हैं जहां आप ssh का उपयोग करके कनेक्ट करते हैं।
git difftool
के साथ vimdiff
हमेशा दो फ़ाइलों / बफ़र्स सही ढंग से नहीं खींचा गया है।
git difftool -y
tkdiff शीघ्र रोकने के लिए
git difftool
विंडोज और लिनक्स में मेल्ट करें : 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
आधुनिक गिट संस्करणों पर जाने का तरीका है।
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^
एक उदाहरण है कि आपको जो कुछ भी अलग करना है उसके साथ प्रतिस्थापित करना चाहिए।
मुझे यह समाधान यहां मिला जहां कुछ अन्य सुझाव भी हैं। हालाँकि, यह एक जवाब है ओपी का सवाल स्पष्ट और स्पष्ट रूप से।
तर्कों की व्याख्या के लिए आदमी 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 difftools पर कई लाभ प्रदान करता है tkdiff
कि यह आपको सिंटैक्स हाइलाइटिंग और छवि भिन्नता दिखा सकता है।
इसके बारे में यहाँ और पढ़ें ।
मैं कोलोर्डिफ़ का उपयोग करता हूं ।
Mac OS X पर, इसे स्थापित करें
$ sudo port install colordiff
लिनक्स पर संभवतः apt get install colordiff
या आपके डिस्ट्रो के आधार पर ऐसा कुछ होता है।
फिर:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
या एक उपनाम बनाएँ
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
तब आप इसका उपयोग कर सकते हैं
$ git diffy HEAD^ HEAD
मैंने इसे "डिफी" कहा है क्योंकि diff -y
यूनिक्स में साइड-बाय-साइड अंतर है। Colordiff भी रंग जोड़ता है, जो अच्छे हैं। विकल्प में -ydw
, y
साइड-बाय-साइड के लिए w
है, व्हाट्सएप को अनदेखा करने के लिए है, और d
न्यूनतम अंतर का उत्पादन करने के लिए है (आमतौर पर आपको बेहतर परिणाम के रूप में भिन्न होता है)
-y
को छोड़ने के लिए जोड़ें Launch 'colordiff' [Y/n]:
।
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
? यह नहीं होना चाहिए git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
?
यूनिक्स के लिए, बस git
और अंतर्निहित diff
: का संयोजन
git show HEAD:path/to/file | diff -y - path/to/file
बेशक, आप HEAD को किसी अन्य गिट संदर्भ के साथ बदल सकते हैं, और आप शायद अलग -W 170
कमांड जैसी कोई चीज जोड़ना चाहते हैं ।
यह मानता है कि आप अपनी निर्देशिका सामग्री की तुलना पिछले एक वचन से कर रहे हैं। दो आवागमन के बीच तुलना अधिक जटिल है। यदि आपका शेल है, bash
तो आप "प्रक्रिया प्रतिस्थापन" का उपयोग कर सकते हैं:
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
कहाँ REF1
और REF2
संदर्भ संदर्भ हैं - टैग, शाखाएँ या हैश।
मैं व्यक्तिगत रूप से वास्तव में 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
यह सवाल तब दिखाई दिया जब मैं अंतरों का पता लगाने के लिए गिट बिल्डिन का उपयोग करने के लिए तेजी से रास्ता खोज रहा था। मेरे समाधान मानदंड:
मुझे यह जवाब मिला रंग में रंगने के लिए।
लाइन के बजाय कंधे से कंधा मिलाकर अलग होने के लिए, मैंने निम्नलिखित मापदंडों के साथ इस प्रश्न पर 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 टेक्स्ट और java कोड दोनों की उचित तुलना करने में मदद मिली।
सारांश में, --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
इन पंक्तियों को संपादित करें ~ / .itconfig:
[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 के लिए पेजर ऑफ की आवश्यकता होती है, यह अनिवार्य रूप से वैसे भी पेजर है इसलिए यह ठीक है। इन सेटिंग्स की परवाह किए बिना Difftool काम करेगा।
शो उर्फ की जरूरत है क्योंकि गिट शो केवल तर्क के माध्यम से बाहरी अंतर उपकरण का समर्थन करता है।
अंतर बाह्य कमांड के अंत में '#' महत्वपूर्ण है। Git की भिन्न कमांड $ @ (सभी उपलब्ध भिन्न चर) को अलग-अलग कमांड में जोड़ देती है, लेकिन हम केवल दो फ़ाइल नाम चाहते हैं। इसलिए हम उन दोनों को स्पष्ट रूप से $ 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.
अब आपके पास git diff और difftool के माध्यम से अगल-बगल में अंतर है। और आपके पास पॉवर यूजर कस्टमाइज़ेशन के लिए cdiff python सोर्स कोड होना चाहिए।
यहाँ एक दृष्टिकोण है। यदि आप कम से पाइप करते हैं, तो xterm चौड़ाई 80 पर सेट हो जाती है, जो इतना गर्म नहीं है। लेकिन अगर आप कमांड के साथ आगे बढ़ते हैं, जैसे कि COLS = 210, तो आप अपने विस्तारित एक्सटरम का उपयोग कर सकते हैं।
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Intellij 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 diffy the/file/path --from rev1 --to rev2