मैं अपने पसंदीदा भिन्न उपकरण / दर्शक के साथ 'git diff' आउटपुट कैसे देख सकता हूँ?


754

जब मैं टाइप करता हूं git diff, तो मैं अपने विजुअल डिफरेंस टूल ऑफ ऑप्‍शन (SourceGear "विन्डोज़ ऑन विंडोज") के साथ आउटपुट देखना चाहता हूं। मैं इसे करने के लिए git को कैसे कॉन्फ़िगर करूं?


108
आप git के सभी नए संस्करणों में "git diff" के बजाय "git difftool" का उपयोग कर सकते हैं। यह एक दृश्य अंतर कार्यक्रम खोलेगा।
प्लेगहेममेर

नई स्क्रिप्ट के विभिन्न पहलुओं के बारे में, मैंने नीचे एक उत्तर जोड़ा है: stackoverflow.com/questions/255202/…
VONC

2
gitx - gitx.frim.nl । निफ ने कहा।
एलेक्स ग्रांडे

1
संक्षिप्त ट्यूटोरियल आपको यहाँ मिलेगा: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
दिमित्री

5
गिट बैश में अपने भंडार पर जाएं। टाइप करें git config diff.tool winmerge। यह सत्यापित करें कि यह टाइप करके काम किया है git difftool। शीघ्र टाइपिंग से छुटकारा पाएं git config --global difftool.prompt false। मैं winmerge के बजाय p4merge की सलाह देता हूं।
माइकल एस।

जवाबों:


386

Git1.6.3 के बाद से, आप git difftool स्क्रिप्ट का उपयोग कर सकते हैं : नीचे मेरा उत्तर देखें


हो सकता है यह लेख आपकी मदद करे। यहाँ सबसे अच्छे हिस्से हैं:

बाहरी अंतर टूल को निर्दिष्ट करने के दो अलग-अलग तरीके हैं।

GIT_EXTERNAL_DIFF चर सेट करके, आपके द्वारा उपयोग की जाने वाली विधि पहली है। हालाँकि, चर निष्पादन योग्य के पूर्ण पथ को इंगित करने वाला है। इसके अलावा, GIT_EXTERNAL_DIFF द्वारा निर्दिष्ट निष्पादन योग्य 7 तर्कों के एक निश्चित सेट के साथ कहा जाएगा:

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

जैसा कि अधिकांश भिन्न उपकरणों को तर्कों के लिए एक अलग क्रम (और केवल कुछ) की आवश्यकता होगी, आपको इसके बजाय एक रैपर स्क्रिप्ट को निर्दिष्ट करना होगा, जो बदले में वास्तविक भिन्न उपकरण को कॉल करता है।

दूसरी विधि, जो मुझे पसंद है, बाहरी अंतर उपकरण को "गिट कॉन्फ़िगरेशन" के माध्यम से कॉन्फ़िगर करना है । मैंने जो किया था यह रहा:

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

जैसा कि आप देख सकते हैं, केवल दूसरे ("पुरानी-फाइल") और पांचवें ("नई-फाइल") तर्क को अलग टूल में पास किया जाएगा।

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

रैपर स्क्रिप्ट और डिफरेंट टूल के रास्तों को निर्दिष्ट करने के लिए सही सिंटैक्स का उपयोग करना सुनिश्चित करें, अर्थात बैकलैश के स्थान पर आगे स्लैस्ड का उपयोग करें। मेरे मामले में, मेरे पास है

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

में, .itconfig और

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

आवरण लिपि में। "बिल्ली" अनुगामी मन!

(मुझे लगता है कि ' | cat' की आवश्यकता केवल कुछ कार्यक्रमों के लिए है जो उचित या सुसंगत रिटर्न स्टेटस नहीं लौटा सकते हैं। यदि आप अपने अलग-अलग टूल को स्पष्ट रिटर्न स्टेटस दे सकते हैं तो आप पीछे चल रहे बिल्ली के बिना कोशिश करना चाह सकते हैं)

( डायोमिडिस स्पिनेलिस टिप्पणियों में जोड़ता है :

catआदेश की आवश्यकता है, क्योंकि diff(1), एक त्रुटि कोड के साथ डिफ़ॉल्ट रास्ते से यदि फ़ाइलें भिन्न होते हैं।
Git को बाहरी भिन्न प्रोग्राम से त्रुटि कोड के साथ बाहर निकलने की उम्मीद है, यदि वास्तविक त्रुटि हुई, जैसे कि यह मेमोरी से बाहर चला जाए।
के उत्पादन में पाइप के द्वारा gitकरने के लिए catगैर शून्य त्रुटि कोड छिपा होता है।
अधिक कुशलता से, कार्यक्रम केवल exit0. के तर्क और तर्क के साथ चल सकता है।


वह (ऊपर उद्धृत लेख) बाहरी फ़ाइल के माध्यम से परिभाषित बाहरी उपकरण के लिए सिद्धांत है (पर्यावरण चर के माध्यम से नहीं)।
व्यवहार में (अभी भी बाहरी टूल की कॉन्फिग फाइल परिभाषा के लिए), आप निम्न का उल्लेख कर सकते हैं:


1
आह, मैं बाहरी अंतर कार्यक्रम सेट करूँगा, लेकिन 7 तर्कों के बारे में नहीं जानता था, धन्यवाद।
user3891

4
कुदोस ... यह बहुत आसान है। मैंने इसे "ओपेंडिफ़" के साथ स्थापित किया (जो मैक ओएस एक्स के तहत स्लिक एक्सकोड फाइलमैर उपयोगिता को लॉन्च करता है)।
रयान डेलुची

@Ryan: यह बहुत अच्छा है :) क्या आपने इस उत्तर में विस्तृत "diff.external" सेटिंग का उपयोग किया है या नीचे मेरे दूसरे उत्तर के "git difftool"?
वॉन

बहुत खुबस! धन्यवाद, दोनों डिफार्मा और ओपेंडीफ की कोशिश की; दोनों काफी अच्छी तरह से काम करते हैं।
vfilby

2
तो git एक विस्तृत कार्यक्रम के लिए 7 तर्क भेजता है? जितना मैं Git के बारे में सीखता हूं, उतना ही मुझे लगता है कि यह एक व्यक्ति के लिए बनाया गया था: मूल प्रोग्रामर। यह DVcs एक चमकदार खिलौने की तरह लगता है जो बहुत कुछ नहीं करता है।
सी जॉनसन

211

ऊपर मेरे पिछले "diff.external" कॉन्फिग उत्तर को पूरा करने के लिए :

जैसा कि जैकब ने उल्लेख किया है , Git1.6.3 ने गिट स्पेसफूल को पेश किया, जिसे मूल रूप से सितंबर 2008 में प्रस्तावित किया गया था:

उपयोग = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
( --extcmdइस उत्तर के अंतिम भाग में देखें )

$LOCALआरंभिक संशोधन से फ़ाइल $REMOTEकी सामग्री समाहित है और इसमें अंतिम संशोधन में फ़ाइल की सामग्री शामिल है।
$BASEफ़ाइल में सामग्री की चिंता है

यह मूल git-mergetoolरूप से गिट इंडेक्स / वर्कट्री पर संचालित करने के लिए संशोधित है।

इस स्क्रिप्ट के लिए हमेशा की तरह उपयोग के मामले जब आप या तो मंचन या unstaged परिवर्तन और आप (उदाहरण के लिए एक साइड-बाई-साइड diff व्यूअर में परिवर्तन देखना चाहते हैं है xxdiff, tkdiff, आदि)।

git difftool [<filename>*]

एक अन्य उपयोग मामला तब है जब आप एक ही जानकारी देखना चाहते हैं, लेकिन मनमाने तरीके से तुलना कर रहे हैं (यह वह हिस्सा है, जहां रिवर्ज पार्सिंग बेहतर हो सकती है)

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

अंतिम उपयोग मामला तब है जब आप अपने वर्तमान कार्यस्थल की तुलना HEAD के अलावा किसी अन्य चीज़ से करना चाहते हैं (जैसे एक टैग)

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

नोट: Git 2.5 के बाद से, git config diff.tool winmergeपर्याप्त है!
" गिट मेरिजेट विनमर " देखें

और Git 1.7.11 के बाद से , आपके पास विकल्प होता है --dir-diff, बाहरी अंतर टूल को स्पॉन करने के लिए, जो दो अस्थायी निर्देशिकाओं को पॉप्युलेट करने के बाद एक समय में दो डायरेक्टरी पदानुक्रमों की तुलना कर सकता है, बजाय एक फाइल पेयर के प्रति बाहरी टूल के इंस्टेंस को चलाने के।


Git 2.5 से पहले:

difftoolअपने कस्टम भिन्न टूल से कॉन्फ़िगर करने का व्यावहारिक मामला :

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कॉन्फ़िगर के साथ टूल स्विच कर सकते हैं ।

अन्य विवरण जोड़ने के लिए आपके पास डेव द्वारा यह ब्लॉग प्रविष्टि भी है ।
(या विकल्पों के लिए यह सवालwinmergeu )

इस सेटिंग के साथ रुचि winmerge.shस्क्रिप्ट है : आप इसे विशेष मामलों को ध्यान में रखते हुए अनुकूलित कर सकते हैं।

उदाहरण के लिए देखें डेविड मार्बल का जवाब एक उदाहरण के लिए नीचे दिया गया है , जो इससे संबंधित है:

  • मूल या गंतव्य में नई फाइलें
  • मूल या गंतव्य में फ़ाइलों को हटा दिया

जैसा कि केम मेसन अपने जवाब में उल्लेख करते हैं , आप विकल्प का उपयोग करके किसी भी आवरण से बच--extcmd सकते हैं :

--extcmd=<command>

अलग-अलग देखने के लिए एक कस्टम कमांड निर्दिष्ट करें। git-difftoolकॉन्फ़िगर किए गए डिफॉल्ट को अनदेखा करता है और $command $LOCAL $REMOTEजब यह विकल्प निर्दिष्ट किया जाता है तो चलता है।

उदाहरण के लिए, यह gitkकिसी भी diffउपकरण को चलाने / उपयोग करने में सक्षम है


11
मुझे $ $ बचना था, $ LOCAL और $ REMOTE के लिए "उन्हें" और "" बनने से रोकने के लिए। मैं git config --globla difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" \ "$ REMOTE \" कहने के लिए संपादन करूंगा
कार्लोस रेंडन

इसके अलावा, इस योजना में काम करने के लिए -s विकल्प (एक विंडरज विंडो में कई अलग-अलग खुले) कैसे प्राप्त करें?
कार्लोस रेंडन

1
@Carlos: फ्रैंक (ऊपर टिप्पणी देखें) आप चाहते थे कि आप stackoverflow.com/questions/1220309/… (एक विंडमेर विंडो में कई अलग-अलग खोलने के लिए) देखें
VonC

1
--start=और --end=विकल्पों v1.7.11 में मान्यता प्राप्त नहीं हैं
माइकल

1
@SteveChambers हां, मैंने इसका उल्लेख stackoverflow.com/a/10879804/6309 में किया है । मैं इस उत्तर को संपादित करूंगा।
वॉनसी

110

उन सवालों के जवाब देने की भावना में, जो पूछे जाने से कुछ अलग हैं। इस समाधान का प्रयास करें:

$ meld my_project_using_git

मेल्ड गिट को समझता है और हाल के परिवर्तनों के आसपास नेविगेटिंग प्रदान करता है।


17
यह महान, टाइप करने के लिए बहुत आसान meld .है git difftoolऔर क्रमिक रूप से परिवर्तित फ़ाइलों को देखना है। और यह Mercurial के hg vdiffप्लगइन के बहुत करीब है ।
टॉम

6
इसके अलावा, meld .मर्क्यूरियल और तोड़फोड़ परियोजनाओं पर भी काम करता है, अगर किसी को उत्सुकता हो।
टॉम

हम्म, जब मैं यह संशोधित फ़ाइलों की एक सूची दिखाता है। जब मैं उनमें से एक पर क्लिक करता हूं या 'तुलना' करता हूं तो यह एक अलग टैब में अकेला खुलता है। मुझे एक अंतर कैसे मिलेगा?
misiu_mp

@misiu_mp, मैंने अभी इसकी कोशिश की, संशोधित फ़ाइलों पर क्लिक करने पर, यह अंतर (पुरानी फ़ाइल के साथ-साथ संशोधित फ़ाइल) दिखाता है।
db42

यह किस संस्करण में जोड़ा गया था? यह मेल्ड वर्जन के साथ काम नहीं करता है 1.1.5
मार्क बूथ

41

नए git difftool के साथ , इसे अपनी .gitconfig फ़ाइल में जोड़ने के रूप में सरल है :

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

वैकल्पिक रूप से, यह भी जोड़ें:

[difftool]
    prompt = false

इसके अलावा विभिन्न पहलुओं की जाँच करें , मैंने एक सरल स्क्रिप्ट लिखी है जो धारावाहिक में प्रत्येक को खोलने के लिए कष्टप्रद (IMO) डिफ़ॉल्ट भिन्न व्यवहार को बढ़ाती है।

Windows पर वैश्विक .gitconfig है %USERPROFILE%\.gitconfig


1
$ स्थानीय क्या है और $ दूरस्थ क्या है?
C जॉनसन

3
+1 ऐसी विधि के लिए जिसे रैपर स्क्रिप्ट की आवश्यकता नहीं होती है
जवलेट

@CJohnson: मूल फ़ाइल में पथ और संपादित फ़ाइल के लिए पथ, क्रमशः।
5

यदि ब्लॉग-लिंक की मृत्यु हो जाती है, तो यहां से जुड़ा हुआ एसओ उत्तर है: stackoverflow.com/a/1291578/321973
टोबीस किंज़्लर

1
@CJohnson: $ LOCAL हमेशा नवीनतम प्रतिबद्धता है। हालांकि $ REMOTE सुसंगत नहीं है। स्थानीय सैंडबॉक्स में परिवर्तनों को देखते हुए, यह वर्तमान / संपादित फ़ाइल है, लेकिन जब ऐतिहासिक रूप से भिन्न होता है, तो यह माता-पिता की प्रतिबद्धता है। IOW सामान्य के लिए $ LOCAL = पुराना और $ REMOTE = नया है। ऐतिहासिक, $ LOCAL = नया और $ REMOTE = पुराना।
ग्रेंजर ०

40

चूँकि git संस्करण 1.6.3 में " git difftool " है, जिसे आप अपने पसंदीदा ग्राफिकल डिफ टूल का उपयोग करने के लिए कॉन्फ़िगर कर सकते हैं। वर्तमान में समर्थित आउट-ऑफ़-द-बॉक्स kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse और opendiff हैं ; यदि आप जिस उपकरण का उपयोग करना चाहते हैं, वह इस सूची में नहीं है, तो आप हमेशा difftool.<tool>.cmdकॉन्फ़िगरेशन विकल्प का उपयोग कर सकते हैं ।

"git difftool" समान विकल्पों को "git diff" के रूप में स्वीकार करता है।


1
अरैक्सिस मर्ज भी कॉन्फ़िगर किया गया है। araxis.com/merge/scm_integration.html
ManmegaMan

8
उदाहरण उपयोग:git difftool -t kdiff3 HEAD
एमनटन

24

मेरे पास इसके अलावा एक है। मैं नियमित रूप से एक अलग ऐप का उपयोग करना पसंद करता हूं जो डिफ़ॉल्ट टूल (जैसे केलीडोस्कोप) में से एक के माध्यम से समर्थित नहीं है

git difftool -t

मुझे यह भी पसंद है कि डिफॉल्ट diffसिर्फ रेगुलर कमांड लाइन हो, इसलिए GIT_EXTERNAL_DIFFवैरिएबल सेट करना एक विकल्प नहीं है।

आप diffइस आदेश के साथ एक मनमाना ऐप का उपयोग कर सकते हैं :

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

यह केवल आपके द्वारा निर्दिष्ट कमांड में 2 फाइलें पास करता है, इसलिए आपको संभवतः एक आवरण की भी आवश्यकता नहीं है।


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
बार्टोज़केपी

क्या आप इसे कई उपकरणों के लिए बना सकते हैं? और उन्हें फ़ाइल एक्सटेंशन द्वारा संबद्ध करें?
यसूर

12

विंडोज / एमएसआईएस गिट के लिए समाधान

उत्तरों को पढ़ने के बाद, मैंने एक सरल तरीका खोजा जिसमें केवल एक फ़ाइल को बदलना शामिल है।

  1. तर्क 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:। या टाइपिंग के माध्यम से शक्तियां git config --global diff.external gitdiff.bat

    उद्धरणों का उपयोग नहीं करना, या किसी भी पथ जानकारी को निर्दिष्ट करना महत्वपूर्ण है, अन्यथा यह काम नहीं करेगा। इसलिए gitdiff.bat को अपने रास्ते में होना चाहिए।

अब जब आप "git diff" टाइप करते हैं, तो यह आपके बाहरी अंतर दर्शक को आमंत्रित करेगा।


1
+1 (+10 यदि मैं कर सकता था।) यह वास्तव में सबसे सरल समाधान है। मैंने स्वीकार किए गए उत्तर के साथ घंटों तक संघर्ष किया, और आखिरकार छोड़ दिया (मेरी कुछ समस्याएं संभवतः पावरशेल के माध्यम से चलने से संबंधित थीं ...) हालांकि, मैंने पर्यावरण चर git config --global diff.external winmerge.cmdको स्थापित करने के बजाय उपयोग किया GIT_EXTERNAL_DIFF, और यह समान रूप से अच्छी तरह से काम करता है।
क्रिस्टोफर लेप्टे

इस समाधान के साथ मुद्दों की एक जोड़ी: 1. नई फ़ाइलों के लिए काम नहीं करता है। WinMerge ने मुझसे तुलना करने के लिए दूसरी फाइल दर्ज करने के लिए कहा। 2. अगली फ़ाइल की तुलना करने के लिए विंडो केवल वर्तमान WinMerge विंडो को बंद करने के बाद ही खुलती है, एक ही समय में सभी फ़ाइलों को देखने का कोई आसान तरीका नहीं है।
यीशु एच।

9

यदि आप साइबरविन के माध्यम से ऐसा कर रहे हैं, तो आपको साइबरपैथ का उपयोग करने की आवश्यकता हो सकती है :

$ 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" का उपयोग करना अब मेरे लिए काम नहीं कर रहा है, लेकिन अगर मैं इसके बजाय "परे" का उपयोग करता हूं, तो यह ठीक है।
इडबरी

9

कुछ अन्य बाहरी भिन्न उपकरणों को diffदेखने के बाद, मैंने पाया कि IntelliJ IDEA (और Android Studio) में दृश्य मेरे लिए सबसे अच्छा है।

चरण 1 - सेटअप IntelliJ IDEA कमांड लाइन से चलाया जाएगा

आप अपने diff उपकरण के रूप में IntelliJ विचार का उपयोग करना चाहते हैं तो सबसे पहले सेटअप IntelliJ विचार कमांड लाइन निर्देशों का पालन से चलाने के लिए चाहिए यहाँ :

MacOS या UNIX पर:

  1. सुनिश्चित करें कि IntelliJ IDEA चल रहा है।
  2. मुख्य मेनू पर, चुनें Tools | Create Command-line Launcher। लॉन्चर स्क्रिप्ट बनाएँ संवाद बॉक्स खुलता है, सुझाए गए पथ और लॉन्चर स्क्रिप्ट का नाम। आप डिफ़ॉल्ट स्वीकार कर सकते हैं, या अपना खुद का पथ निर्दिष्ट कर सकते हैं। जैसा कि आपको बाद में इसकी आवश्यकता होगी, इसे नोटिस करें। IntelliJ IDEA के बाहर, अपने पथ पर लॉन्चर स्क्रिप्ट का पथ और नाम जोड़ें।

विंडोज पर:

  1. पथ सिस्टम वातावरण चर में IntelliJ IDEA निष्पादन योग्य का स्थान निर्दिष्ट करें। इस स्थिति में, आप किसी भी निर्देशिका से IntelliJ IDEA निष्पादन योग्य और अन्य IntelliJ IDEA आदेशों को लागू करने में सक्षम होंगे।

चरण 2 - IntelliJ IDEA को मल्टिफुलटूल के रूप में उपयोग करने के लिए git कॉन्फ़िगर करें

इस ब्लॉग पोस्ट के निर्देशों का पालन करें :

दे घुमा के

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 config में निम्नलिखित जोड़ें:

[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

यह विंडोज 7 पर मेरे लिए काम करता है। मध्यस्थ श लिपियों की कोई आवश्यकता नहीं है

की सामग्री .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

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

क्या आपके पास भी kdiff3 को आपके मेरिजेट के रूप में परिभाषित किया गया है? मन अपने gitconfig के उस हिस्से को साझा करना यदि ऐसा है तो?
19

2
धन्यवाद। यह काफी मेरे लिए काम नहीं किया है, लेकिन यह काम किया जब मैं हटा दिया pathहै और उसे बदला cmdकरने के लिए"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
स्टीव मंडलों

7

उपरोक्त महान उत्तरों का संक्षिप्त सारांश:

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

फिर इसे टाइप करके (वैकल्पिक रूप से फ़ाइल का नाम निर्दिष्ट करते हुए):

git difftool

6

परिचय

संदर्भ के लिए मैं VonC के उत्तर पर अपनी विविधता को शामिल करना चाहूंगा। ध्यान रखें कि मैं संशोधित PATH के साथ Git (इस समय 1.6.0.2) के MSys संस्करण का उपयोग कर रहा हूं, और Powershell (या cmd.exe) से ही Git चला रहा हूं, न कि बैश शेल।

मैं एक नया आदेश पेश किया, gitdiff। इस आदेश को चलाने git diffसे आपकी पसंद के दृश्य भिन्न कार्यक्रम का उपयोग करने के लिए अस्थायी रूप से पुनर्निर्देशित होता है (जैसा कि VonC के समाधान के विपरीत है जो इसे स्थायी रूप से करता है)। यह मुझे दोनों डिफ़ॉल्ट गिट भिन्न कार्यक्षमता ( git diff) के साथ-साथ दृश्य भिन्न कार्यक्षमता ( gitdiff) की अनुमति देता है। दोनों कमांड एक ही पैरामीटर लेते हैं, इसलिए उदाहरण के लिए किसी विशेष फ़ाइल में परिवर्तन के लिए आप टाइप कर सकते हैं

gitdiff path/file.txt

सेट अप

ध्यान दें कि $GitInstallनिर्देशिका के लिए एक प्लेसहोल्डर के रूप में उपयोग किया जाता है जहां गिट स्थापित है।

  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]अपनी पसंद के अलग कार्यक्रम के लिए पूरे रास्ते के साथ प्लेसहोल्डर की जगह )

    @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. अब तुम हो गए। gitdiffGit रिपॉजिटरी के भीतर से चल रहा है जो अब बदले गए हर फ़ाइल के लिए आपके दृश्य अंतर प्रोग्राम को लागू करना चाहिए।


6

यहां एक बैच फ़ाइल है जो विंडोज के लिए काम करती है - डिफॉल्ट स्थान में स्थापित डिफगरेज को मानती है, x64 को हैंडल करती है, बैकस्लैश रिप्लेसमेंट के लिए जरूरी के रूप में हैंडल करती है और खुद को इंस्टॉल करने की क्षमता रखती है। DiffMerge को अपने पसंदीदा प्रोग्राम के साथ बदलना आसान होना चाहिए।

स्थापित करने के लिए:

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

महान स्क्रिप्ट, इसने मुझे डिफमेर कमांड्स को देखने की परेशानी से बचा लिया। आप उद्धरण का उपयोग करने के लिए इंस्टॉल लाइन को संशोधित करना चाह सकते हैं - मुझे मेरी मशीन पर परेशानी थी: "% 1" == "- इंस्टॉल करें"।
मारियो

6

यदि आप Mac पर हैं और XCode है, तो आपके पास FileMerge इंस्टॉल है। टर्मिनल कमांड opendiff है, इसलिए आप बस कर सकते हैंgit difftool -t opendiff


2
कष्टप्रद संकेतों से बचने के लिए -y विकल्प का उपयोग करें। दुर्भाग्य से, git तब तक इंतजार करेगा जब तक कि अगली बदला हुआ फ़ाइल पेश करने से पहले FileMerge क्विट न हो जाए। एक शॉट में एक निर्देशिका की तुलना करने के लिए -d विकल्प का उपयोग करें।
माइनर 49r

विकल्प -t को पूर्ण पथ की आवश्यकता प्रतीत होती है। शायद git difftool --extcmd = opendiff का उपयोग करना बेहतर है।
योजर

6

मेल्ड स्थापित करें

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

तो बस मेल (डिफ़ॉल्ट) का उपयोग करने के लिए एंटर दबाएं, यह ग्राफिक मोड को खोलेगा, मैजिक को सेव करेगा और मर्ज को हल करने वाले प्रेस को दबाएगा। बस इतना ही


5

1.6.3 से पहले git संस्करणों पर एक अलग टूल को कॉन्फ़िगर करने के तरीके के एक लिनक्स संस्करण के लिए (1.6.3 जोड़ा गया है कि यह एक शानदार संक्षिप्त ट्यूटोरियल है)

संक्षेप में:

चरण 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 

मेरे लिए git फ़ोल्डर में काम करता है। फैलाना स्थापित करने के लिए, कोई पोर्ट का उपयोग कर सकता है -

sudo port install diffuse

3

आप उपयोग कर सकते हैं git difftool

उदाहरण के लिए यदि आप है मिल जाएँगी , आप branchs संपादित कर सकते हैं 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 में है, तब तक इसे लॉन्च किया जाएगा।


यह सबसे सरल और तेज़ तरीका है।
ज़मीर फौज़ान

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

मैं ubuntu पर कोम्पर का उपयोग करता हूं:

sudo apt-get install kompare

दो शाखाओं की तुलना करने के लिए:

git difftool -t kompare <my_branch> master

1

मैं ~/.gitconfigलंबे समय से इस बिट का उपयोग कर रहा हूं :

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

के साथ git-meld:

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

लेकिन अब मैं हमेशा ग्राफिकल वातावरण में मेल्ड का उपयोग करके थक गया, और इस सेटअप के साथ सामान्य अंतर को लागू करने के लिए तुच्छ नहीं है, इसलिए मैंने इसे स्विच किया:

[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

यदि आपके पास पहले से ही एक अलग उपकरण है जो फ़ाइलपेट से जुड़ा हुआ है (कहते हैं, क्योंकि आपने TortoiseSVN स्थापित किया है जो एक अलग दर्शक के साथ आता है) आप बस git diffएक "अस्थायी" फ़ाइल के लिए नियमित आउटपुट को पाइप कर सकते हैं , तो बस उस फ़ाइल को जानने की आवश्यकता के बिना सीधे खोलें दर्शक के बारे में कुछ भी:

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

इसे वैश्विक उपनाम के रूप में सेट करना और भी बेहतर काम करता है: git what

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

0

यदि आप कमांड लाइन के लिए एक नहीं हैं, तो यदि आप कछुआ गिट स्थापित करते हैं, तो आप "डिफ बाद में" विकल्प के साथ एक कछुआ सबमेनू पाने के लिए एक फ़ाइल पर राइट क्लिक कर सकते हैं।

जब आप पहली फाइल पर इसे चुनते हैं तो आप दूसरी फाइल पर राइट क्लिक कर सकते हैं, tortoisegit submenu पर जाएं और "Diff with == yourfilehere ==" का चयन करें यह परिणाम के लिए tortoisegitmerge gui देगा।


0

आप xd http://github.com/jiqingtang/xd को आज़माना चाह सकते हैं , जो GIT / SVN के लिए GUI आवरण है। यह एक अलग उपकरण नहीं है। xdजब आप चलाना चाहते हैं तो आप चलाते हैं git diffया svn diffयह आपको फाइलों की एक सूची, एक पूर्वावलोकन विंडो दिखाएगा और आप अपनी पसंद के किसी भी अलग टूल को लॉन्च कर सकते हैं, जिसमें tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), मेल्ड शामिल हैं। फैलाना, कोम्पर और kdiff3। आप कोई भी कस्टम टूल भी चला सकते हैं।

दुर्भाग्य से उपकरण विंडोज का समर्थन नहीं करता है।

प्रकटीकरण : मैं इस उपकरण का लेखक हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.