Git-diff की तरह अलग-अलग काम कैसे करें?


148

मुझे आउटपुट स्वरूपण पसंद है git diff। जीएनयू अंतर की तुलना में लाइनों के बीच परिवर्तनों का रंग और +/ -प्रतिनिधित्व अधिक आसान है।

मैं एक git रेपो के बाहर ध्वज git diffका उपयोग करके चला सकता हूं --no-indexऔर यह ठीक काम करता है। हालाँकि, यह --excludeएक पुनरावर्ती से फ़ाइलों या उपनिर्देशिकाओं को बाहर करने के लिए विकल्प याद आ रहा है diff

क्या दोनों दुनिया में सबसे अच्छा पाने का एक तरीका है? ( जीएनयू के रंग विकल्प और +/ -प्रारूप git diffऔर --excludeविकल्प भिन्न होते हैं)।

मैंने प्रयोग किया है colordiff, लेकिन मैं अभी भी आउटपुट स्वरूप पसंद करता हूंgit diff


1
हरे अतिरिक्त, बदलाव के लिए नीले रंग बनाने के लिए newtextमें /etc/colordiff। मुझे लगता है कि गिट हरे का उपयोग करता है?
रुडी

1
मैंने अब तक कभी -नो-इंडेक्स फ्लैग के बारे में नहीं सुना था। मैंने इसे git शो से आउटपुट की तुलना दो फाइलों के अंतर से करने के लिए किया है - इसके लिए धन्यवाद!
एजेएम-रेनटेट-मोनिका

जवाबों:


175

मुझे नहीं पता कि रंग कैसे करना है लेकिन यह इसके +/-बजाय <और करेगा >

diff -u file1 file2

6
कूल, यह कोऑर्डिफ़ के साथ संयुक्त मुझे जो मैं चाहता हूं, उसके करीब हो जाता है। लगता है मुझे अगली बार मैन पेज को और नीचे स्क्रॉल करना होगा ... धन्यवाद!
मज्जिज्ज़

13
डिफ्यू -यू के साथ रंगीकरण प्राप्त करने का एक सरल तरीका, आउटपुट को tig में पाइप करना है, कमांडलाइन गिट रेपो दर्शक diff -u file1 file2 | tig:।
शमूएल लांपा

3
colordiffअपने apt / yum / pacman रिपॉजिटरी से इंस्टॉल करें और इसका उपयोग करें।
B जुग

अमेज़न लिनक्स पर एंटरप्राइज लिनक्स (EPEL) के लिए एक्स्ट्रा पैकेज को इनेबल करने के लिए ज़रूरी हैcolordiff : docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Pat Myron

1
इसके अलावा colordiff, आप vimपरिभाषित करके भी रंग प्राप्त कर सकते हैं cdiff() { diff -u $@ | vim -R -; }
सिरटिस मेजर

94

आप git diff --no-index -- A B( manpage के माध्यम से ) भी उपयोग कर सकते हैं ।


1
+1, लेकिन दुख की बात है कि यह काम नहीं करता है अगर फ़ाइलों में से एक एक सिमिलिंक है।
एमिल लुंडबर्ग

2
+1 यह बहुत उपयोगी है क्योंकि यह दिखाता है कि git रिपोर्ट कैसे बनाई जाए जहां दो ट्रैक की गई फाइलें Aऔर एक-दूसरे केB साथ तुलना में भिन्न हो , जहां प्रत्येक फ़ाइल को उनके अंतिम संबंधित संशोधन के सापेक्ष संशोधित किया गया हो।
जे। काट्ज़विंकेल

@EmilLundberg: लिनक्स पर 1.9.1 git में सिमलिंक के साथ मेरे लिए काम करता है। मुझे नहीं पता कि पहले के संस्करण टूटे हैं या नहीं।
किमी किमी

3
git diff --no-indexमहान है, लेकिन जैसा कि ओपी ने बताया, इसमें --excludeध्वज का अभाव है , इसलिए यह बहुत सीमित उपयोगिता का है।
केन विलियम्स

25
  1. Colordiff स्थापित करें ।

  2. अपने ~ / .colordiffrc (प्रतिलिपि / आदि / colordiffrc पहले अद्यतन करें, यदि आवश्यक हो):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. colordiff -u file1 file2दो फ़ाइलों के लिए या colordiff -ruN path1 path2पुनरावर्ती पथ की तुलना के लिए उपयोग करें ।

यह बिल्कुल समान नहीं है, लेकिन यह बहुत करीब है।


18

यह वही है जो मैं सुझाव देता हूं और यह बहुत करीब है

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: आपको इसे इंस्टॉल करना होगा
  • -R: यह कम कोड के बजाय रंग दिखाने के लिए कम बताता है।

मैंने अंततः उपयोग किया -wक्योंकि मैं व्हॉट्सएप को अलग नहीं देखना चाहता था।

diff -w -u FILE1 FILE2 | colordiff | less -R

संपादित करें: जैसा कि टिप्पणी में @Ciprian Tomoiaga द्वारा सुझाया गया है, आप इसे एक फ़ंक्शन बना सकते हैं और इसे अपनी ~/.bashrcफ़ाइल में भी डाल सकते हैं।

function gdiff () { diff -u $@ | colordiff | less -R; }

4
इसके लिए एक बश फ़ंक्शन को जोड़ने के लिए .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
सिप्रियन टॉमोयागै

4

यूनिक्स एसई पर इस उत्तर के अनुसार 2016 के अंत में संस्करण 3.4 के बाद से GNU diffका एक --colorविकल्प है । इसके साथ ही इसके उत्पादन की नकल करने के लिए पर्याप्त होना चाहिए :-ugit diff

diff -u --color=always file1 file2 | less -r

--coloralwaysपाइप में इस्तेमाल होने पर पाइप autoमें रंग बंद कर देना चाहिए ।

मैंने केवल विंडोज पर गिट बैश के साथ ऐसा करने की कोशिश की है, जहां less -Rकेवल हंक की पहली पंक्ति का रंग होगा। less -rयह मेरे लिए उस मामले में तय किया।


3

का उपयोग केवल bash, diff, tput, और less, हम निकट के उत्पादन का अनुमान लगा सकता git diff। कुछ उल्लेखनीय अंतर होंगे, हालांकि, diffप्रोग्रामर की अदूरदर्शिता के कारण ।

निम्नलिखित बैश फ़ंक्शन परिभाषा को कुछ फ़ाइल में रखें जो आपके उपयोगकर्ता खाते द्वारा स्वचालित रूप से खट्टी हो जाती है, और आप कमांड से फ़ंक्शन को एक्सेस करने में सक्षम होंगे:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

यह फ़ंक्शन निम्नानुसार काम करता है:

  1. अंततः, diffयह निर्दिष्ट करने के लिए विभिन्न स्वरूपण विकल्पों के साथ लागू किया जाता है कि फाइलों के भीतर कैसे परिवर्तन प्रदर्शित किए जाएंगे।
  2. tputउन फॉर्मेटिंग विकल्पों में ANSI रंग कोड डालने के लिए उपयोग किया जाता है। ध्यान दें कि गैर-एएनएसआई टर्मिनलों का उपयोग करते समय, आपको प्रतिस्थापित tput setafकरना पड़ सकता हैtput setf
  3. के आउटपुट में diffपाइप किया जाता है less-RANSI रंगों को संरक्षित करने की अनुमति देता है। बाहर निकलने पर स्क्रीन को साफ़ करने से -Xरोकता lessहै। -Fरोकता हैlessयदि आउटपुट एक स्क्रीन के भीतर फिट बैठता है, तो पेजर के रूप में काम करने से है।
  4. यदि पहला पैरामीटर है @full, तो फ़ंक्शन जोड़े और हटाए गए लाइनों के अलावा सभी अपरिवर्तित लाइनों को प्रदर्शित करेगा।

इस दृष्टिकोण और निम्नलिखित के बीच अंतर पर ध्यान दें git diff:

  1. git diffप्रत्येक परिवर्तन के आसपास संदर्भ की तीन पंक्तियों की रिपोर्ट करता है। दुर्भाग्य से, diffयदि आप एक साथ स्वरूपण विकल्पों को निर्दिष्ट करते हुए संदर्भ लाइनों की संख्या निर्दिष्ट करना चाहते हैं, तो शिकायत करना और बाहर निकलना प्रतीत होता है। (कम से कम यह मैक ओएस एक्स योसेमाइट में करता है)। धन्यवाद diffप्रोग्रामर। इसलिए, आप या तो प्रत्येक परिवर्तन के आसपास के संदर्भ की कोई रेखा नहीं मांग सकते हैं, जो कि डिफ़ॉल्ट व्यवहार है, या आप अनुरोध कर सकते हैं कि फ़ाइल के भीतर सभी अपरिवर्तित लाइनें भी @fullपहले पैरामीटर के रूप में निर्दिष्ट करके रिपोर्ट की गई हैं ।
  2. चूँकि संदर्भ की रेखाएँ भिन्न हैं git diff, इसलिए इस फ़ंक्शन द्वारा बताई गई पंक्ति संख्याएँ उनके द्वारा रिपोर्ट की गई से भिन्न भी होंगी git diff
  3. आपको रिपोर्ट की गई एकल-पंक्ति परिवर्तनों की उपस्थिति दिखाई दे सकती है, जो कि सही व्यवहार है, लेकिन जब आपकी परिवर्तित फ़ाइल में एकल रिक्त लाइनों का सम्मिलन होता है तो कष्टप्रद होता है। मुझे लगता है कि git diffइसके संदर्भ में, बेहतर तरीके से काम करता है। diffयदि आप चाहें तो व्हॉट्सएप के साथ बेहतर व्यवहार करने के लिए आप विभिन्न विकल्पों को पारित करने का प्रयास कर सकते हैं।


2

इसे अपने .bashrcया .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

requirments: gitऔरcolordiff हाथ से पहले स्थापित किया जाना चाहिए।

उपयोग: diff file1 file2

उदाहरण: $ के लिएdiff .tmux.conf .zshrc.pre-oh-my-zsh

अलग कार्य उदाहरण


0

दूसरा विकल्प रिपॉजिटरी के बाहर से करना है ताकि गिट फाइलों के बीच अंतर करना जानता हो। जैसे। एक शेल फ़ंक्शन कुछ इस तरह है:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

Colordiff का उपयोग करें :

स्थापना:

sudo apt-get install colordiff

उपयोग:

colordiff -u file_one file_two

द्वारा दिखाए गए अनुसार बिल्कुल अंतर देता है git diff


0

यदि आपके पास नहीं है colordiffया git diff, आप रंग प्राप्त कर सकते हैं vim

cdiff() { diff -u $@ | vim -R -; }

या केवल

cdiff() { diff -u $@ | view -; }

0

चूँकि बल्ले की रंगाई अच्छी होती है, इसलिए मैंने परीक्षण किया है, अगर वह diffभी काम करता है और आश्चर्यजनक रूप से यह वास्तव में अच्छी तरह से काम करता है।

$ diff file1 file2 | bat या $ diff -u file1 file2 | bat

तो मुझे लगता है कि आप इस तरह के एक समारोह के लिए और अधिक कुशल हो सकता है:

function bdiff () { diff -u $@ | bat;}

0

डेबियन 9 में परीक्षण किया गया diff -u --color=always file1 file2


-2

मुझे लगता है कि विन्यास सेटिंग:

[color]
     ui = true

"diff" कमांड के --relative=<path>विकल्प के साथ संयुक्त आप क्या चाहते थे। क्या आप ने कोशिश की ?


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