2008-09-10 19 views
225

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

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

git-diff के लिए दस्तावेज़ इंगित करता है कि git diff A...Bgit diff $(git-merge-base A B) B के बराबर है। दूसरी तरफ, git-rev-parse के लिए प्रलेखन इंगित करता है कि r1...r2 को r1 r2 --not $(git merge-base --all r1 r2) के रूप में परिभाषित किया गया है।

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

तस्वीरों में, इस लगता है:

 
     x---y---z---branch 
     /
---a---b---c---d---e---HEAD 

मैं एक लॉग युक्त प्रतिबद्ध एक्स, वाई, जेड प्राप्त करना चाहते हैं।

  • git diff HEAD...branch इन प्रतिबद्ध
  • देता है तथापि, git log HEAD...branch देता एक्स, वाई, जेड, सी, डी, ई।
+0

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

उत्तर

161

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

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

+26

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

+20

'गिट डिफ हेड..ब्रैंच' 'गिट डिफ हेड शाखा' के समान है। यहां याद रखने की मुख्य बात यह है कि लॉग संशोधन की एक सूची/श्रेणी लेता है, जबकि diff नहीं करता है। यही कारण है कि वे अपने तर्कों का अलग-अलग व्यवहार करते हैं। –

60
git cherry branch [newbranch] 

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

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

git diff --name-status branch [newbranch] 

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

+0

आह, यह भी एक अच्छा है! –

+7

'गिट चेरी' प्रतिबद्ध आईडी की एक सूची आउटपुट करता है। क्या मैं इन्हें एक ही अंतर में परिवर्तित कर सकता हूं जो प्रत्येक प्रतिबद्धता में सभी परिवर्तनों को जोड़ता है? –

+1

'गिट चेरी' वास्तव में बहुत उपयोगी है। धन्यवाद :) – jkp

22

इस उत्तर मैं पर पोस्ट के समान है: Preview a Git push

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

  • gbout - Git शाखा निवर्तमान
  • gbin - Git शाखा आवक

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

  • तो मास्टर पर: gbin Branch1 < - इस क्या Branch1 में है तुम्हें दिखाता हूँ और नहीं मास्टर
  • गुरु पर अगर में: 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 
} 
4
git log --cherry-mark --oneline from_branch...to_branch 

(3dots) लेकिन कभी कभी यह पता चलता है '+' के बजाय '='

+0

3 डॉट्स से पता चलता पहले दो बार शाखा पर प्रतिबद्ध करता है, जबकि दो नहीं कस्टम शाखा नाम के साथ प्रतिस्थापित किया जाना चाहिए। –

30

क्या आप देखना चाहते हैं निवर्तमान प्रतिबद्ध की सूची है। मैं कहां से मान लेते हैं कि "BRANCHNAME" "मास्टर" का एक ट्रैकिंग शाखा के रूप में बनाया गया था तुम

git log master..branchName 

या

git log master..branchName --oneline 

का उपयोग कर ऐसा कर सकते हैं।

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

git log branchName..master 
+1

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

7

वहाँ में एक -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 
+0

मुझे सरल भयानक उर्फ ​​धन्यवाद पसंद है! –

2

मैं जब से तुम केवल संदेशों लेकिन पूरे diff प्रतिबद्ध नहीं मिलता है,

git diff <branch_with_changes> <branch_to_compare_to> 

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

git diff HEAD master 
6

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

git log master...

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

git log ...other-branch

8

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

जब पहले से ही सवाल

में शाखा में उपयोग करते हुए:

git diff master... 

कौन सा जोड़ती है कई विशेषताएं:

  • यह सुपर कम
  • वास्तविक परिवर्तन से पता चलता है

अद्यतन:

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

+0

यदि आपके पास 'गिट सह मास्टर है; pull' git जब से तुम शाखा, बनाया 'Git diff master' ज्यादा उपयोग मतभेद केवल निर्दिष्ट शाखा में प्रतिबद्ध द्वारा शुरू की प्राप्त करने के लिए नहीं किया जाएगा। – guival