किसी फ़ाइल को अन-ऐड करने के लिए अंतिम प्रतिबद्ध में संशोधन कैसे करें?


104

मैं दो फ़ाइलों को संशोधित किया है a, bपिछले में करते हैं। लेकिन फ़ाइल bको कमिट नहीं किया जाना चाहिए, इसमें संशोधन करने के लिए क्या है?

जवाबों:


104

अपडेट (कुछ साल बाद)

जान हुदेक

यह केवल सूचकांक से हटाने के लिए तुच्छ है।

यह सच है: आप अपनी अनुक्रमणिका सामग्री को आसानी से पर्याप्त रूप से फ़ाइल को रीसेट कर सकते हैं, जैसा कि हाल ही में दिया गया उत्तर ( मैट कोनोली द्वारा लिखित ) बताता है:

git reset HEAD^ path/to/file/to/revert

HEAD^फ़ाइल को पिछले एक से पहले पिछली सामग्री में अपनी सामग्री तक पहुंचने की अनुमति देता है ।

फिर आप कर सकते हैं git commit --amend, जैसा कि मैंने मूल रूप से नीचे लिखा था।


मूल उत्तर (जनवरी 2011)

यदि यह आपकी अंतिम प्रतिबद्धता है (और आपने इसे कहीं भी नहीं धकेला है), तो आप इसमें संशोधन कर सकते हैं:
(पहला स्टाश या सेव b)

 git commit --amend

फिर बी हटाएं, फिर से कमिट करें। पुनर्स्थापना b और आपका काम हो गया।

--amend

वर्तमान शाखा की नोक में संशोधन करने के लिए उपयोग किया जाता है।
उस ट्री ऑब्जेक्ट को तैयार करें जिसे आप नवीनतम प्रतिबद्ध को हमेशा की तरह बदलना चाहते हैं (इसमें सामान्य -i / -o और स्पष्ट पथ शामिल हैं), और प्रतिबद्ध लॉग एडिटर को वर्तमान शाखा के सिरे से प्रतिबद्ध संदेश के साथ वरीयता दी जाती है।
आपके द्वारा बनाई गई प्रतिबद्धता वर्तमान टिप को बदल देती है - यदि यह एक मर्ज था, तो इसमें वर्तमान टिप के माता-पिता माता-पिता के रूप में होंगे - इसलिए वर्तमान शीर्ष प्रतिबद्ध को छोड़ दिया गया है।


... Then stash/delete b, re-commit.., यहाँ शब्द नहीं होना Thenचाहिए after? - --amendstach / delete b के बाद, ...
Xiè J stléi

@ @ B 雷: दूसरे शब्दों में, b को पहले सहेजें, फिर कमिट करें, फिर पुनर्स्थापित करें? सच। मैंने जवाब अपडेट कर दिया है।
VonC

Git index की शक्ति के साथ, किसी को भी फ़ाइल को स्टैश / सेव करने के लिए कहना सिर्फ सादा मूर्खतापूर्ण है (-1)। यह केवल सूचकांक से हटाने के लिए तुच्छ है।
जन हुदेक

1
@ जानहुडेक सच, मैंने जवाब उसी के अनुसार संपादित किया है। मैंने उस पुराने उत्तर का बारीकी से पालन नहीं किया जैसा कि मैं स्टैक ओवरफ्लो पर करता हूं। SU पर git के 99% प्रश्न वैसे भी SO पर माइग्रेट होने चाहिए।
वॉनसी

63
  1. git diff --name-only HEAD^ - (वैकल्पिक) अंतिम प्रतिबद्ध में परिवर्तित फ़ाइलों को सूचीबद्ध करने के लिए उपयोग करें।
  2. git reset HEAD^ path/to/file/to/revert- इंडेक्स को उस अंतिम संस्करण में रीसेट करने के लिए, काम की नकल को अछूता छोड़कर।
  3. git commit --amend- सूचकांक में बदलाव को शामिल करने के लिए अंतिम प्रतिबद्धता के लिए संशोधन करना

9
Imho यह एक बेहतर जवाब है तो स्वीकार कर लिया है।
mik01aj

1
ध्यान दें कि आपको git commit -a --amendचरण 3 के लिए (यानी फ़ाइलें न जोड़ें) का उपयोग नहीं करना चाहिए , या आप अपने कार्य की प्रतिलिपि में परिवर्तन करेंगे जो आप निकालने की कोशिश कर रहे हैं। एक वैकल्पिक चरण 2.5 git checkout path/to/file/to/revertआपके काम की प्रतिलिपि को भी साफ कर सकता है।
dmnd

1
वैकल्पिक रूप git rm --cached path/to/file/to/revertसे संयुक्त राष्ट्र की फाइल को पेड़ से हटाए बिना।
जन हुदेक

13

वैकल्पिक रूप से यदि आप उपयोग कर रहे हैं git gui, तो आप "अंतिम अंतिम प्रतिबद्ध" विकल्प का चयन करें, जोड़ा गया फ़ाइल "चरणबद्ध" सूची में दिखाई देता है, इसे "अनस्ट्रस्टेड" सूची में ले जाने के लिए आइकन पर क्लिक करें और प्रतिबद्ध करें।


1
@VonC: भारी गिट उपयोगकर्ताओं के लिए पैचिंग का संपादन और विभाजन काफी सामान्य ऑपरेशन है, इसलिए इसे आसान बनाने के लिए gui डिज़ाइन किया गया था और इसके लिए IMO सबसे अच्छा टूल है।
जान हुदेक

वह एक काम करता है! मैं उस विशेष कार्य के लिए अन्य विकल्पों के साथ सफल नहीं था। पारितोषिक के लिए धन्यवाद!
सर्गुज़ेस्ट

10

यदि आप अपने पिछले कमिट से b हटाना चाहते हैं

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

यदि आप अपनी अंतिम प्रतिबद्धताओं में बी में सभी परिवर्तनों को हटाना चाहते हैं

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

git rm --cachedऔर बैकअप / पुनर्स्थापना नृत्य (-1) के साथ दूर करें।
जन हुदेक

यह बात बताने के लिए धन्यवाद। मैं यह साझा करना चाहता था कि मैंने यह कैसे किया क्योंकि यह वह दृष्टिकोण था जिसे मैंने पूरे धागे को पढ़ने के बाद भी सबसे सहज महसूस किया था।
'10

4

एक विकल्प जिसमें सूचकांक हैकरी की आवश्यकता नहीं होती है, लेकिन फिर भी पुराने प्रतिबद्ध संदेश को संरक्षित करता है:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

मुझे यह पसंद है क्योंकि (ए) यह उन आज्ञाओं का उपयोग करता git add -pहै जिन्हें मैं नियमित रूप से उपयोग करता हूं, और (बी) मैं यह पता लगाने के लिए कर सकता हूं कि यह वही है जो मैं करना चाहता हूं।

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