Git और "शाखा 'x' पूरी तरह से विलय नहीं हुआ है" त्रुटि


294

यहाँ मैं मास्टर शाखा से उपयोग किए गए कमांड हैं

git branch experiment
git checkout experiment

फिर मैंने अपनी फ़ाइलों में कुछ बदलाव किए, बदलाव किए और नई शाखा को GitHub में धकेल दिया।

git commit . -m 'changed files'
git push -u origin experiment

बाद में मैंने अपनी प्रयोग शाखा को मास्टर शाखा में विलय करने का निर्णय लिया।

git checkout master
git merge experiment

अंत में मैंने गिटहब में बदलावों को आगे बढ़ाया।

git push -u origin master

जब तक मैंने अपनी प्रयोग शाखा को हटाने का प्रयास नहीं किया, तब तक सब ठीक रहा

git branch -d experiment

मुझे त्रुटि संदेश मिला है कि error: The branch 'experiment' is not fully merged.मैं थोड़ा नया हूं, और मुझे नहीं पता कि मैं संभवतः दो शाखाओं को कैसे मिला सकता हूं। मुझे यहां क्या समझ नहीं आ रहा है?


2
क्या यह पोस्ट आपकी मदद करती है? stackoverflow.com/questions/1710894/…
क्रिसडिजिटल

2
यह कभी-कभी तब होता है जब मैंने git commit --amend
Arcolye

12
इसके अलावा - ध्यान रखें कि यह संदेश एक के बाद दिखाई देगा squash: stackoverflow.com/q/41946475/109941
जिम जी।

मुझे लगता है कि सबसे आम परिदृश्य यह है, आपको स्थानीय स्तर पर शाखा को हटाने से पहले बस अपने नए विलय से बदलाव करना होगा।
RaisinBranCrunch

जवाबों:


313

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

व्यवहार में इसका मतलब है कि आप संभवत: संशोधित, विद्रोहित या फ़िल्टर किए गए हैं और वे समान नहीं लगते हैं।

इसलिए आप उस शाखा की जाँच करके चेतावनी से बच सकते हैं जिसमें वह कमिट हैं जो उस अन्य शाखा को हटाकर संयुक्त राष्ट्र के संदर्भ में हैं। warning

आप यह सत्यापित करना चाहेंगे कि आप वास्तव में कोई महत्वपूर्ण कमी नहीं कर रहे हैं:

git log --graph --left-right --cherry-pick --oneline master...experiment

यह आपको शाखाओं के बीच किसी भी निरर्थक की सूची देगा। यदि आप उत्सुक हैं, तो बिना अंतर हो सकता है --cherry-pickऔर यह अंतर आपको मिलने वाली चेतावनी का कारण हो सकता है:

--cherry-pick

ओटिट किसी भी ऐसे कमिटमेंट को पेश करता है जो "दूसरे पक्ष" पर एक और बदलाव करता है, जब कमिट्स का सेट सममित अंतर के साथ सीमित होता है। उदाहरण के लिए, यदि आपके पास दो शाखाएँ हैं, तो A और B, सभी को सूचीबद्ध करने का एक सामान्य तरीका उनमें से केवल एक तरफ है-left-right, उस विकल्प के विवरण में ऊपर दिए गए उदाहरण की तरह। हालांकि यह उन कमिटों को दिखाता है जो दूसरी शाखा से चेरी-पिक किए गए थे (उदाहरण के लिए, "3 ऑन बी" चेरी-ब्रांच ए से लिया जा सकता है)। इस विकल्प के साथ, इस तरह के जोड़े को आउटपुट से बाहर रखा गया है।


¹ वे डिफ़ॉल्ट रूप से थोड़ी देर के बाद केवल कचरा एकत्र करते हैं। साथ ही, git-branchआदेश सभी शाखाओं के संशोधन पेड़ की जांच नहीं करता है । स्पष्ट गलतियों से बचने के लिए चेतावनी है।

Here (यहां मेरी प्राथमिकता केवल विलोपन के लिए बाध्य करना है, लेकिन आप अतिरिक्त आश्वासन चाहते हैं)।


24
धन्यवाद। मुख्य वाक्यांश था "इसमें ऐसे कमिट्स हैं जो किसी भी अन्य रेफरी हेड से नहीं मिल रहे हैं"। हालांकि मुझे अब प्रयोग शाखा की आवश्यकता नहीं थी, और पहले से ही इसे मास्टर में विलय कर दिया था, और इसे मूल से हटाने की योजना बनाई थी, git तब तक खुश नहीं होने वाला था जब तक मैं प्रयोग के मूल में बदलाव को धक्का नहीं देता। मुझे लगता है कि यह चेतावनी एक तरह की स्वच्छता जांच थी।
मौलसून

35
-1 "इसका मतलब है कि जिस शाखा को आप हटाने जा रहे हैं उसमें कमिट हैं जो किसी भी अन्य रेफरी के सिर से नहीं पहुंच सकते हैं।" यह सही नहीं है। चेतावनी का मतलब यह है कि शाखा या तो उसके ऊपर (यदि इसमें एक है), या वर्तमान HEAD से उपलब्ध नहीं है। Git-branch का मैनपेज देखें।
15

3
@TachyonVortex अच्छा लिंक। कमांड गिट शाखा -vv ने वास्तव में स्पष्ट किया कि मेरे लिए क्या चल रहा था।
जेसन मैसी

11
@ स्लेस्के टिप्पणी के लिए धन्यवाद - यह उत्तर वास्तव में संपादित किया जाना चाहिए। यह एक शर्म की बात है कि यह अत्यधिक उत्कीर्ण है क्योंकि मुख्य व्याख्यात्मक वाक्य गलत है। मुझे बस यह समस्या थी और एक कष्टप्रद लंबे समय से यह जानने की कोशिश कर रहा था कि समस्या क्या है, और यह सिर्फ इतना था कि रिमोट ट्रैकिंग शाखा को पुल अनुरोध के हिस्से के रूप में हटा दिया गया था, और उस समय से जब मैंने मास्टर से परिवर्तन खींच लिया था। स्थानीय शाखा पर। एकमात्र 'समस्या' दूरस्थ ट्रैकिंग शाखा नहीं पा रही थी, जिसे हटा दिया गया था (और मैं उसी कारण से स्थानीय शाखा को हटाने की कोशिश कर रहा था)।
एली

3
हाँ, यह तब हो सकता है जब आप इसे बनाते समय किसी स्थानीय शाखा को हटाने की कोशिश कर रहे हों। "कमिट जो किसी भी अन्य रेफरी से उपलब्ध नहीं हैं" गलत और अनावश्यक रूप से डरावना है!
अमलगोविनस

80

जैसा कि ड्रू टेलर ने बताया, शाखा -d के साथ विलोपन केवल यह निर्धारित करने में वर्तमान HEAD पर विचार करता है कि क्या शाखा "पूरी तरह से विलय" है। अगर शाखा को किसी अन्य शाखा में मिला दिया जाता है तो भी यह शिकायत करेगा । इस संबंध में त्रुटि संदेश निश्चित रूप से स्पष्ट हो सकता है ... हटाने से पहले आप या तो विलय की गई शाखा की जांच कर सकते हैं, या सिर्फ गिट शाखा -D का उपयोग कर सकते हैं। पूंजी-डी पूरी तरह से चेक को ओवरराइड करेगा।


2
वर्तमान हेड के बारे में मेरे लिए यह हिस्सा तय हो गया। मेरा गुरु उस सुविधा शाखा से अलग था जिसकी मैंने विरोधी शाखा बनाई थी: D
viki.omega9

1
शब्द सीखने वाले किसी व्यक्ति के लिए, "चालू" शब्द "HEAD" से बेमानी लगता है? एक अप्रचलित प्रमुख के रूप में ऐसी कोई चीज नहीं है - परिभाषा से प्रमुख है वर्तमान शाखा। क्या मैं कुछ भूल रहा हूँ? मुझे लगता है कि आप "वर्तमान शाखा" या "हेड" कह सकते हैं लेकिन "वर्तमान हेड" नहीं।
निशान लता

क्या इसे बदलने / कॉन्फ़िगर करने का कोई तरीका है (जैसे, क्या यह हमेशा जाँच करता है origin/master?) मुझे लगता है कि origin/masterपहले जाँच करना बहुत ख़राब नहीं है, लेकिन यह सिर्फ एक प्रकार का अजीब प्रवाह है - मुझे origin/masterस्थानीय स्तर पर जाँच करने की आवश्यकता क्यों है बस आपको यह सत्यापित करने के लिए कि मेरे परिवर्तन वहां मर्ज किए गए हैं?
एलेक

15

मैंने सेहे के जवाब की कोशिश की और यह काम नहीं किया।

उन कमिटों को खोजने के लिए जिनका विलय नहीं किया गया है, बस उपयोग करें:

git log feature-branch ^master --no-merges

14

मेरे साथ आज ऐसा ही हुआ, क्योंकि मैं अपनी पहली फीचर शाखा को वापस मास्टर में विलय कर रहा था। जैसा कि कुछ ने एसओ पर एक सूत्र में कहीं और कहा था, शाखा को हटाने की कोशिश करने से पहले मास्टर को वापस स्विच कर रहा था। एक बार मास्टर में वापस जाने पर, बिना किसी चेतावनी के शाखा को हटाने के लिए git खुश था।


7
ऐसा नहीं लगता कि यहाँ विशिष्ट मुद्दा है, लेकिन मैं इस समस्या का वर्णन करता हूँ जो आप अभी बता रहे हैं, इसलिए धन्यवाद!
डैनियल बकमास्टर

4

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

शाखा experimentको दूसरी शाखा में "पूरी तरह से विलय" होने के लिए, इसकी टिप कमिट अन्य शाखा के पूर्वज की होनी चाहिए, जिससे दूसरी शाखा का experimentसबसेट बन जाए। यह हटाना सुरक्षित बनाता है experiment, क्योंकि इसके सभी कमिट दूसरी शाखा के माध्यम से रिपॉजिटरी हिस्ट्री का हिस्सा बने रहेंगे। इसे "पूरी तरह" मर्ज किया जाना चाहिए, क्योंकि यह पहले से ही कई बार विलय हो सकता है, लेकिन अब अंतिम मर्ज के बाद जोड़ दिया गया है जो अन्य शाखा में निहित नहीं हैं।

गेट रिपॉजिटरी में हर दूसरी शाखा की जाँच नहीं करता है, हालाँकि; केवल दो:

  1. वर्तमान शाखा (HEAD)
  2. ऊपर की शाखा, अगर एक है

experimentआपके मामले में जैसा कि "अपस्ट्रीम ब्रांच" है , शायद है origin/experiment। यदि experimentवर्तमान शाखा में पूरी तरह से विलय हो जाता है, तो Git इसे बिना किसी शिकायत के हटा देता है। यदि यह नहीं है, लेकिन यह पूरी तरह से इसकी अपस्ट्रीम शाखा में विलय कर दिया गया है, तो गिट एक चेतावनी के साथ आगे बढ़ता है:

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

जहां xxxxxxxxएक प्रतिबद्ध आईडी इंगित करता है। इसके अपस्ट्रीम में पूरी तरह से विलय हो जाना इंगित करता है कि कमिट्स experimentको मूल रिपॉजिटरी में धकेल दिया गया है, ताकि अगर आप उन्हें यहां खो देते हैं, तो भी वे कम से कम कहीं और बच जाएं।

चूँकि Git अन्य शाखाओं की जाँच नहीं करता है, इसलिए किसी शाखा को हटाना सुरक्षित हो सकता है क्योंकि आप जानते हैं कि यह पूरी तरह से दूसरे में विलीन हो गई है; आप इस -Dविकल्प के साथ संकेत के रूप में कर सकते हैं , या पहले उस शाखा में स्विच कर सकते हैं और Git को आपके लिए पूर्ण रूप से विलय की स्थिति की पुष्टि कर सकते हैं।


1
कुंजी " वर्तमान शाखा में पूरी तरह से विलय " है। मेरे पास एक शाखा एक्स थी 'एक्स से पूरी तरह से एक्स में वापस विलय हो गया था और पहले से ही मूल / एक्स को हटा दिया था। लेकिन Y की जाँच के साथ मुझे यह चेतावनी मिली। जब मैंने चेक किया तो XI X को डिलीट करने में सक्षम था। ' यह बेवकूफ है, मुझे लगता है।
लॉरेंस Dol

2
यह उत्तर बिना किसी कारण के यहाँ से चोरी हो गया है। chimera.labs.oreilly.com/books/1230000000561/…
मार्क Lakata

3

मर्ज किए गए परिवर्तनों को देखने के लिए, मैंने ऐसा किया:

git checkout experiment
git merge --no-commit master

git diff --cached

नोट: यह दिखाता है masterकि इसमें परिवर्तन नहीं हैं experiment

इसे मत भूलना:

git merge --abort

जब तुम दिख रहे हो


@IgorGanapolsky Dunno वास्तव में, हालांकि आमतौर पर man git-resetऔर git रीसेट कमांड राज्य के मुद्दों से उबरने के लिए पर्याप्त है।
थोरसुमोनर

3

स्पष्टीकरण के साथ सबसे आसान समाधान (डबल जाँच समाधान) (पहले समस्या का सामना करना पड़ा)

समस्या यह है:

1- मैं एक शाखा नहीं हटा सकता

2- टर्मिनल एक चेतावनी संदेश प्रदर्शित करता है कि कुछ कमिट हैं जो अभी तक स्वीकृत नहीं हैं

3-यह जानते हुए कि मैंने मास्टर और शाखा की जाँच की और वे समान हैं (अप टू डेट)

उपाय:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

स्पष्टीकरण:

जब आपकी शाखा अपस्ट्रीम दूरस्थ शाखा (गितुब, बिटबकेट या जो भी हो) से जुड़ी होती है, तो आपको इसे मास्टर में मर्ज करने (पुश) करने की आवश्यकता होती है, और आपको दूरस्थ रेपो (गटबट, बिटबकेट) में नए बदलाव (कमिट) करने की आवश्यकता होती है। जो कुछ भी) शाखा से,

मैंने अपने कोड में जो किया वह यह है कि मैंने मास्टर में स्विच किया, फिर शाखा को उसमें मिला दिया (यह सुनिश्चित करने के लिए कि वे आपके स्थानीय मशीन पर समान हैं), तो मैंने फिर से शाखा में स्विच किया और अपडेट या रिमोट में बदलाव को ऑनलाइन धकेल दिया रेपो "गिट पुश" का उपयोग कर।

उसके बाद, मैंने फिर से मास्टर पर स्विच किया, और शाखा को हटाने की कोशिश की, और समस्या (चेतावनी संदेश) गायब हो गई, और शाखा सफलतापूर्वक समाप्त हो गई


3

आप बस यह पता लगा सकते हैं:

git log - एचेरी मास्टर ... प्रायोगिक

--cherry विकल्प के लिए एक पर्याय है --right-only --cherry-mark --no-merges

git-log मैन पेज ने कहा

यह हमारी तरफ से आउटपुट को सीमित करने और उन लोगों को चिह्नित करने के लिए उपयोगी है, जिन्हें गिट लॉग --cherry अपस्ट्रीम ... mybranch, git चेरी अपस्ट्रीम mybranch के समान कांटे के इतिहास के दूसरी तरफ लागू किया गया है।

FYI करें। --cherry-pickबराबर कमिट्स को छोड़ता है, लेकिन --cherry-marksनहीं करता है। अपस्ट्रीम और को-वर्किंग पब्लिक ब्रांच के बीच रिबेश और फोर्स किए गए अपडेट को खोजना उपयोगी है


1

मेरे पास मेरे स्थानीय गिट पर अपस्ट्रीम शाखा नहीं थी। मैंने मास्टर से एक स्थानीय शाखा बनाई थी, git checkout -b mybranch। मैंने अपस्ट्रीम गिट पर बिटबकेट GUI के साथ एक शाखा बनाई और अपनी स्थानीय शाखा (mybranch) को उस अनुप्रवाह शाखा में धकेल दिया। एक बार जब मैंने अपस्ट्रीम शाखा को पुनः प्राप्त करने के लिए अपने स्थानीय गिट पर एक git लाने का काम किया, तो मैं एक git शाखा -d mybranch कर सकता था।


0

मेरा मानना ​​है कि झंडा --forceवही है जो आप वास्तव में ढूंढ रहे हैं। बस git branch -d --force <branch_name>शाखा को जबरन हटाने के लिए उपयोग करें।

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