2011-04-14 10 views
102

में आंशिक रूप से वापस कर सकता हूं क्या बहु फ़ाइल प्रतिबद्धता में फ़ाइल में केवल एक फ़ाइल या कुछ बदलावों को वापस करना संभव है?क्या मैं जीआईटी

पूर्ण कहानी मैंने फ़ाइलों का एक समूह किया। बाद में कई लोग काम करते हैं जो नामहीन रहेंगे (जैक !!!) ने अपनी फाइल को अपनी रिपोजिटरी में कॉपी किया और कई फाइलें कीं, मैंने किए गए कुछ बदलावों को ओवरराइट किया। मैं एक फ़ाइल को वापस लेना चाहता हूं जो अभी तक गिर गया है या बेहतर है, उस फ़ाइल में दो बदलावों को वापस लाएं और वापस लाएं। इसे खींचने और धक्का देने के बाद से इसे एक अलग रिवर्ट प्रतिबद्ध होना होगा।

+0

ब्रायन ने मुझे सही रास्ते पर ले लिया। मैं गेट ऐड-पैच का उपयोग कर समाप्त हुआ, फिर पैच के अंदर संपादन फ़ंक्शन का उपयोग करके जो चाहता था उसे प्राप्त करने के लिए। – Clutch

+1

मैं खेल के लिए बहुत देर हो चुकी हूं, लेकिन मुझे लगता है कि मुझे [सही "जवाब] मिला है (http://stackoverflow.com/a/23401018/470844)। – ntc2

उत्तर

141

आप '--no-commit' विकल्प जोड़कर एक नया निर्माण किए बिना प्रतिबद्धता को वापस कर सकते हैं। यह स्टेजिंग क्षेत्र में सभी उलटी हुई फ़ाइलों को छोड़ देता है। वहां से, मैं एक सॉफ्ट रीसेट करूँगा और वास्तव में इच्छित परिवर्तनों में जोड़ूंगा। एक उदाहरण के कार्यप्रवाह के लिए:

git revert <sha-of-bad-commit> --no-commit 
git reset // This gets them out of the staging area 
<edit bad file to look like it should, if necessary> 
git add <bad-file> 
git checkout . // This wipes all the undesired reverts still hanging around in the working copy 
git commit 
+34

मुलायम रीसेट करने के बाद, आप एक इंटरैक्टिव सत्र शुरू करने के लिए 'गिट ऐड-पी' भी कर सकते हैं जो आपको पूरी फाइलों के बजाय फ़ाइलों के चयनों को चुनिंदा रूप से जोड़ने की अनुमति देता है। (चुनिंदा अस्थिर परिवर्तनों के लिए 'गिट रीसेट -पी' भी है। जानना अच्छा है, लेकिन शायद इस परिदृश्य में आप जो चाहते हैं उसे नहीं।) –

+1

वाह यह अविश्वसनीय रूप से उपयोगी है, धन्यवाद! – pfrenssen

+1

यह वही था जो मैं ढूंढ रहा था: काम करने की प्रतिलिपि में वापस लौटें, हंक्स को इंटरैक्टिव रूप से चुनें, प्रतिबद्ध करें। इसके लिए आप एक बड़े, नमकीन आदमी-स्मोच के लायक हैं: * –

37

तुम बस मैन्युअल रूप से बाहर फ़ाइलें आप git checkout का उपयोग कर वापस करना चाहते हैं के पुराने, अच्छा सामग्री की जाँच कर सकते हैं। उदाहरण के लिए, यदि आप संस्करण यह संस्करण abc123 में था करने के लिए my-important-file वापस करना चाहते हैं, तो आप

git checkout abc123 -- my-important-file 

अब आप my-important-file की पुरानी सामग्री वापस कर सकते हैं, और यहां तक ​​कि उन्हें संपादित कर सकते है अगर आप की तरह लग रहा है, और एक प्रतिबद्धता बनाने के लिए सामान्य रूप से प्रतिबद्ध करें जो उसने किए गए परिवर्तनों को वापस कर देगा। यदि उसके प्रतिबद्ध होने के कुछ हिस्सों हैं जिन्हें आप वापस करना चाहते हैं, तो आप जिस पैच से काम कर रहे हैं उससे केवल कुछ शिकारी चुनने के लिए git add -p का उपयोग करें।

+17

यह 'रिवर्ट' नहीं है, आप बस फ़ाइल का पुराना संस्करण वापस ले रहे हैं। एक उचित 'वापसी' फ़ाइल के भीतर खराब प्रतिबद्धता संशोधन को हटा देगा, भले ही इसे उस खराब प्रतिबद्धता के बाद कई बार संशोधित किया गया हो, और आप ** ** ** संशोधनों को हटाना नहीं चाहते हैं। – Totor

+2

तोटर, मेरा जवाब देखें। आप संशोधन को बचाने के लिए '-p' का उपयोग कर सकते हैं। जवाब वास्तव में इस के बहुत करीब है। – cmcginty

+1

या आप इसे 'गिट चेकआउट -पी' में जोड़ सकते हैं। –

64

आप checkout कमांड का उपयोग कर फ़ाइल के पुराने संस्करण को अंतःक्रियात्मक रूप से लागू कर सकते हैं।

उदाहरण के लिए, यदि आप COMMIT जहां वापस जोड़ने के लिए कोड हटा दिया गया था पता है, तुम निम्न आदेश चला सकते हैं:

git checkout -p COMMIT^ -- FILE_TO_REVERT 

Git जिसे कि वर्तमान से याद कर रहे हैं वापस जोड़ने के लिए संकेत देगा फ़ाइल का संस्करण। आप इसे लागू करने से पहले परिवर्तन का पैच बनाने के लिए e का उपयोग कर सकते हैं।

+0

बहुत उपयोगी अगर आप केवल फाइल का हिस्सा वापस करना चाहते हैं! असल में, सिर से भाग प्राप्त करने के लिए, 'गिट चेकआउट -पी पथ/से/फ़ाइल' – falstaff

21

मैं Git मेलिंग सूची पर यह करने के लिए एक रास्ता मिल गया:

git show <commit> -- <path> | git apply --reverse 

स्रोत: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406

बदलाव

आदेश विफल रहता है (कोई बदलाव हो) अगर पैच लागू नहीं होता साफ-सफाई, लेकिन --3way के साथ आप इसके बजाय संघर्ष प्राप्त कर सकते हैं जिसे आप मैन्युअल रूप से हल कर सकते हैं (इस मामले में Casey's answer अधिक व्यावहारिक हो सकता है):

git show <commit> -- <path> | git apply --reverse --3way 

आप भी इस का उपयोग कर सकते आंशिक रूप से कई प्रतिबद्ध वापस लौटने के लिए, उदा .: किसी भी प्रतिबद्ध में <string> मिलान में परिवर्तन के साथ

git log -S<string> --patch | git apply --reverse 

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

आप अपने ~/.gitconfig में diff.noprefix=true सेट है तो आप git apply आदेश, उदा को -p0 जोड़ने की जरूरत

git show <commit> -- <path> | git apply -p0 --reverse 
+0

यह उत्तर स्वीकार किए गए एक से बेहतर है: "बेहतर अभी तक, उस फ़ाइल में दो परिवर्तनों को वापस करें और वापस लाएं"। – rewritten

संबंधित मुद्दे