Git का उपयोग करते हुए, वे सभी कमिट दिखाएं जो एक शाखा में हैं, लेकिन दूसरे नहीं हैं


464

मेरी एक पुरानी शाखा है, जिसे मैं हटाना चाहूंगा। हालाँकि, ऐसा करने से पहले, मैं यह जाँचना चाहता हूँ कि इस शाखा में किए गए सभी कमेंट किसी समय किसी अन्य शाखा में विलीन हो गए थे। इस प्रकार, मैं अपनी वर्तमान शाखा में किए गए सभी कमिट्स देखना चाहता हूं, जिन्हें किसी अन्य शाखा में लागू नहीं किया गया है [या, अगर यह कुछ स्क्रिप्टिंग के बिना संभव नहीं है, तो एक शाखा में सभी कमिट कैसे देखे जाते हैं जिन्हें लागू नहीं किया गया है किसी अन्य शाखा को?]।


दो शाखाओं के बीच गुम हुए कमिट्स को सूचीबद्ध करने के लिए आप तुलना कर सकते
Bernd Schubert

जवाबों:


320

आप शायद बस चाहते हैं

git branch --contains branch-to-delete

यह उन सभी शाखाओं को सूचीबद्ध करेगा, जिनमें "ब्रांच-टू-डिलीट" से कमिट हैं। यदि यह "ब्रांच-टू-डिलीट" से अधिक रिपोर्ट करता है, तो ब्रांच को मर्ज कर दिया गया है।

आपके विकल्प वास्तव में सिर्फ रि-लिस्ट सिंटैक्स चीजें हैं। उदाहरण के लिए git log one-branch..another-branchसब कुछ है कि सब कुछ है की one-branchजरूरत है दिखाता another-branchहै।

आपको यह git show-branchदेखने के तरीके के रूप में भी रुचि हो सकती है कि क्या है।


2
+1। यह भी देखें stackoverflow.com/questions/850607/...
VonC

1
लाइन 'यदि यह कुछ रिपोर्ट करती है, तो शाखा विलीन हो गई है' का गलत अर्थ लगाया जा सकता है: यदि git branch --contains some-branchकेवल रिटर्न देता है some-branch, तो यह कुछ लौटाता है, लेकिन इसे विलय नहीं किया गया है।
कंफ्यूजन

5
ध्यान दें कि git log foo..barबार के नवीनतम और फू के नवीनतम के बीच कमिट्स दिखाएंगे, लेकिन समय में आगे पीछे से गायब अन्य कॉमेट्स नहीं। बार में सब कुछ देखने के लिए लेकिन फू में नहीं, आपको @ जिमीमोर के घोल का उपयोग करना चाहिए।
पॉल ए जंगुविर्थ

555

यह देखने के लिए कि कौन सी शाखा में एक शाखा है, लेकिन दूसरी नहीं है, git log का उपयोग करें:

git log --no-merges oldbranch ^newbranch

... अर्थात्, पुरानेबर्च पर सभी कमिट्स के लिए कमिट लॉग दिखाएं जो कि न्यूब्रांच पर नहीं हैं । आप शामिल करने और बाहर करने के लिए कई शाखाओं को सूचीबद्ध कर सकते हैं, जैसे

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2

नोट: विंडोज ^पर एक एस्केप कुंजी है, इसलिए इसे दूसरे के साथ भागने की जरूरत है ^:

git log --no-merges oldbranch ^^newbranch

2
मैंने पाया कि यह दो शाखाओं के कमिट तुलना की तलाश में है।
उपयोगकर्ता

25
यही वह है जिसकी तलाश में मैं हूं। लेकिन, ^यहां एक उपसर्ग के रूप में उपयोग करना मुझे भ्रमित करता है। इस संदर्भ में इसका अर्थ है कि उस शाखा को बाहर करना। ^प्रत्यय के रूप में उपयोग करना उस शाखा की मूल प्रतिबद्धता के लिए एक सापेक्ष संदर्भ होगा।
जो फ्लिन

4
बहुत उपयोगी धन्यवाद। मैं उत्सुक हूं, - बे-मर्ज ध्वज आवश्यक क्यों है? निश्चित रूप से एक उन लोगों को भी देखना चाहता है?
मैक्स मैकलेओड

2
इसके साथ gitk का उपयोग करना चाहेंगे? बस उपयोग करें gitk oldbranch ^newbranch --no-merges(git 1.8.1.1 के साथ परीक्षण किया गया)। साइड नोट, मेरे लिए ^शाखा की समावेशी हेड का मतलब है newbranch
मैट

2
@NazariiGudzovatyi - हाँ, वहाँ है: "-केरी-पिक"। प्रलेखन पृष्ठ
15'15

91

पुराने क्रैंक में कमिट दिखाने के लिए लेकिन न्यूब्रांच में नहीं:

git log newbranch..oldbranch

इन कमिट द्वारा अंतर दिखाने के लिए (ध्यान दें कि तीन बिंदु हैं):

git diff newbranch...oldbranch

यहाँ एक आरेख उदाहरण के साथ डॉक है https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges


ऊपर पॉल ए जंगविर्थ की टिप्पणी देखें । ऐसा लगता है कि यह कुछ पुराने कमिट्स को याद करेगा?
दु: खद परिवर्तनशील

2
मुझे यकीन नहीं है कि पुराने कमेंट्स का क्या मतलब है। डबल डॉट्स मूल रूप से Git को कमिट की एक श्रेणी को हल करने के लिए कहता है जो एक कमिट से पहुंच योग्य है लेकिन दूसरे से उपलब्ध नहीं है। यहाँ एक डिक्ट्राम
Xuan

1
और यदि हम newbranchया तो या oldbranchहम क्रमशः git log ..oldbranchया तो कर git log newbranch..रहे हैं
याकोवएल

jimmyorr का समाधान मेरे लिए काम नहीं आया, लेकिन इसने ..refs के नामों के बीच दो बिंदुओं के लिए धन्यवाद दिया । मैंने उन --cherry-pickकमिट्स को छिपाने के विकल्प का भी उपयोग किया जो दोनों शाखाओं पर मौजूद हैं, लेकिन एक अलग हैश है क्योंकि उन्हें एक शाखा से दूसरी शाखा में चेरी-उठाया गया था।
दोषपूर्ण

58

उन लोगों के लिए जो अभी भी एक सरल उत्तर की तलाश में हैं, चेक चेरी की जाँच करें । यह प्रतिबद्ध हैश के बजाय वास्तविक भिन्नता की तुलना करता है। इसका मतलब यह है कि यह करता है कि चेरी उठाया या विद्रोह किया गया है समायोजित करता है।

सबसे पहले उस शाखा की जाँच करें जिसे आप हटाना चाहते हैं:

git checkout [branch-to-delete]

फिर इसे अपने मुख्य विकास शाखा से तुलना करने के लिए git चेरी का उपयोग करें:

git cherry -v master

उदाहरण आउटपुट:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message

नोट: -vध्वज को SHA हैश के साथ प्रतिबद्ध संदेश शामिल करना है।

सामने '+' वाली लाइनें शाखा-से-हटाने में हैं, लेकिन मास्टर शाखा नहीं। सामने वाले '-' वाले लोग मास्टर में बराबर कमिटमेंट रखते हैं।

केवल उन कामों के लिए जो मास्टर में नहीं हैं, चेरी पिक को grep के साथ संयोजित करें:

git cherry -v master | grep "^\+"

उदाहरण आउटपुट:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

मैंने यह कोशिश की है, लेकिन यह अभी भी रिपोर्ट करता है कि fb (फीचर शाखा) में कई कमिट हैं जो mb (मुख्य शाखा) में नहीं हैं। हालांकि, अगर मैं fb में हूं और एक git diff mb करता हूं, तो मुझे कोई अंतर नहीं दिखता है। मैंने रिबास का उपयोग किया और सब कुछ स्क्वैश किया। मैं लगभग निश्चित हूं कि ऐसा क्यों है, लेकिन मैं अभी निश्चित होना चाहता हूं। यदि यह मामला है, तो मैं संभव नहीं होने पर स्क्वैश से बचने जा रहा हूं; मैं "कोई खो जानकारी शिविर में नहीं हूँ।" मुझे आश्चर्य है कि क्या एक लॉग डिस्प्ले मोड जोड़ना संभव होगा जो मर्ज प्रदर्शित कर सकता है जैसे कि वे इतिहास को साफ रखने के लिए विद्रोही थे और अभी तक कोई जानकारी नहीं खोते हैं।
14is में आउटिस वॉन निमो

1
यहां अपने सटीक परिदृश्य के बारे में निश्चित नहीं है, लेकिन अगर आपने एक साथ कई कमिट्स को एक साथ स्क्वैश किया है और उसकी तुलना दूसरी ब्रांच से कर रहे हैं जहां कमिट अलग हैं, तो यह निश्चित रूप से काम नहीं करेगा। उस स्थिति में, आप diffविभिन्न फ़ाइलों की तुलना करने के लिए यूनिक्स उपयोगिता का उपयोग करना चाह सकते हैं । या, आप एक अस्थायी शाखा बना सकते हैं और इसमें सभी कमिट्स को स्क्वैश कर सकते हैं, जैसा कि आपने मूल शाखा के साथ किया था, और फिर इसका उपयोग करें, जो मुझे लगता है कि काम करेगा।
टिम एस

50

हालांकि यहां पोस्ट किए गए कुछ उत्तर आपको जो ढूंढने में मदद करेंगे, वे निम्नलिखित हैं- git शाखा का उप-कमांड आपके कार्य के लिए अधिक उपयुक्त समाधान है।

- जलमग्न का उपयोग उन सभी शाखाओं को खोजने के लिए किया जाता है जिन्हें सुरक्षित रूप से हटाया जा सकता है, क्योंकि वे शाखाएं पूरी तरह से HEAD द्वारा निहित हैं।

हालांकि masterएक में शाखाओं को सुरक्षित रूप से हटाने के लिए शाखाओं की गणना करने के लिए कमांड चला सकता है, जैसे:

git branch --merged
  develop
  fpg_download_links
* master
  master_merge_static

# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static

# There is also a flag to specify remote branches in the output
git branch --remotes --merged

16

jimmyorr का जवाब विंडोज पर काम नहीं करता है। यह ऐसा करने के --notबजाय उपयोग करने में मदद करता है ^:

git log oldbranch --not newbranch --no-merges

4
यह सही है, +1। ध्यान दें कि यद्यपि ^Windows पर समर्थित है, लेकिन जरूरत है भाग निकले जा करने के लिए है, जो, Windows में, (एक और) है ^: git log oldbranch ^^newbranch --no-merges
वॉन

3
विशिष्ट होने के लिए, यह विंडोज में पॉवर्सशेल कंसोल में काम करता है, लेकिन सीएमडी में अतिरिक्त "^" की आवश्यकता होती है।
रॉड

7

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

$ git checkout A
$ git branch -d B

git branch -d <branchname> सुरक्षा है कि "शाखा को पूरी तरह से हेड में विलय कर दिया जाना चाहिए।"

सावधानी : यह वास्तव में शाखा B को हटा देता है यदि इसे A में मिला दिया जाए।


3

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

#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
#   git branch-notmerge <branchname>
#
# Setup git alias
#   git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')

आप टूल git-wtf का भी उपयोग कर सकते हैं जो शाखाओं की स्थिति प्रदर्शित करेगा


0

उदाहरण के लिए git cherryशाखा में सभी कमिट्स को चुनने के लिए उपयोग करें newFeature42:

git चेरी -v मास्टर newFeature42


-5

आपके द्वारा उपयोग की जा रही git होस्टिंग सेवा के माध्यम से पुल अनुरोध बनाने के लिए प्रारंभ करें । यदि शाखा को पूरी तरह से आधार शाखा में मिला दिया गया है, तो आप नए पीआर बनाने में असमर्थ होंगे।

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

उदाहरण के लिए, GitHub पर:

तुलना करने के लिए कुछ भी नहीं है

मर्ज की गई शाखाओं के लिए PR नहीं बना सकते।

यह कमांड लाइन पर गिट का उपयोग नहीं करता है, लेकिन मुझे अक्सर यह पता चलता है कि एक अन्य आर्कन गिट कमांड को याद रखने के प्रयास के बजाय एक स्पष्ट मानसिक मॉडल के साथ अपने निपटान में अन्य उपकरणों का उपयोग करना सहायक है।

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