मास्टर शाखा और 'मूल / मास्टर' ने विचलन किया है, 'शाखाओं' को कैसे नष्ट किया जाए?


964

किसी तरह मेरे गुरु और मेरी उत्पत्ति / गुरु शाखा को मोड़ दिया गया है।
मैं वास्तव में उन्हें अलग नहीं करना चाहता।

मैं इन अंतरों को कैसे देख सकता हूं और उन्हें 'मर्ज' कर सकता हूं?


2
डायवर्ट करने से क्या मतलब है? क्या आप अपने गुरु को धक्का देने के बाद उसे वापस कर देते हैं?
hasen

13
मुझे एक संदेश मिला है जिसमें कहा गया है कि "आपकी शाखा और 'मूल / मास्टर' में क्रमशः, # और 1 और 1 अलग-अलग प्रतिबद्ध (ओं) हैं।"
फ्रैंक

मैंने अपना उत्तर अपडेट कर दिया है कि "डायवर्ट" चेतावनी संदेश।
वॉन मार्क

एक अन्य प्रश्न का स्वीकृत उत्तर कुछ मामलों को हल करने में भी मददगार हो सकता है, जहाँ यह चलन में आ सकता है (जैसे कि आप अपने गुरु को चारों ओर ले जाने की कोशिश कर रहे हैं, लेकिन यह पहले ही धकेल दिया गया है): stackoverflow.com/questions/2862590/…
लिंड करता है

8
इस ब्लॉग की व्याख्या ने मुझे नीचे दिए गए किसी भी उत्तर की तुलना में असीम रूप से अधिक मदद की: sebgoo.blogspot.com/2012/02/…

जवाबों:


1013

आप एक के साथ मतभेदों की समीक्षा कर सकते हैं :

git log HEAD..origin/master

इसे खींचने से पहले (प्राप्त करें + मर्ज करें) (यह भी देखें कि "आपको किसी विशिष्ट शाखा से हमेशा खींचने के लिए गिट कैसे मिलता है?" )


जब आपके पास कोई संदेश हो:

"आपकी शाखा और 'मूल / मास्टर' में क्रमशः # 1 और 1 अलग-अलग वचन हैं।

जांच करें कि क्या आपको अपडेट करने की आवश्यकता हैorigin । यदि originअप-टू-डेट है, तो कुछ कमिट्स को originदूसरे रेपो से धकेल दिया गया है , जबकि आपने स्थानीय रूप से अपना कमिट बनाया है।

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \
                    C  master (your work)

आप प्रतिबद्ध A के आधार पर C आधारित थे क्योंकि उस समय आपके पास नवीनतम कार्य था जो आपने ऊपर से प्राप्त किया था।

हालाँकि, इससे पहले कि आप वापस मूल में धकेलने की कोशिश करें, किसी और ने प्रतिबद्ध बी को धक्का दिया।
विकास के इतिहास को अलग-अलग रास्तों में बदल दिया गया है।

फिर आप मर्ज या रिबेस कर सकते हैं। प्रो गिट देखें : गिट ब्रांचिंग - विवरण के लिए रिबासिंग

मर्ज

Git मर्ज कमांड का उपयोग करें:

$ git merge origin/master

यह Git को origin/masterआपके कार्य से परिवर्तनों को एकीकृत करने और मर्ज कमिट बनाने के लिए कहता है ।
इतिहास का ग्राफ अब इस तरह दिखता है:

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \      \
                    C ---- M  master (your work)

नए मर्ज, कमिट एम, के दो माता-पिता हैं, जिनमें से प्रत्येक ने विकास के एक मार्ग का प्रतिनिधित्व किया है, जिसके कारण उस प्रतिबद्ध में संग्रहीत सामग्री का नेतृत्व किया गया।

ध्यान दें कि M के पीछे का इतिहास अब गैर-रैखिक है।

रिबेस

Git rebase कमांड का उपयोग करें:

$ git rebase origin/master

यह Git को C (आपके काम) को फिर से खेलना बताता है जैसे कि आपने इसे A.
CVS के बजाय B पर आधारित किया था और Subversion उपयोगकर्ता नियमित रूप से अपस्ट्रीम कार्य के शीर्ष पर अपने स्थानीय परिवर्तनों को तब रद्द करते हैं जब वे प्रतिबद्ध होने से पहले अपडेट करते हैं।
Git सिर्फ कमिट और रिबेस चरणों के बीच स्पष्ट अलगाव जोड़ता है।

इतिहास का ग्राफ अब इस तरह दिखता है:

... o ---- o ---- A ---- B  origin/master (upstream work)
                          \
                           C'  master (your work)

कमिट सी 'जीआईटी रिबेस कमांड द्वारा बनाई गई एक नई प्रतिबद्धता है।
यह C से दो तरह से अलग है:

  1. इसका एक अलग इतिहास है: A के बजाय B।
  2. इसकी सामग्री बी और सी दोनों में परिवर्तन के लिए जिम्मेदार है; यह मर्ज उदाहरण से M के समान है।

ध्यान दें कि C 'के पीछे का इतिहास अभी भी रैखिक है।
हमने केवल (अब के लिए) रैखिक इतिहास को चुनने की अनुमति दी है cmake.org/cmake.git
यह दृष्टिकोण सीवीएस-आधारित वर्कफ़्लो को पहले से इस्तेमाल करता है और संक्रमण को कम कर सकता है।
C 'को हमारी रिपॉजिटरी में धकेलने का प्रयास काम करेगा (यह मानते हुए कि आपके पास अनुमति है और जब आप रिबास कर रहे थे तो किसी ने धक्का नहीं दिया)।

Git पुल कमांड मूल से लाने के लिए एक शॉर्टहैंड रास्ता प्रदान करता है और उस पर स्थानीय कार्य को रीबेज करता है:

$ git pull --rebase

यह उपरोक्त भ्रूण को जोड़ता है और एक कमांड में चरणों को पुन: बनाता है।


5
मैंने इसी समस्या को देखते हुए पाया, क्या आप बता सकते हैं कि 'git reset --hard HEAD' ने समस्या को ठीक क्यों नहीं किया?
Neth

12
@ नीत: क्योंकि यह चरणबद्ध संशोधनों (यानी सूचकांक में मौजूद संशोधन लेकिन अभी तक प्रतिबद्ध नहीं है) के बारे में है, लेकिन स्थानीय कमिट्स के बारे में है (जो रिमोट पर मौजूद कमिट्स से अलग है)। git reset --hard HEADकेवल किसी भी स्थानीय अनुक्रमित गैर-प्रतिबद्ध संशोधन को हटा देगा, और स्थानीय और दूरस्थ कमिट के बीच के अंतर को समेटने के लिए कुछ भी नहीं करेगा । केवल एक मर्ज या रिबास, कमिट के दो सेट (स्थानीय एक और रिमोट एक) को एक साथ लाएगा।
वॉनक

4
वाह, इस भयानक प्रतिक्रिया के लिए धन्यवाद। हमने गलती से "--rebase" के बिना "गिट पुल" किया था, और "गिट रीबेस मूल / मास्टर" बस ठीक था!
मैरोनी

3
कैसे के बारे में - मैं सिर्फ अपने स्थानीय परिवर्तनों को अनदेखा / डंप करना चाहता हूं और अपनी स्थानीय शाखा के साथ हो सकता हूं जहां रिमोट है? दूसरे शब्दों में, मैं आपके उदाहरण पर masterइंगित करना चाहता हूं B
CygnusX1

23
@ CygnusX1 जो git reset --hard origin/masterनीचे दिए गए उत्तर में उल्लेखित होगा : stackoverflow.com/a/8476004/6309
VonC

725

मेरे पास यह था और उपरोक्त प्रतिक्रियाओं को पढ़ने के बाद भी, इसका क्या कारण है, इसके बारे में मुझे रहस्य है। मेरा समाधान करना था

git reset --hard origin/master

फिर वह केवल मास्टर (जो मुझे लगता है कि खराब हो गया है) की मेरी (स्थानीय) कॉपी को सही बिंदु पर रीसेट करता है, जैसा कि (दूरस्थ) मूल / मास्टर द्वारा दर्शाया गया है।

चेतावनी : आप उन सभी परिवर्तनों को खो देंगे जिन्हें अभी तक धक्का नहीं दिया गया है origin/master


21
हां, यह डमीज विकल्प की तरह एक सा महसूस करता है, लेकिन अगर कोई वास्तविक खतरा नहीं है और आप यहां जल्दी ठीक करने के लिए हैं - यह काम करता है (वैसे भी मेरे लिए)
पांडावुड

7
इससे पहले ("गिट चेकआउट मास्टर") मास्टर शाखा पर होना चाहिए।
blueyed

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

96
आपको शायद उपयोगकर्ताओं को चेतावनी देनी चाहिए कि यह उन्हें उन सभी परिवर्तनों को खो देगा जो अभी तक मूल में नहीं धकेल दिए गए हैं
पेड्रो लौरेइरो

6
@PedroLoureiro कमिट्स वास्तव में खो गए नोट हैं, आप अभी भी कमिट्स को ढूंढ सकते हैं git reflogया उन्हें अंदर देख सकते हैं gitk --all। लेकिन फिर भी, निश्चित रूप से हार्ड रीसेट रिबास की तुलना में एक और बात है।
सीबक्रेमर

52
git pull --rebase origin/master 

एक एकल आदेश है जो आपकी अधिकांश समय मदद कर सकता है।

संपादित करें: मूल / मास्टर से आने वाले पुल्स को खींचता है और नए खींचे गए शाखा इतिहास पर आपके परिवर्तन लागू करता है।


89
कृपया इस बात का उल्लेख करें कि कमांड क्या करता है, बाकी लोग इसे चला सकते हैं और पंगा ले सकते हैं
Baz1nga

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

7
सिवाय इसके कि जब वास्तविक मतभेद हों और यह आपको एक विकृत विद्रोह में छोड़ देता है।
ffledgling

यह एक त्रुटि देता है: त्रुटि: परिवर्तनों में विलय करने में विफल। पैच 0024 अनुरोध और रिस्पांस मॉडल में विफल रहा
इगोरगानपोलस्की

32

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

मान लीजिए कि आप शाखा my_remote_tracking_branch पर हैं, जिसे मास्टर से शाखित किया गया था

$ git status

# शाखा पर my_remote_tracking_branch

कुछ भी नहीं करने के लिए (स्वच्छ निर्देशिका काम कर)

और अब आप मास्टर के रूप में रिबेट करने की कोशिश कर रहे हैं:

git rebase मास्टर

अब रोकें और अपने आप को कुछ परेशानी से बचाएं! इसके बजाय, मर्ज का उपयोग करें:

git मर्ज मास्टर

हां, आप अपनी शाखा पर अतिरिक्त कमिट्स के साथ समाप्त होंगे। लेकिन जब तक आप "अन-डाइवरिंग" शाखाओं के लिए तैयार नहीं होते हैं, तब तक रिबासिंग की तुलना में यह बहुत अधिक चिकना वर्कफ़्लो होगा। अधिक विस्तृत विवरण के लिए इस ब्लॉग को देखें ।

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

अब यदि आप इसे पढ़ रहे हैं, क्योंकि आप पहले से ही इस तरह के रिबास के कारण "डाइवर्जेड" परिदृश्य में हैं, तो आप मूल से वापस ला सकते हैं (यानी अन-डाइवर्ज्ड अवस्था में):

git रीसेट -हार्ड मूल / my_remote_tracking_branch


5
अंगूठे का एक नियम का उपयोग करना है rebaseयदि आप जिस शाखा को रिबासिंग कर रहे हैं वह प्रकाशित नहीं किया गया है (और अन्य लोगों द्वारा उपयोग किया जाता है)। अन्यथा, उपयोग करें merge। यदि आप पहले से प्रकाशित (और उपयोग की गई) शाखाओं को रिबेट करते हैं, तो आपको प्रत्येक डेवलपर के इतिहास को फिर से लिखने के लिए एक साजिश का समन्वय करना होगा जिसने इस शाखा का उपयोग किया है।
मिकको रेंटालिनेन

1
दुर्भाग्य से मैंने ऐसा करने से पहले यह संदेश नहीं पढ़ा git rebase master...
विटाली इसव

यदि मैं शाखा 'फोब्बर' पर रिबेट मास्टर करता हूं, तो तकनीकी रूप से फोब्बर को उत्पत्ति / फोब्बर से अलग किया जाता है जब तक कि मैं गिट पुश-ऑफ नहीं करता हूं, ठीक है?
15:56


1
git reset --hard origin/my_remote_tracking_branchक्या वास्तव में काम किया है
roothahn

24

मेरे मामले में यहाँ क्या मैं पैदा करने के लिए किया था भिन्नताएं मैंने किया: संदेश git pushलेकिन तब किया था git commit --amendसंदेश प्रतिबद्ध करने के लिए कुछ जोड़ने के लिए। फिर मैंने दूसरा कमिट भी किया।

तो मेरे मामले में कि मूल रूप से मूल / गुरु का मतलब पुराना था। क्योंकि मुझे पता था कि कोई भी व्यक्ति मूल / गुरु को नहीं छू रहा था, फिक्स तुच्छ था: git push -f (जहां -fबल का अर्थ है)


8
git push -fपहले किए गए परिवर्तनों को अधिलेखित करने और मूल के लिए धकेलने के लिए +1 । मुझे यह भी यकीन है कि किसी और ने भंडार को नहीं छुआ।
zacharydl

4
बहुत जोखिम भरा आदेश। कृपया कमांड के जोखिम कारक के बारे में एक छोटी जानकारी लिखें।
204 पर J4cK

1
@ ट्रिकस्टर: मैंने पहले ही जोखिम का वर्णन कर दिया था: "जैसा कि मुझे पता था कि कोई और नहीं मूल / मास्टर को छू रहा था"। मेरा मानना ​​है कि उस मामले में, यह एक जोखिम भरा आदेश नहीं है।
डैरेन कुक

1
अगर कोई मास्टर पर
हमला

11

मेरे मामले में मैंने परिवर्तनों को धकेल दिया है origin/masterऔर तब महसूस किया है कि मुझे ऐसा नहीं करना चाहिए था :-( यह इस तथ्य से जटिल था कि स्थानीय परिवर्तन एक उपप्रकार में थे। इसलिए मैं "बुरे" स्थानीय से पहले अंतिम अच्छे वचन पर वापस चला गया। परिवर्तन (SourceTree का उपयोग करके) और फिर मुझे "विचलन संदेश" मिला।

स्थानीय रूप से मेरी गड़बड़ी को ठीक करने के बाद (विवरण यहां महत्वपूर्ण नहीं हैं) मैं रिमोट को "समय पर वापस जाना" चाहता था origin/master शाखा में ताकि यह masterफिर से स्थानीय के साथ सिंक हो जाए। मेरे मामले में समाधान था:

git push origin master -f

-fबल (बल) स्विच को नोट करें। इसने "बुरे परिवर्तनों" को हटा दिया origin/masterजो गलती से धकेल दिया गया था और अब स्थानीय और दूरस्थ शाखाएं सिंक में हैं।

कृपया ध्यान रखें कि यह एक संभावित विनाशकारी ऑपरेशन है, इसलिए इसे केवल तभी निष्पादित करें जब आप 100% सुनिश्चित हों कि समय में दूरस्थ मास्टर "वापस जाना" ठीक है।


हमेशा उपयोगी लेकिन निश्चित रूप से सवाल का जवाब नहीं देता है।
थिबॉल्ट डी।

1
@ThibaultD। यहां तक ​​कि अगर यह नहीं था, यह वही है जो मैं देख रहा था।
नील चौधरी

मुझे मिल रहा है You are not allowed to force push code to a protected branch on this project.। मैं अपने कांटे को आगे बढ़ाने की कोशिश कर रहा हूं।
बनारस


5

मुझे पता है कि यहां बहुत सारे उत्तर हैं, लेकिन मुझे लगता है git reset --soft HEAD~1कि कुछ ध्यान देने योग्य हैं, क्योंकि यह आपको पिछली स्थिति को हल करने के दौरान अंतिम स्थानीय (नहीं धकेल दिया गया) में परिवर्तन रखने देता है । मुझे लगता है कि यह पुल के मुकाबले अधिक बहुमुखी समाधान हैrebase , क्योंकि स्थानीय प्रतिबद्ध की समीक्षा की जा सकती है और यहां तक ​​कि दूसरी शाखा में भी स्थानांतरित किया जा सकता है।

--softकठोर के बजाय कुंजी का उपयोग कर रहा है --hard। यदि 1 से अधिक प्रतिबद्ध है, तो HEAD~xकार्य का एक रूपांतर होना चाहिए। तो यहाँ सभी चरण हैं जो मेरी स्थिति को हल करते हैं (मेरे पास 1 स्थानीय प्रतिबद्ध था और रिमोट में 8 कमिट हैं):

1) git reset --soft HEAD~1 स्थानीय प्रतिबद्ध को पूर्ववत् करना। अगले चरणों के लिए, मैंने SourceTree में इंटरफ़ेस का उपयोग किया है, लेकिन मुझे लगता है कि निम्नलिखित कमांड को भी काम करना चाहिए:

2) git stash 1 से परिवर्तन को छिपाने के लिए)। अब सभी परिवर्तन सुरक्षित हैं और अब कोई विचलन नहीं है।

3) git pull दूरस्थ परिवर्तन प्राप्त करने के लिए।

4) git stash pop या git stash applyअंतिम स्टैक्ड परिवर्तनों को लागू करने के लिए, यदि आवश्यक हो, तो एक नई प्रतिबद्धता का पालन करें। यह कदम वैकल्पिक है, 2 के साथ ) , जब स्थानीय प्रतिबद्ध में परिवर्तनों को रद्दी करना चाहते हैं। इसके अलावा, जब किसी अन्य शाखा के लिए प्रतिबद्ध होना है, तो यह कदम वांछित एक पर स्विच करने के बाद किया जाना चाहिए।


दरअसल, इन दिनों, pull --rebaseवैसे भी स्वचालित रूप से स्टैश होगा। stackoverflow.com/a/30209750/6309
VonC

4

अंतर देखने के लिए:

git difftool --dir-diff master origin/master

यह दो शाखाओं के बीच परिवर्तन या अंतर प्रदर्शित करेगा। अरैक्सिस (मेरा पसंदीदा) में यह एक फ़ोल्डर में अलग शैली प्रदर्शित करता है। प्रत्येक परिवर्तित फ़ाइल दिखा रहा है। मैं फ़ाइल में परिवर्तनों का विवरण देखने के लिए फ़ाइल पर क्लिक कर सकता हूं।


1
जीआईटी-डीआईआर का दिलचस्प उपयोग: +1
वॉनच

3

मेरे मामले में यह मेरे संघर्ष के संकल्प को पूरा नहीं करने के कारण हुआ।

git pullकमांड चलाने के कारण समस्या हुई थी । मूल में परिवर्तन से मेरे स्थानीय रेपो के साथ संघर्ष हुआ, जिसे मैंने हल किया। हालांकि, मैंने उन्हें प्रतिबद्ध नहीं किया। इस बिंदु पर समाधान परिवर्तनों ( git commitहल की गई फ़ाइल) के लिए है

यदि आपने संघर्ष को हल करने के बाद से कुछ फ़ाइलों को संशोधित किया है, तो git statusकमांड स्थानीय संशोधनों को अस्थिर स्थानीय संशोधनों के रूप में दिखाएगी और संकल्प को स्थानीय संशोधनों के रूप में मर्ज करेगी। इसे पहले मर्ज से परिवर्तनों को कम करके ठीक से हल किया जा सकता है git commit, फिर अस्थिर परिवर्तनों को सामान्य रूप से जोड़कर (जैसे git commit -a)।


0

मेरे पास एक ही संदेश था जब मैं अंतिम प्रतिबद्ध संदेश को संपादित करने की कोशिश कर रहा था, पहले से ही प्रतिबद्ध प्रतिबद्ध का उपयोग करके: git commit --amend -m "New message" जब मैंने परिवर्तनों का उपयोग किया git push --force-with-lease repo_name branch_name तो कोई समस्या नहीं थी।


0

इस समस्या का सामना तब किया जब मैंने शाखा ए के आधार पर एक शाखा बनाई

git checkout -b a

और फिर मैंने शाखा की एक मूल शाखा बी तक की धारा स्थापित की

git branch -u origin/B

फिर मुझे ऊपर त्रुटि संदेश मिला।

मेरे लिए इस समस्या को हल करने का एक तरीका था,

  • शाखा हटाओ
  • द्वारा एक नई शाखा ख बनाएँ
git checkout -b b origin/B
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.