किसी तरह मेरे गुरु और मेरी उत्पत्ति / गुरु शाखा को मोड़ दिया गया है।
मैं वास्तव में उन्हें अलग नहीं करना चाहता।
मैं इन अंतरों को कैसे देख सकता हूं और उन्हें 'मर्ज' कर सकता हूं?
किसी तरह मेरे गुरु और मेरी उत्पत्ति / गुरु शाखा को मोड़ दिया गया है।
मैं वास्तव में उन्हें अलग नहीं करना चाहता।
मैं इन अंतरों को कैसे देख सकता हूं और उन्हें 'मर्ज' कर सकता हूं?
जवाबों:
आप एक के साथ मतभेदों की समीक्षा कर सकते हैं :
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 से दो तरह से अलग है:
ध्यान दें कि C 'के पीछे का इतिहास अभी भी रैखिक है।
हमने केवल (अब के लिए) रैखिक इतिहास को चुनने की अनुमति दी है cmake.org/cmake.git
।
यह दृष्टिकोण सीवीएस-आधारित वर्कफ़्लो को पहले से इस्तेमाल करता है और संक्रमण को कम कर सकता है।
C 'को हमारी रिपॉजिटरी में धकेलने का प्रयास काम करेगा (यह मानते हुए कि आपके पास अनुमति है और जब आप रिबास कर रहे थे तो किसी ने धक्का नहीं दिया)।
Git पुल कमांड मूल से लाने के लिए एक शॉर्टहैंड रास्ता प्रदान करता है और उस पर स्थानीय कार्य को रीबेज करता है:
$ git pull --rebase
यह उपरोक्त भ्रूण को जोड़ता है और एक कमांड में चरणों को पुन: बनाता है।
git reset --hard HEAD
केवल किसी भी स्थानीय अनुक्रमित गैर-प्रतिबद्ध संशोधन को हटा देगा, और स्थानीय और दूरस्थ कमिट के बीच के अंतर को समेटने के लिए कुछ भी नहीं करेगा । केवल एक मर्ज या रिबास, कमिट के दो सेट (स्थानीय एक और रिमोट एक) को एक साथ लाएगा।
master
इंगित करना चाहता हूं B
।
git reset --hard origin/master
नीचे दिए गए उत्तर में उल्लेखित होगा : stackoverflow.com/a/8476004/6309
मेरे पास यह था और उपरोक्त प्रतिक्रियाओं को पढ़ने के बाद भी, इसका क्या कारण है, इसके बारे में मुझे रहस्य है। मेरा समाधान करना था
git reset --hard origin/master
फिर वह केवल मास्टर (जो मुझे लगता है कि खराब हो गया है) की मेरी (स्थानीय) कॉपी को सही बिंदु पर रीसेट करता है, जैसा कि (दूरस्थ) मूल / मास्टर द्वारा दर्शाया गया है।
चेतावनी : आप उन सभी परिवर्तनों को खो देंगे जिन्हें अभी तक धक्का नहीं दिया गया है
origin/master
।
git reflog
या उन्हें अंदर देख सकते हैं gitk --all
। लेकिन फिर भी, निश्चित रूप से हार्ड रीसेट रिबास की तुलना में एक और बात है।
git pull --rebase origin/master
एक एकल आदेश है जो आपकी अधिकांश समय मदद कर सकता है।
संपादित करें: मूल / मास्टर से आने वाले पुल्स को खींचता है और नए खींचे गए शाखा इतिहास पर आपके परिवर्तन लागू करता है।
जब मैं करने की कोशिश की मैं इस स्थिति में अपने आप को पाया rebase एक शाखा है कि एक दूरस्थ शाखा पर नज़र रखने गया था, और मैं मास्टर पर rebase करने के लिए कोशिश कर रहा था। इस परिदृश्य यदि आप रिबेस करने की कोशिश में, आप सबसे अधिक संभावना अपनी शाखा मिल जाएगा अलग हुए और यह एक गड़बड़ है कि Git nubees के लिए नहीं है बना सकते हैं!
मान लीजिए कि आप शाखा my_remote_tracking_branch पर हैं, जिसे मास्टर से शाखित किया गया था
$ git status
# शाखा पर my_remote_tracking_branch
कुछ भी नहीं करने के लिए (स्वच्छ निर्देशिका काम कर)
और अब आप मास्टर के रूप में रिबेट करने की कोशिश कर रहे हैं:
git rebase मास्टर
अब रोकें और अपने आप को कुछ परेशानी से बचाएं! इसके बजाय, मर्ज का उपयोग करें:
git मर्ज मास्टर
हां, आप अपनी शाखा पर अतिरिक्त कमिट्स के साथ समाप्त होंगे। लेकिन जब तक आप "अन-डाइवरिंग" शाखाओं के लिए तैयार नहीं होते हैं, तब तक रिबासिंग की तुलना में यह बहुत अधिक चिकना वर्कफ़्लो होगा। अधिक विस्तृत विवरण के लिए इस ब्लॉग को देखें ।
दूसरी ओर, यदि आपकी शाखा केवल एक स्थानीय शाखा है (अर्थात अभी तक किसी दूरस्थ को नहीं धकेला गया है) तो आपको निश्चित रूप से एक रिबास करना चाहिए (और आपकी शाखा इस मामले में विचलन नहीं करेगी )।
अब यदि आप इसे पढ़ रहे हैं, क्योंकि आप पहले से ही इस तरह के रिबास के कारण "डाइवर्जेड" परिदृश्य में हैं, तो आप मूल से वापस ला सकते हैं (यानी अन-डाइवर्ज्ड अवस्था में):
git रीसेट -हार्ड मूल / my_remote_tracking_branch
rebase
यदि आप जिस शाखा को रिबासिंग कर रहे हैं वह प्रकाशित नहीं किया गया है (और अन्य लोगों द्वारा उपयोग किया जाता है)। अन्यथा, उपयोग करें merge
। यदि आप पहले से प्रकाशित (और उपयोग की गई) शाखाओं को रिबेट करते हैं, तो आपको प्रत्येक डेवलपर के इतिहास को फिर से लिखने के लिए एक साजिश का समन्वय करना होगा जिसने इस शाखा का उपयोग किया है।
git rebase master
...
git reset --hard origin/my_remote_tracking_branch
क्या वास्तव में काम किया है
मेरे मामले में यहाँ क्या मैं पैदा करने के लिए किया था भिन्नताएं मैंने किया: संदेश git push
लेकिन तब किया था git commit --amend
संदेश प्रतिबद्ध करने के लिए कुछ जोड़ने के लिए। फिर मैंने दूसरा कमिट भी किया।
तो मेरे मामले में कि मूल रूप से मूल / गुरु का मतलब पुराना था। क्योंकि मुझे पता था कि कोई भी व्यक्ति मूल / गुरु को नहीं छू रहा था, फिक्स तुच्छ था: git push -f
(जहां -f
बल का अर्थ है)
git push -f
पहले किए गए परिवर्तनों को अधिलेखित करने और मूल के लिए धकेलने के लिए +1 । मुझे यह भी यकीन है कि किसी और ने भंडार को नहीं छुआ।
मेरे मामले में मैंने परिवर्तनों को धकेल दिया है origin/master
और तब महसूस किया है कि मुझे ऐसा नहीं करना चाहिए था :-( यह इस तथ्य से जटिल था कि स्थानीय परिवर्तन एक उपप्रकार में थे। इसलिए मैं "बुरे" स्थानीय से पहले अंतिम अच्छे वचन पर वापस चला गया। परिवर्तन (SourceTree का उपयोग करके) और फिर मुझे "विचलन संदेश" मिला।
स्थानीय रूप से मेरी गड़बड़ी को ठीक करने के बाद (विवरण यहां महत्वपूर्ण नहीं हैं) मैं रिमोट को "समय पर वापस जाना" चाहता था origin/master
शाखा में ताकि यह master
फिर से स्थानीय के साथ सिंक हो जाए। मेरे मामले में समाधान था:
git push origin master -f
-f
बल (बल) स्विच को नोट करें। इसने "बुरे परिवर्तनों" को हटा दिया origin/master
जो गलती से धकेल दिया गया था और अब स्थानीय और दूरस्थ शाखाएं सिंक में हैं।
कृपया ध्यान रखें कि यह एक संभावित विनाशकारी ऑपरेशन है, इसलिए इसे केवल तभी निष्पादित करें जब आप 100% सुनिश्चित हों कि समय में दूरस्थ मास्टर "वापस जाना" ठीक है।
You are not allowed to force push code to a protected branch on this project.
। मैं अपने कांटे को आगे बढ़ाने की कोशिश कर रहा हूं।
मुझे पता है कि यहां बहुत सारे उत्तर हैं, लेकिन मुझे लगता है 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
अंतर देखने के लिए:
git difftool --dir-diff master origin/master
यह दो शाखाओं के बीच परिवर्तन या अंतर प्रदर्शित करेगा। अरैक्सिस (मेरा पसंदीदा) में यह एक फ़ोल्डर में अलग शैली प्रदर्शित करता है। प्रत्येक परिवर्तित फ़ाइल दिखा रहा है। मैं फ़ाइल में परिवर्तनों का विवरण देखने के लिए फ़ाइल पर क्लिक कर सकता हूं।
मेरे मामले में यह मेरे संघर्ष के संकल्प को पूरा नहीं करने के कारण हुआ।
git pull
कमांड चलाने के कारण समस्या हुई थी । मूल में परिवर्तन से मेरे स्थानीय रेपो के साथ संघर्ष हुआ, जिसे मैंने हल किया। हालांकि, मैंने उन्हें प्रतिबद्ध नहीं किया। इस बिंदु पर समाधान परिवर्तनों ( git commit
हल की गई फ़ाइल) के लिए है
यदि आपने संघर्ष को हल करने के बाद से कुछ फ़ाइलों को संशोधित किया है, तो git status
कमांड स्थानीय संशोधनों को अस्थिर स्थानीय संशोधनों के रूप में दिखाएगी और संकल्प को स्थानीय संशोधनों के रूप में मर्ज करेगी। इसे पहले मर्ज से परिवर्तनों को कम करके ठीक से हल किया जा सकता है git commit
, फिर अस्थिर परिवर्तनों को सामान्य रूप से जोड़कर (जैसे git commit -a
)।
मेरे पास एक ही संदेश था जब मैं अंतिम प्रतिबद्ध संदेश को संपादित करने की कोशिश कर रहा था, पहले से ही प्रतिबद्ध प्रतिबद्ध का उपयोग करके: git commit --amend -m "New message"
जब मैंने परिवर्तनों का उपयोग किया git push --force-with-lease repo_name branch_name
तो कोई समस्या नहीं थी।
इस समस्या का सामना तब किया जब मैंने शाखा ए के आधार पर एक शाखा बनाई
git checkout -b a
और फिर मैंने शाखा की एक मूल शाखा बी तक की धारा स्थापित की
git branch -u origin/B
फिर मुझे ऊपर त्रुटि संदेश मिला।
मेरे लिए इस समस्या को हल करने का एक तरीका था,
git checkout -b b origin/B