अपने माता-पिता के साथ कमिट कैसे करें?


460

एक उपनाम या स्क्रिप्ट लिखने के अलावा, क्या किसी विशेष प्रतिबद्ध के लिए अंतर प्राप्त करने के लिए एक छोटी कमांड है?

git diff 15dc8^..15dc8

यदि आप केवल सिंगल कमिट आईडी देते हैं git diff 15dc8, तो यह अलग है कि हेड के खिलाफ प्रतिबद्ध है।


इस बारे में सबसे अच्छी बात यह होगी कि यह "git difftool" के साथ काम करेगा, जिसमें फ़र्क दिखाने के लिए उपकरणों का उपयोग किया जाएगा।
जूल

संदर्भ के लिए, इस अन्य प्रश्न का उत्तर बताता है कि आप उपरोक्त को सरल बनाने के लिए कैसे एक बाश-संचालित उपनाम स्थापित कर सकते हैं: stackoverflow.com/questions/3321492/…
निक

जवाबों:


641

का उपयोग करें git show $COMMIT। यह आपको कमिट के लिए लॉग संदेश दिखाएगा, और उस विशेष कमिट का अंतर।


45
बहुत बुरा यह difftool का उपयोग नहीं कर सकता :(
orp

1
@orip आप हमेशा GIT_EXTERNAL_DIFF को एक स्क्रिप्ट पर सेट कर सकते हैं जो आपके डिफ़ाल्टूल के समान काम करती है।
23

7
मैं JakubNarebski का जवाब पसंद करता हूं, क्योंकि वहां दिए गए कमिटमेंट एक्सप्रेशन कई संदर्भों में काम करेंगे: stackoverflow.com/a/449128/992887
RichVel

1
अगर वहाँ भिन्न नहीं दिखाया गया है, तो शायद कोई वास्तविक परिवर्तन नहीं हैं, जैसे कि एक मर्ज कमिट के लिए
डेविन जी रोडोड

6
@PTWithy: यह सवाल था, "क्या किसी विशेष प्रतिबद्ध के लिए अंतर प्राप्त करने के लिए एक छोटी कमांड है?", जो इस प्रश्न का उत्तर देता है।
मियादी

439

उपयोग:

git diff 15dc8^!

जैसा कि git-Rev-parse (1) manpage (या आधुनिक git grerevisions (7) manpage) में निम्नलिखित अंश में वर्णित है :

एक कमेटी के गठन के लिए दो अन्य आशुलिपि जो एक कमेटी द्वारा बनाई गई हैं और इसके माता-पिता मौजूद हैं। R1 ^ @ संकेतन का अर्थ है r1 के सभी माता-पिता। r1 ^! इसमें r1 शामिल है, लेकिन इसके सभी माता-पिता को शामिल नहीं किया गया है।

इसका मतलब यह है कि आप जीआईटी में 15dc8^!एक शॉर्टहैंड के रूप में उपयोग कर सकते हैं 15dc8^..15dc8जहां संशोधन की आवश्यकता होती है। के लिए diff आदेश git diff 15dc8^..15dc8के रूप में समझा जाता है git diff 15dc8^ 15dc8, जो (प्रतिबद्ध की मूल के बीच अंतर का मतलब है 15dc8^) और प्रतिबद्ध ( 15dc8)।

नोट : git-rev-parse(1)मैनपेज में विवरण संशोधन श्रेणियों के बारे में बात करता है , जहां इसे एक से अधिक माता-पिता के साथ मर्ज करने के लिए भी काम करने की आवश्यकता होती है। फिर r1^!" r1 --not r1^@" अर्थात " r1 ^r1^1 ^r1^2 ..." है


इसके अलावा, आप git show COMMITप्रतिबद्ध विवरण प्राप्त करने और कमिट के लिए अलग-अलग उपयोग कर सकते हैं । यदि आप केवल अंतर चाहते हैं, तो आप उपयोग कर सकते हैंgit diff-tree -p COMMIT


7
यह स्वीकृत उत्तर होना चाहिए, यह बहुत अधिक बकवास है। हालांकि, गिट-रेव-पार्स एक्सट्रैक्ट का अंतिम वाक्य बल्कि भ्रमित करने वाला है - ऐसा लगता है जैसे इसका मतलब है 'इस प्रतिबद्ध के माता-पिता से लेकर इस प्रतिबद्ध तक'।
रिचवेल

1
@ रीचेल: यह थोड़ा भ्रमित करने वाला है क्योंकि यह उस स्थिति का भी वर्णन करने की कोशिश करता है जहां प्रतिबद्ध एक से अधिक माता-पिता हैं (यह एक मर्ज कमिट है)। r1 ^! उम्मीद के मुताबिक काम करता है।
याकूब नारबस्की

@ JakubNar Jakbski: अच्छी बात है, हो सकता है कि आप एकल माता-पिता और बहु-माता-पिता मामलों की अपनी समझ को सारांशित करने के लिए अपने उत्तर को संपादित कर सकें - प्रत्येक पर अलग-अलग बयान समझने में आसान हो सकते हैं।
रिचवेल

1
@ JakubNar Jakbski: हाँ, बहुत बेहतर! मैं अब हर समय इस शॉर्टकट का उपयोग करता हूं - धन्यवाद।
रिचवेल

1
^!माता-पिता आशुलिपि संकेतन सामान्य प्रतिबद्ध के लिए difftool के साथ ठीक से काम करता है लेकिन diff मर्ज प्रतिबद्ध के लिए उलट है। ऐसा क्यों?
hIpPy

56

यदि आप जानते हैं कि कितनी दूर है, तो आप कुछ इस तरह की कोशिश कर सकते हैं:

# Current branch vs. parent
git diff HEAD^ HEAD

# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2

पहले के काम कुछ इस तरह से होते हैं:

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

ऐसे कई तरीके हैं जिनसे आप कमिट निर्दिष्ट कर सकते हैं:

# Great grandparent
git show HEAD~3

देखें जानकारी के लिए इस पेज


2
HEAD ^ 2 भव्य नहीं है, अगर HEAD ^ 1 डैडी है, तो HEAD ^ 2 माँ है। डैडी के डैडी के लिए HEAD ~ 2 का उपयोग करें।
बिनियन

11

जैसा कि @mipadi बताते हैं, आप उपयोग कर सकते हैं git show $COMMIT, लेकिन यह कुछ हेडर और प्रतिबद्ध संदेश भी दिखाता है। यदि आप एक सीधा अंतर चाहते हैं, तो उपयोग करें git show --pretty=format:%b $COMMIT

यह स्पष्ट रूप से बहुत छोटा हाथ नहीं है, इसलिए मैं इस उपनाम को अपने .गितकॉन्फिग में रख रहा हूं

    [alias]
      sd = show --pretty=format:%b

यह मुझे अलग दिखाने के लिए उपयोग git sd $COMMITकरने में सक्षम बनाता है ।


1
इस उपनाम में शामिल हो सकता है - रंग जो पढ़ना आसान बनाता है: sd = show --color --pretty = format:% b
RichVel

@ रीचवेल वास्तव में! बहुत अच्छी बात है। यदि आपके पास गिट में डिफ़ॉल्ट रूप से सक्षम रंग हैं, तो आपको इस स्विच की आवश्यकता नहीं होगी, हालांकि। यही मैं सामान्य रूप से करता हूं।
13ystein Steimler

5

यदि आप zsh का उपयोग कर रहे हैं और विकल्प सेट है, तो कई उल्लेखित उदाहरण (जैसे git diff 15dc8^!, या git diff 15dc8^..15dc8) काम नहीं करते हैं extendedglob। आप इसे निम्नलिखित तीन तरीकों में से एक द्वारा ठीक कर सकते हैं:

  1. unsetopt extendedglob (और / या इसे .zshrc से हटा दें)

  2. setopt NO_NOMATCH (और / या इसे .zshrc में सेट करें)

  3. बैकस्लैश के साथ हर बार कैरेट और बैंग से बचकर रहें, जैसे git diff 15dc8\^\!



2

उपर्युक्त पॉल का समाधान वह था जो मैं उम्मीद कर रहा था कि यह होगा।

$ git diff HEAD^1

इसके अलावा, यह उल्लिखित की तरह उपनाम जोड़ने के लिए उपयोगी है, यदि आप अपनी ~ / .gitconfig फ़ाइल के [alias] अनुभाग में निम्नलिखित डालते हैं तो आप सिर और पिछले के बीच अंतर देखने के लिए शॉर्ट-हैंड का उपयोग कर सकते हैं।

[alias]
    diff-last = diff HEAD^1

फिर $ git diff-last चलाने से आपको अपना परिणाम मिल जाएगा। ध्यान दें कि इसमें आपके द्वारा अभी भी किए गए परिवर्तनों के साथ-साथ कमिट के बीच का अंतर भी शामिल होगा । यदि आप उन परिवर्तनों को अनदेखा करना चाहते हैं जो आपने अभी तक नहीं किए हैं, तो आप HEAD की तुलना इसके माता-पिता से सीधे करने के लिए पर्याप्त उपयोग कर सकते हैं:

$ git diff HEAD^1 HEAD

0

उपनामों का उपयोग करता है, इसलिए आपके प्रश्न का ठीक-ठीक उत्तर नहीं देता है, लेकिन जो आप करना चाहते हैं उसे करने के लिए मुझे ये उपयोगी लगते हैं ...

alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"

alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.