गिट में एक शाखा पर परिवर्तन कैसे प्राप्त करें


264

किसी शाखा पर कमिट का लॉग प्राप्त करने का सबसे अच्छा तरीका क्या है क्योंकि यह वर्तमान शाखा से शाखा में था? अब तक का मेरा समाधान है:

git log $(git merge-base HEAD branch)..branch

Git-diff के लिए प्रलेखन इंगित करता है कि git diff A...Bइसके बराबर है git diff $(git-merge-base A B) B। दूसरी ओर, गिट-रेव-पार्स के लिए प्रलेखन इंगित करता है कि r1...r2इसे परिभाषित किया गया है r1 r2 --not $(git merge-base --all r1 r2)

ये अलग क्यों हैं? ध्यान दें कि git diff HEAD...branchमुझे वह अंतर दिया जा सकता है जो मैं चाहता हूं, लेकिन संगत git लॉग कमांड मुझे जो चाहता है उससे अधिक देता है।

तस्वीरों में, मान लीजिए कि यह:

         एक्स --- y --- z --- शाखा
        /
--- एक --- ख --- ग --- घ --- ई --- HEAD

मैं एक लॉग प्राप्त करना चाहूंगा जिसमें x, y, z शामिल हों।

  • git diff HEAD...branch ये कमिट करता है
  • हालाँकि, git log HEAD...branchx, y, z, c, d, e देता है।

आप "git log" का उपयोग गलत तरीके से अपने उद्देश्यों के लिए कर रहे हैं जो मैं देख सकता हूं। मैंने नीचे अपना जवाब जोड़ दिया है।
प्लेगहैमर

जवाबों:


186

एक संशोधन सूची के संदर्भ में, A...Bइसे कैसे git-rev-parseपरिभाषित किया गया है। git-log एक संशोधन सूची लेता है। git-diffसंशोधन की सूची नहीं लेता है - यह एक या दो संशोधन लेता है, और A...Bवाक्यविन्यास को परिभाषित करने का मतलब यह है कि यह कैसे git-diffमेन्यू में परिभाषित किया गया है । यदि git-diffस्पष्ट रूप से परिभाषित नहीं किया गया है A...B, तो वह वाक्यविन्यास अमान्य होगा। ध्यान दें कि git-rev-parseमैनपेज का वर्णन हैA...B "स्पेसिफिक रेंज" अनुभाग में है, और उस खंड में सब कुछ केवल उन स्थितियों में मान्य है जहां एक संशोधन रेंज वैध है (जब एक संशोधन सूची वांछित है)।

केवल x, y और z वाले लॉग को प्राप्त करने के लिए, प्रयास करें git log HEAD..branch(दो डॉट्स, तीन नहीं)। यह git log branch --not HEADउस शाखा के समान है , और इसका मतलब है कि सभी शाखाएँ जो HEAD पर नहीं हैं।


31
वाह, यह भ्रामक है। यह पता चला है कि "git diff HEAD..branch" का उपयोग करने से सभी कमिट (x, y, z, c, d, e) का पता चलता है, लेकिन "git log HEAD..branch" वही करता है जो मैं चाहता हूं और केवल x, y दिखाता है , z! यह "..." का उपयोग करने का सटीक विपरीत है।
ग्रेग हेवगिल सेप

22
git diff HEAD..branchके समान है git diff HEAD branch। यहाँ याद रखने वाली महत्वपूर्ण बात यह है कि लॉग रिविज़न की एक सूची / श्रेणी लेता है, जबकि भिन्न नहीं है। इसलिए वे अपने आर्गन्स को अलग तरह से मानते हैं।
लिली बलार्ड

4
लगता है कि git diff HEAD...branch(तीन बिंदु) के उत्पादन से मेल खाती हैgit log HEAD..branch
jchook

72
git cherry branch [newbranch]

ठीक वही करता है जो आप पूछ रहे हैं, जब आप masterशाखा में होते हैं ।

मैं भी बहुत शौकीन हूं:

git diff --name-status branch [newbranch]

जो आप पूछ रहे हैं वह ठीक नहीं है, लेकिन अभी भी उसी संदर्भ में बहुत उपयोगी है।


8
'git cherry' प्रतिबद्ध ID की सूची का उत्पादन करता है। क्या मैं इन्हें हर बदलाव के सभी परिवर्तनों को मिलाकर एक एकल रूप में परिवर्तित कर सकता हूं?
जोनाथन हार्टले

1
git cherryवास्तव में बहुत उपयोगी है। धन्यवाद :)
jkp

2
@JonathanHartley कमिट आईडी की तरह पहला और आखिरी ले लो और उन्हें फेंक दिया gif-diff: git diff x..zया मेरे खुद के उदाहरण के लिए यह है git diff 13bc4d..8eda3a
टावी

3
यह समझने में कठिन है कि आपकी कमान में किस कोड को प्रतिस्थापित किया जाना चाहिए जिसमें एक शाखा या न्यूब्रांच एक कीवर्ड है और जिसे कस्टम शाखा के नाम से बदला जाना चाहिए
pal4life

37

आप जो देखना चाहते हैं वह आउटगोइंग कमिट्स की सूची है। आप इस का उपयोग कर सकते हैं

git log master..branchName 

या

git log master..branchName --oneline

जहाँ मैं मानता हूँ कि "ब्रांचनाम" ​​"मास्टर" की ट्रैकिंग शाखा के रूप में बनाया गया था।

इसी तरह, आने वाले परिवर्तनों को देखने के लिए आप उपयोग कर सकते हैं:

git log branchName..master

1
@ABB, अगर ब्रांचनेम को छोड़ दिया जाए, तो यह "हेड" के लिए डिफॉल्ट करता है, जो ऊपर दिए गए उदाहरण में प्रभावी रूप से ब्रांचनाम है।
प्लेगहैमर

25

यह मेरे द्वारा पोस्ट किए गए उत्तर के समान है: एक Git पुश का पूर्वावलोकन करें

इन कार्यों को अपने बैश प्रोफ़ाइल में छोड़ें:

  • gbout - गिट शाखा निवर्तमान
  • gbin - git ब्रांच इनकमिंग

आप इसका उपयोग कर सकते हैं जैसे:

  • यदि गुरु पर: gbin Branch1 <- यह आपको दिखाएगा कि शाखा 1 में क्या है और गुरु में नहीं
  • यदि मास्टर पर: gbout Branch1 <- यह आपको दिखाएगा कि मास्टर में क्या है जो शाखा 1 में नहीं है

यह किसी भी शाखा के साथ काम करेगा।

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

एलेक्स वी और एनडीविस जैसे कई उत्तरों के समान, लेकिन उनमें से कोई भी समान नहीं हैं।

जब पहले से ही शाखा में सवाल है

का उपयोग करते हुए:

git diff master...

जो कई विशेषताओं को जोड़ती है:

  • यह सुपर शॉर्ट है
  • वास्तविक बदलाव दिखाता है

अपडेट करें:

यह संभवतः होना चाहिए git diff master, लेकिन यह भी निर्दिष्ट दिखाता है, न कि निर्दिष्ट किए गए प्रश्न के रूप में करता है।


1
यदि आपने git co master; git pullशाखा बना ली है, git diff masterतो केवल निर्दिष्ट शाखा में कमिट द्वारा मतभेदों को लाने के लिए बहुत अधिक उपयोग नहीं किया जाएगा।
15

1
या शाखाओं को स्पष्ट रूप से निर्दिष्ट करने के लिए: git diff <branch1>...<branch2>द्वारा शुरू किए गए परिवर्तनों को दिखाएगा branch2
एलेक्स

10

कुछ FILE CHANGES देखने के लिए a -p को वहाँ फेंके

git log -p master..branch

कुछ उपनाम बनाएँ:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

एक शाखा का अनोखा दृश्य देखें:

gbl

6

मास्टर बंद करने के बाद से वर्तमान शाखा के लॉग को देखने के लिए:

git log master...

यदि आप वर्तमान में मास्टर पर हैं, तो एक अलग शाखा के लॉग को देखने के लिए क्योंकि यह मास्टर बंद है:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3 डी) लेकिन कभी-कभी यह '=' के बजाय '+' दिखाता है


3 डॉट्स शाखा पर पहली बार दो बार दिखाते हैं जबकि दो नहीं करते हैं।
TJ बिडल

2

मुझे मिला

git diff <branch_with_changes> <branch_to_compare_to>

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

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