Git में पहला कमिट कैसे निकालें?


179

मैं इस बात को लेकर उत्सुक हूं कि पहले कमिट को कैसे हटाया जाए।

किसी भी चीज को करने से पहले संशोधन क्या है? क्या इस संशोधन में कोई नाम या टैग है?


2
गिट के साथ एक शुरुआत के लिए, आपको पता होना चाहिए कि संशोधन अर्थहीन है। आप कमिट या उनके रिश्तेदार SHAs के बारे में बात कर सकते हैं। इसके अलावा, आप ऐसा क्यों करना चाहेंगे? पहला कमिट वही है जो सब कुछ पर बनाया गया है। आप पहले कमिट सहित कुछ कमिट्स स्क्वैश कर सकते हैं, जो नई पहली कमिटमेंट बन जाती है, लेकिन पहली कमिट को डिलीट करने का भी क्या मतलब है (या किसी भी कमिट को डिलीट करना)?
शहबाज

@ शहबाज यस, सबसे अच्छा तरीका है, उदाहरण के लिए यहां देखें: ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one
timaschew

5
आप उपयोग कर सकते हैं git rebase -i --root। विवरण के लिए निम्नलिखित SO उत्तर देखें: stackoverflow.com/questions/2246208/…
MKroehnert


इस उत्तर में वर्तमान शाखा की जड़ को हटाने का सही समाधान है:git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
योदी ब्रूचॉन

जवाबों:


320

मेरे लिए, update-refकमांड का उपयोग करने का सबसे सुरक्षित तरीका है :

git update-ref -d HEAD

यह नामित संदर्भ को हटा देगा HEAD, इसलिए यह रीसेट हो जाएगा (धीरे-धीरे, आप अपना काम नहीं खोएंगे) आपकी वर्तमान शाखा के सभी कमिट

यदि आप जो चाहते हैं वह पहले वाले को दूसरे के साथ मिलाना है, तो आप rebaseकमांड का उपयोग कर सकते हैं :

git rebase -i --root

एक अंतिम तरीका एक अनाथ शाखा, एक ही सामग्री के साथ एक शाखा बनाने के लिए हो सकता है लेकिन किसी भी इतिहास के बिना, और उस पर अपना नया इतिहास बनाएं:

git checkout --orphan <new-branch-name>

7
यह बहुत बुरा है कि यह स्वीकृत उत्तर नहीं है। यह भी बहुत बुरा है कि Google पर अधिकांश हिट कम या ज्यादा कहते हैं "आप पहले कमिट को पूर्ववत नहीं कर सकते"। इसने मेरे लिए चाल चली। धन्यवाद!
danielpops

1
आपके समर्थन के लिए @danielpops धन्यवाद! यह नोटिस करना अच्छा है कि मैंने 3 साल बाद इस सवाल का जवाब दिया। इस बीच गिट ने उकसाया है।
तजि

मैंने रिबास का उपयोग किया, दूसरी प्रतिबद्ध को "स्क्वैश" के रूप में चिह्नित किया, और फिर मूल करने के लिए --फोर्स पुश किया। धन्यवाद!
फिलिप एटज

1
git update-ref -d HEAD सभी इतिहास को हटाने का सबसे सुरक्षित तरीका है, न कि केवल प्रारंभिक कमिट।
user1767316

मैंने इसे किया और इसने मेरी सभी फाइलें हटा दीं जिन्हें मैंने पहली प्रतिबद्ध में जोड़ा था। दुखी। कम से कम यह ज्यादा नहीं था
व्याचेस्लाव त्सविना

42

पहले कमिट के पहले कुछ भी नहीं है, क्योंकि हर कमिट एक पैरेंट कमिट का हवाला दे रहा है। यह पहली प्रतिबद्ध को विशेष (एक अनाथ प्रतिबद्ध) बनाता है, इसलिए पिछले "राज्य" को संदर्भित करने का कोई तरीका नहीं है।

इसलिए यदि आप कमिट को ठीक करना चाहते हैं, तो आप बस git commit --amendयह कर सकते हैं : यह एक और बनाने के बिना कमिट को संशोधित करेगा।

यदि आप अभी शुरू करना चाहते हैं, तो .gitरिपॉजिटरी को हटा दें , और एक और बना लेंgit init


7
यह उत्तर गलत है: पहले प्रतिबद्ध से पहले राज्य में वापस जाने का एक तरीका है। नीचे देखिए tzi का जवाब
डेविड नेल्सन

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

11
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH

# Add all the files:
git add -A

# Commit the changes:
git commit -am "Initial commit"

# Delete the old branch:
git branch -D master

# Rename the temporary branch to master:
git branch -m master

# Finally, force update to our repository:
git push -f origin master

3
उत्तर नहीं: प्रश्न था, "पहली प्रतिबद्ध को कैसे हटाया जाए", न कि "अंतिम प्रतिबद्ध को छोड़कर सभी को कैसे हटाया जाए"।
पेटेर - मोनिका

1
मैं बिल्कुल इसके लिए देख रहा था। धन्यवाद!
Krzysztof Tomaszewski

6

आप बस अपना पहला कमिट संपादित करना चाहते हैं (जैसा कि जीआईटी रेपो में हमेशा पहला कमिट होता है)। git commit --amend --reset-authorसामान्य के बजाय उपयोग करने पर विचार करें git commit --amend


1
उत्तर नहीं: प्रश्न पहले कमिट को हटाना चाहता था, और पिछले एक के गुणों को संशोधित नहीं करना चाहता था।
पेटेर -

@ peterh-ReinstateMonica स्पष्टीकरण के लिए: अपनी सामग्री को पूरी तरह से बदलने के लिए इंटरएक्टिव रिबेस के दौरान कमिट में संशोधन किया जा सकता है, लेकिन लेखक को बदलने के लिए -सेट-लेखक को भी प्रदान करने की आवश्यकता है। उस के साथ, आप पहली पसंद को अपनी पसंद के अनुसार पूरी तरह से बदल सकते हैं। चार्ल्सबी का उत्तर भी देखें।
मैक्स बिकिरच

3

मैं एक रेपो से सभी कामों को पूर्ववत् करने का एक रास्ता खोज रहा था, जैसे वे कभी नहीं हुए।

रीबेसिंग एक बिंदु तक काम करेगा। हालांकि, बहुत पहले (कालानुक्रमिक रूप से सबसे पुराना गिट कमिट) हमेशा समस्याग्रस्त रहने वाला है, क्योंकि इसमें माता-पिता नहीं होते हैं, इसलिए यह गलती करेगा।

इनमें से किसी भी उत्तर ने मेरे लिए इसे हल नहीं किया। लेकिन बहुत खोज और परीक्षण और त्रुटि के बाद, मुझे यह काम करने के लिए मिला!

git update-ref -d HEAD
git push origin master -f

आशा है कि यह आपकी मदद करता है। आपका दिन अच्छा रहे।


1
इस उत्तर को पढ़ने वाले किसी भी व्यक्ति के लिए स्पष्ट होना: यह हर कमिट को हटा देता है, लेकिन ओपी केवल रेपो के लिए किए गए पहले कमिट को हटाना चाहता है; इसे पहले कमिट को हटाने के लिए न चलाएँ क्योंकि यह सभी कमिट को हटा देगा।
जॉडी ब्रूचोन

2

एक और तरीका है जो आप कर सकते हैं:

  1. उस शाखा को चेकआउट करें जिसे आप रखना चाहते हैं (देव) git checkout dev
  2. अब, उस शाखा को हटा दें जिसे आप रीसेट करना चाहते हैं git branch -D master
  3. अब, उसी नाम से एक खाली शाखा बनाएं git checkout --orphan master

बेशक, यह सब आपके usecase पर निर्भर करेगा, लेकिन यदि आपके पास एक से अधिक शाखाएं हैं, तो .gitनिर्देशिका को हटाने का कोई मतलब नहीं है।


3
ऐसा करने के बाद, आपको धक्का देने से पहले रिमोट में शाखा को हटाना होगा। अन्यथा, जब आप धक्का देने की कोशिश कर रहे हैं तो आपको यह त्रुटि होगी:! [अस्वीकृत] मास्टर -> मास्टर (गैर-फास्ट-फ़ॉर्वर्ड) - त्रुटि: 'git@github.com: r1 / r2.git' के कुछ रीफ़्स को पुश करने में विफल रहा - संकेत: अपडेट अस्वीकार कर दिए गए क्योंकि आपकी वर्तमान शाखा का टिप पीछे - संकेत: इसका दूरस्थ समकक्ष। फिर से पुश करने से पहले दूरस्थ परिवर्तनों (जैसे संकेत: 'गिट पुल ...') को एकीकृत करें ... - यदि आप एक गिट पुल करते हैं तो सभी कमिट वापस आते हैं।
dxvargas

2

यदि आप अन्य शाखाओं को रखना चाहते हैं, लेकिन उदाहरण के लिए masterशाखा को सामान्य इतिहास के बिना अन्य शाखाओं के लिए नए सिरे से शुरू करते हैं, तो इसे प्राप्त करने का एक सुरक्षित तरीका एक नया भंडार बनाना है, और उस सामग्री को अपने पुराने में धकेलना है:

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

यह newmasterपुरानी रिपॉजिटरी में शाखा बनाता है, इतिहास के साथ जो अन्य शाखाओं में से किसी के साथ आम नहीं है। बेशक, आप बस के masterरूप में अच्छी तरह से अधिलेखित कर सकते हैं git push -f

यदि आप सभी शाखाओं और सभी मौजूदा सामग्री को नष्ट करना चाहते हैं, तो बस चलाएं

rm -rf .git/

1
कोई उत्तर नहीं: ओपी पहले कमिट को हटाना चाहता था, न कि प्रारंभिक कार्य के रूप में वर्तमान कार्यशील पेड़ के साथ एक नया गिट रेपो शुरू करना चाहता था।
पेटेर -

@peterh मैं सहमत हूं git rebase --rootकि शायद ओपी चाहता था, लेकिन इस जवाब पर विचार करने के दो मायने हैं, मैं इसे हटाने से बचना चाहूंगा अगर कोई इसे अभी भी प्रासंगिक पाता है।
user1338062

मुझे लगता है कि इस सवाल का जवाब वास्तव में प्रासंगिक है - अगर आप पहली बार कुछ शाखा में प्रतिबद्ध हटाना चाहते हैं, और वहाँ है केवल एक प्रतिबद्ध! (लेकिन आप अन्य शाखाओं में भी कमिट रखना चाहते हैं; और आप ऐसा इसलिए भी करना चाहते हैं ताकि बिटकॉइन या गीथूब में बदलाव स्थानीय स्तर पर ही न हों।) मेरा मानना ​​है कि यह उत्तर ऐसा करने का एक तरीका है, और मुझे लगता है कि यह ऐसा करने का एकमात्र तरीका हो सकता है। (ऐसा इसलिए है - क्योंकि जहाँ तक मैं देख सकता हूँ - एक स्थानीय शाखा को किसी भी तरह से कमिट के साथ रिमोट शाखा पर कोई जोर लगाने के लिए मजबूर करने का कोई तरीका नहीं है।)
माइकबैटन

0

तुम सिर्फ यह किया है, लेकिन धक्का दिया नहीं तो यह तो बस हटाने .git निर्देशिका और git initफिर ...


@peterh हाँ यह करता है। आप मान रहे हैं (मुझे लगता है) कि ओपी का सवाल पहले कमिट को हटाने के बारे में है, लेकिन बाद में कमिट रखना चाहते हैं। एक और संभावना (जो मुझे लगता है कि ओपी के सवाल से पूरी तरह से मेल खाती है - और जो इस जवाब का जवाब है) पहले और केवल एक शाखा से कमिट करना चाहता है, इसे फिर से पूरी तरह से खाली करने के लिए वापस।
माइक बीटन

@ माइकबटन आप सही कह रहे हैं। मैं अपनी टिप्पणी को हटाता हूं, लेकिन फिर मुझे अस्पष्ट के रूप में प्रश्न को बंद करने के लिए वोट करने की आवश्यकता है। ध्यान दें, हालांकि केवल मुझे यह टिप्पणी दी गई थी, लेकिन मेरे पीछे 40000 आगंतुक थे, और उनमें से एक महत्वपूर्ण भाग को यह सवाल Google से मिला - और उन्हें वह नहीं मिला जो वे चाहते थे।
पीटर - मोनिका

यह चरम लगता है। प्रश्न हटाएं? क्या यह (पूरी तरह से ठीक नहीं) तर्क दिया जा सकता है कि पूरी तरह से उचित प्रश्न का एक पूर्ण उत्तर यह है कि दो अलग-अलग दृष्टिकोण हैं जिन्हें लेने की आवश्यकता है, क्या यह निर्भर करता है ... आदि? (मेरा मतलब है, मैं, एक के लिए, होगा निकालने का तरीका जानना चाहते पहली प्रतिबद्ध है जब यह केवल नहीं है प्रतिबद्ध हैं, और भी निकालने का तरीका पहले प्रतिबद्ध है जब यह है केवल करते हैं। यह निश्चित रूप से स्पष्ट नहीं है, और निश्चित रूप से निर्भर करता है विशिष्ट विवरणों को लागू करने पर, यह वास्तव में यह पता चलता है कि वास्तव में प्रत्येक मामले में अलग-अलग दृष्टिकोणों की आवश्यकता है।)
माइकबैटन

0

प्रश्न का उत्तर इस बात पर निर्भर करता है कि:

  • आप पहले और केवल एक शाखा पर कमिट करना चाहते हैं (अन्य शाखाओं को छोड़ते हुए जैसे वे थे), या चाहे

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

इनमें से दूसरा अपेक्षाकृत सरल है। आपको अनिवार्य रूप से रूट पर रिबेट करना होगा - यहां अधिकांश उत्तर ऐसा करने के तरीकों के बारे में हैं।

दूसरा करने के लिए (पहली और केवल अन्य शाखाओं को छोड़कर एक शाखा से कमिट करना) कठिन है। या, कम से कम, विशेष रूप से कठिन अगर आप इसे चाहते हैं और परिवर्तन के लिए वापस GitHub या Bitbucket में परिलक्षित होना चाहिए। वहाँ है (जहाँ तक मैं बता सकता हूँ) कोई रास्ता नहीं हिट करने के लिए या बल में कोई धक्का के साथ एक शाखा धक्का करने के लिए। और वहाँ भी (फिर से, जहाँ तक मैं देख सकता हूँ) GitHub या Bitbucket में इस पर कोई भी कमिट नहीं के साथ एक नई, खाली शाखा बनाने का कोई तरीका नहीं है। तो आपको अनिवार्य रूप से एक पूरी तरह से खाली शाखा बनाने के लिए एक नया भंडार बनाना होगा, और फिर उन शाखाओं को जोड़ना होगा जो आप चाहते हैं (कमिट जो आप चाहते हैं सहित) - @ user1338062 के उत्तर के अनुसार।

इसलिए मुझे आशा है कि यह उत्तर स्पष्ट करता है कि क्या स्पष्ट नहीं हो सकता है - कि दो अलग-अलग दृष्टिकोण हैं जिन्हें लेने की आवश्यकता है, दो अलग (अधिक या कम उचित) परिदृश्यों के लिए दोनों चीजें हैं जो आप कर सकते हैं, क्रम में। पूरी तरह से मास्टर जो ओपी पूछता है करने के लिए।

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