2008-09-14 21 views
61

मैं, स्क्रिप्ट करना चाहते हैं अधिमानतः रेक में, एक भी आदेश में निम्न क्रियाएँ:आखिरी बार जब मैंने खींचा था, तो क्या बदल गया है इसके बारे में गिट डिफ उत्पन्न कैसे कर सकता हूं?

  1. अपने स्थानीय Git भंडार के संस्करण प्राप्त करें।
  2. गिट नवीनतम कोड खींचें।
  3. चरण # 1 में निकाले गए संस्करण से गिट भिन्नता जो अब मेरे स्थानीय भंडार में है।

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

उत्तर

70

आप इसे रेफस्पेक्स के साथ काफी आसानी से कर सकते हैं।

git pull origin 
git diff @{1}.. 

इससे आपको वर्तमान शाखा का एक अंतर मिलेगा क्योंकि यह पुल से पहले और बाद में अस्तित्व में था। ध्यान दें कि यदि पुल वास्तव में वर्तमान शाखा को अपडेट नहीं करता है, तो diff आपको गलत परिणाम देगा।

current=`git rev-parse HEAD` 
git pull origin 
git diff $current.. 

मैं व्यक्तिगत रूप से एक उपनाम है कि बस मुझे लॉग दिखाता है, (यानी नवीनतम करने के लिए सबसे पुराना) का उपयोग उलटे क्रम में, बिना मेरा आखिरी पुल के बाद से सभी करता है, विलीन हो जाती है: एक और विकल्प स्पष्ट रूप से वर्तमान संस्करण रिकॉर्ड करने के लिए है ।

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}.. 
+0

'गिट diff HEAD' भी काम करता है। (शायद 4 साल पहले यह नहीं था ...) – leemes

+1

@leemes: हम्म? 'गिट डिफ हेड' आपको दिखाएगा कि हेड और आपकी वर्तमान कामकाजी प्रति के बीच क्या बदल गया है। ऐसा नहीं है कि टेफ्लॉन टेड क्या पूछ रहा था। –

+0

क्षमा करें, मैंने सवाल को गलत समझा। आखिरी बार मैंने खींच लिया और यहां उतरने के बाद से मैं अपने बदलाव दिखाने के लिए एक कमांड की तलाश में था। 'गिट डिफ हेड' ने मुझे जो चाहिए था उसके लिए काम किया (कम से कम मुझे लगता है कि यह वही था जो मैं ढूंढ रहा था: डी) – leemes

10

यह how to get changes on a branch in git के बारे में पूछे जाने वाले प्रश्न के समान है। ध्यान दें कि दो बिंदु बनाम तीन बिंदुओं का उपयोग करते समय गिट diff बनाम गिट लॉग का व्यवहार असंगत रूप से अलग है। लेकिन, आपके आवेदन के लिए आप का उपयोग कर सकते हैं:

git fetch 
git diff ...origin 

उसके बाद, एक git pull अपने सिर में परिवर्तन मर्ज हो जाएंगे।

+0

मुझे उत्पत्ति को गिट-डिफ या गिट-रेव-पार्स के लिए विशेष कीवर्ड के रूप में परिभाषित नहीं किया जाता है। क्या आपका मतलब है कि मुझे हैश में चरण # 1 से मूल के मूल्य के रूप में प्लग करने की आवश्यकता है? यदि हां, तो मैं प्रोग्राम को उस मूल्य को कैसे निकाला जा सकता हूं? मैं सुविधा के लिए इन सभी चरणों को एक कमांड/स्क्रिप्ट में जोड़ना चाहता हूं। –

+2

ऐसा करने का एक और तरीका विशेष FETCH_HEAD हेड का उपयोग करना है, जो पिछले fetch के परिणाम को दर्शाता है। तो: "गिट fetch && git diff ... FETCH_HEAD"। –

+0

मुझे लगता है कि यह अधिक उचित प्रतिक्रिया है: 'गिट fetch' के बाद' गिट diff उत्पत्ति/branchname' खींचने से पहले अंतर की जांच करने का सबसे अच्छा तरीका है। –

12

Greg's रास्ता काम करना चाहिए (मुझे नहीं, अन्य ग्रेग: पी)। आपकी टिप्पणी के बारे में, मूल एक विन्यास चर है जो गिट द्वारा सेट किया जाता है जब आप अपनी स्थानीय मशीन पर केंद्रीय भंडार क्लोन करते हैं। अनिवार्य रूप से, एक गिट भंडार याद करता है कि यह कहां से आया था। हालांकि, यदि आप git-config का उपयोग करने की आवश्यकता है, तो आप इन चरों को मैन्युअल रूप से सेट कर सकते हैं।

git config remote.origin.url <url> 

जहां यूआरएल आपके केंद्रीय भंडार का दूरस्थ मार्ग है।

यहां एक उदाहरण बैच फ़ाइल है जो काम करना चाहिए (मैंने इसका परीक्षण नहीं किया है)।

@ECHO off 

:: Retrieve the changes, but don't merge them. 
git fetch 

:: Look at the new changes 
git diff ...origin 

:: Ask if you want to merge the new changes into HEAD 
set /p PULL=Do you wish to pull the changes? (Y/N) 
IF /I %PULL%==Y git pull 
+1

आमतौर पर आप गिट * रिमोट * के लिए यूआरएल बदलने के लिए 'गिट कॉन्फ़िगरेशन' के बजाय 'गीट रिमोट सेट-यूआरएल मूल ' का उपयोग करेंगे। क्या कोई अंतर है? मुझे नहीं पता, लेकिन ऐसा लगता है कि 'गिट रिमोट' नौकरी के लिए एक और उपयुक्त उपकरण है। –

+0

@ColinDBennett आप सही हैं, 'गिट रिमोट सेट-यूआरएल' इसे करने का अधिक उचित तरीका होगा। मैंने 'गिट कॉन्फ़िगरेशन 'का उपयोग किया क्योंकि' सेट-यूआरएल 'एक विकल्प नहीं था जब मैंने मूल रूप से यह लिखा था। – Greg

4

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

function parse_git_branch { 
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' 
} 
function gd2 { 
echo branch \($1\) has these commits and \($2\) does not 
git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local 
} 
function grin { 
git fetch origin master 
gd2 FETCH_HEAD $(parse_git_branch) 
} 
function grout { 
git fetch origin master 
gd2 $(parse_git_branch) FETCH_HEAD 
} 
+0

जीडी 2 क्या है? गिट diff करने के लिए कुछ प्रकार के उपनाम? – arved

+0

यह parse_git_branch के बाद उपरोक्त स्क्रिप्ट में परिभाषित एक बैश फ़ंक्शन है – Clintm