मैं गलती से गलत शाखा के लिए प्रतिबद्ध हूं। मैं उस कमिट को कैसे हटाऊं?
मैं गलती से गलत शाखा के लिए प्रतिबद्ध हूं। मैं उस कमिट को कैसे हटाऊं?
जवाबों:
आपके द्वारा किए गए कार्य को ध्यान में रखते हुए, हाल की प्रतिबद्धताओं को हटाएँ:
git reset --soft HEAD~1
अपने द्वारा किए गए कार्य को नष्ट करते हुए , सबसे हालिया प्रतिबद्ध हटाएं :
git reset --hard HEAD~1
git reset --hard origin
git remote
सूची मेरे लिए मूल है, git reset --hard origin
कहते हैं fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
। क्यों?
git reset HEAD~1
आपके सभी परिवर्तनों को भी रखेगा लेकिन आपको सब कुछ रखने के बजाय एक खाली सूचकांक के साथ छोड़ देगा (जैसा कि --soft
विकल्प होगा)।
मुझे आश्चर्य है कि मैंने जो सबसे अच्छा उत्तर पाया है, वह केवल टिप्पणियों में है! ( 86 वोटों से डेंयथ द्वारा )
git reset --hard origin
यह आदेश स्थानीय रिपॉजिटरी को दूरस्थ रिपॉजिटरी के साथ सिंक करेगा, जो आपके स्थानीय पर किए गए हर बदलाव से छुटकारा दिलाएगा। आप मूल में मौजूद सटीक शाखा लाने के लिए निम्न कार्य भी कर सकते हैं।
git reset --hard origin/<branch>
git reset --hard origin/<branch>
git reset --soft origin/<branch>
, यदि आप कमिट से छुटकारा पाना चाहते हैं, लेकिन स्थानीय कार्य को जारी रखें।
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
, आपको शाखा निर्दिष्ट करने की आवश्यकता है जैसे:git reset --hard origin/feature/my-cool-stuff
इसे न हटाएं: सिर्फ एक कमिट के git cherry-pick
लिए पर्याप्त है।
लेकिन अगर आपके पास गलत शाखा पर कई कमिट थे , तो वह git rebase --onto
चमकता है:
मान लीजिए कि आपके पास यह है:
x--x--x--x <-- master
\
-y--y--m--m <- y branch, with commits which should have been on master
, तब आप उसे चिन्हित कर सकते हैं master
और उस जगह ले जा सकते हैं जहाँ आप होना चाहते हैं:
git checkout master
git branch tmp
git checkout y
git branch -f master
x--x--x--x <-- tmp
\
-y--y--m--m <- y branch, master branch
रीसेट y शाखा जहां यह होना चाहिए था:
git checkout y
git reset --hard HEAD~2 # ~1 in your case,
# or ~n, n = number of commits to cancel
x--x--x--x <-- tmp
\
-y--y--m--m <- master branch
^
|
-- y branch
, और अंत में अपने कमिट्स को स्थानांतरित करें (उन्हें फिर से लागू करें, वास्तव में नए कमिट करें)
git rebase --onto tmp y master
git branch -D tmp
x--x--x--x--m'--m' <-- master
\
-y--y <- y branch
यदि आप उस कमेटी को दूसरी ब्रांच में स्थानांतरित करना चाहते हैं, तो विचाराधीन एसएचए प्राप्त करें
git rev-parse HEAD
फिर करंट ब्रांच को स्विच करें
git checkout other-branch
और cherry-pick
करने के लिए प्रतिबद्ध हैother-branch
git cherry-pick <sha-of-the-commit>
git reset --hard HEAD~1
बाद में आवश्यक है । मुझे लगता है कि reset --soft
तब शाखाओं को बदलना और फिर से काम करने से अतिरिक्त काम बच जाता। तब फिर से मैं अपने सभी मूल सामानों को करने के लिए SourceTree का उपयोग कर रहा था, केवल मेरी त्रुटि के बाद इसके साथ कमांड-लाइन।
आपके संदर्भ के लिए, मेरा मानना है कि आप अपनी वर्तमान शाखा से "हार्ड कट" कर सकते हैं, न केवल गिट रीसेट - भार के साथ, बल्कि निम्न कमांड के साथ:
git checkout -B <branch-name> <SHA>
वास्तव में, अगर आपको चेक आउट करने की परवाह नहीं है, तो आप जो चाहें उसके साथ शाखा सेट कर सकते हैं:
git branch -f <branch-name> <SHA>
उदाहरण के लिए, एक शाखा से कमिट को हटाने के लिए यह एक प्रोग्रामेटिक तरीका होगा, उदाहरण के लिए, इसे (रिबेट का उपयोग करके) नए कॉम्पट को कॉपी करने के लिए।
मान लीजिए कि आपके पास एक शाखा है जिसे मास्टर से डिस्कनेक्ट किया गया है क्योंकि आपने किसी अन्य स्थान से स्रोत ले लिए हैं और इसे शाखा में डंप कर दिया है।
अब आपके पास एक शाखा है जिसमें आपने परिवर्तन लागू किए हैं, चलो इसे "विषय" कहते हैं।
अब आप अपनी विषय शाखा का एक डुप्लिकेट बनाएंगे और फिर इसे उस सोर्स कोड डंप पर रीबेज करेंगे जो ब्रांच "डंप" में बैठा है:
git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate
अब आपके परिवर्तनों को "डंप" के शुरुआती बिंदु के आधार पर शाखा topic_duplicate में फिर से लागू किया गया है, लेकिन केवल "मास्टर" के बाद से किए गए कमिट हैं। इसलिए मास्टर के बाद से आपके परिवर्तन अब "डंप" के शीर्ष पर फिर से लागू होते हैं, लेकिन परिणाम "topic_duplicate" में समाप्त होता है।
आप तब "डंप" को "topic_duplicate" से बदल सकते हैं:
git branch -f dump topic_duplicate
git branch -D topic_duplicate
या के साथ
git branch -M topic_duplicate dump
या सिर्फ डंप को त्यागकर
git branch -D dump
शायद आप वर्तमान "topic_duplicate" को साफ़ करने के बाद सिर्फ चेरी-पिक कर सकते हैं।
मैं जो कहना चाह रहा हूं वह यह है कि यदि आप एक अलग पूर्वज की वर्तमान "डुप्लिकेट" शाखा को अपडेट करना चाहते हैं, तो आपको पहले "चेरीपाइटल" को एक git reset --hard <last-commit-to-retain>
या एक करके कमिट करना होगा git branch -f topic_duplicate <last-commit-to-retain>
और फिर दूसरे मुख्य पर (मुख्य से) कॉपी करना होगा विषय शाखा) या तो रिबासिंग या चेरी-पिकिंग द्वारा।
रिबासिंग केवल उस शाखा पर काम करता है जिसमें पहले से ही कमिट हैं, इसलिए आपको हर बार अपनी विषय शाखा को डुप्लिकेट करने की आवश्यकता होती है।
बहुत आसान है चेरी:
git cherry-pick master..topic
तो पूरा क्रम नीचे आ जाएगा:
git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic
जब आपकी विषय-डुप्लिकेट शाखा की जाँच हो गई हो। यह वर्तमान डुप्लिकेट से पहले-चेरी-चुने गए कमिट को हटा देगा, और आपके वर्तमान "डंप" (विभिन्न पूर्वजों) के शीर्ष पर "विषय" में हो रहे सभी परिवर्तनों को फिर से लागू करेगा। यह "वास्तविक" अपस्ट्रीम मास्टर पर एक अलग "डाउनस्ट्रीम" मास्टर का उपयोग करते हुए अपने विकास को आधार बनाने के लिए एक उचित रूप से सुविधाजनक तरीका लगता है यह जांचने के लिए कि क्या आपके स्थानीय परिवर्तन अभी भी उस पर लागू होते हैं। वैकल्पिक रूप से आप बस एक अंतर उत्पन्न कर सकते हैं और फिर इसे किसी भी गिट स्रोत के पेड़ के बाहर लगा सकते हैं। लेकिन इस तरह आप एक अप-टू-डेट संशोधित (पैच) संस्करण रख सकते हैं जो आपके वितरण के संस्करण पर आधारित है जबकि आपका वास्तविक विकास वास्तविक अपस्ट्रीम मास्टर के खिलाफ है।
तो बस प्रदर्शित करने के लिए:
आशा है कि यह किसी की मदद करता है। मैं इसे फिर से लिखना चाहता था, लेकिन मैं अब प्रबंधन नहीं कर सकता। सादर।
मेरे लिए काम करने के बाद, सभी स्थानीय प्रतिबद्ध परिवर्तन हटा दिए गए हैं और स्थानीय को दूरस्थ मूल / मास्टर शाखा के समान रीसेट कर दिया गया है।
git रीसेट - भार उत्पत्ति