2011-12-13 11 views
27
git mv file1 file2 

git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# renamed: file1 -> file2 

git stash 
git stash pop 

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# new file: file2 
# 
# Changes not staged for commit: 
# (use "git add/rm <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# deleted: file1 

जैसा कि आप देख सकते हैं, गिट एक स्टैश/पॉप के बाद नामित रिश्ते को खो देता है। क्या इस रिश्ते को वापस पाने का कोई तरीका है, या छेड़छाड़ है कि फाइलें चली गईं? मैं अक्सर यह देखने के लिए छेड़छाड़ करता हूं कि मेरा सिस्टम राज्य पूर्व-परिवर्तनों की तरह क्या है, लेकिन नाम बदलने के संबंध में यह मेरे लिए एक समस्या है। मुझे नहीं पता कि नई फाइल को हटाने, फिर से एक गिट एमवी करने और नई फाइल की सामग्री को बदलने के अलावा इसे कैसे ठीक किया जाए।गिट स्टैश और पॉप शो फ़ाइल अब स्थानांतरित के रूप में चिह्नित नहीं है?

+1

नोट करने के लिए इस विकल्प का उपयोग: कि wo गिट 2.12 (क्यू 1 2017) के साथ फिर कोशिश करने के लिए दिलचस्प हो। Http: // stackoverflow देखें।कॉम/ए/41307892/630 9 – VonC

उत्तर

26

आप पहले से ही गुप्त कोष में पॉप नहीं किया है, कार्य करें:

git stash pop --index 

यह सही ढंग से ले जाया गया है (लेकिन प्रतिबद्ध नहीं) को बरकरार रखता है एक गुप्त कोष में फाइल संबंधों। git help stash के अनुसार:

तो --index विकल्प प्रयोग किया जाता है, तो न केवल काम कर पेड़ के परिवर्तन, लेकिन यह भी सूचकांक के लोगों को बहाल करने के लिए प्रयास करता है। हालांकि, यह असफल हो सकता है, जब आपके पास विवाद होते हैं (जो इंडेक्स में संग्रहीत होते हैं, जहां आप मूल रूप से परिवर्तनों को लागू नहीं कर सकते हैं)।

तो आप पहले से ही गुप्त कोष में पॉप और चले गए रिश्ते को फिर से बनाने के लिए चाहते हैं, करते हैं:

:

git rm --cached file1 

यह सूचकांक से "पुराने" स्थिर फ़ाइल को हटा

unstage और केवल सूचकांक से रास्तों को दूर

+2

मुझे नहीं पता कि यह @ Jefromi के –

+2

की तुलना में बेहतर जवाब है या नहीं, तो गिट स्टैश पॉप -इंडेक्स बेहतर है यदि आपको पहली बार ऐसा करना याद है। लेकिन अगर आप पहले इंडेक्स को पॉप करना भूल गए थे, तो 'git rm --cached file1' आपको वापस ले जाएगा जहां फ़ाइल 2 का नाम बदल दिया गया है। –

+0

यह थोड़ा सा कष्टप्रद है। गिट में हमेशा इन छोटे फूबल्स क्यों होते हैं जो आपको पकड़ने के लिए वहां लगते हैं !? – Steve

18

लघु जवाब: git rm --cached file1

सभी git mv वास्तव में करता है (फाइल सिस्टम पर) फ़ाइल का नाम बदलने और उसके बाद सूचकांक (मंचन क्षेत्र) के लिए एक फ़ाइल हटाने और निर्माण जोड़ने है। यह विशेष रूप से चिह्नित नहीं है। बाद में अन्य मशीनरी को यह एहसास हुआ कि यह एक नाम था, यह देखते हुए कि फ़ाइल को पहले फ़ाइल 1 कहा जाता था अब फाइल 2 कहा जाता है।

चूंकि git stash कमांड इंडेक्स को संशोधित करते हैं, तो वे चीजों को परेशान कर सकते हैं। ध्यान दें कि अब आपके पास सृजन का मंचन है, लेकिन हटाना नहीं! (आम तौर पर गिट-स्टैश एक पॉप के बाद सबकुछ खराब हो जाता है, लेकिन इस मामले में मुझे लगता है कि इसमें कोई फ़ाइल नहीं है, लेकिन यह जानने से बचने के लिए कि आपको कौन सा रखना है। आप इससे बच सकते हैं कभी भी git stash pop --index के साथ हो रहा है, लेकिन अगर बशर्ते परिवर्तनों को स्पष्ट रूप से लागू नहीं किया जा सकता है, तो यह बम बाहर हो सकता है, इसलिए यह डिफ़ॉल्ट नहीं है।) git status संभवतः इसे नाम के रूप में नहीं दिखाया जा सकता है, क्योंकि नाम प्रभावी रूप से इंडेक्स और काम के बीच विभाजित है पेड़, और न तो अनुभाग पूरी तरह से दावा कर सकते हैं।

हटाए जाने के लिए बस git rm --cached file1 चलाएं (यानी अनुक्रमणिका से फ़ाइल 1 हटाएं) और यह फिर से नाम के रूप में दिखाई देगा। आप स्वचालित रूप से परिवर्तन जोड़ने के लिए git add -u चला सकते हैं, जब तक आपके पास कोई अन्य परिवर्तन नहीं है जिसे आप मंच नहीं करना चाहते हैं।

ध्यान दें कि इसका मतलब है कि अभ्यास में आपको चिंता करने की आवश्यकता नहीं है: जब आप तैयारी में सबकुछ ठीक से लेते हैं (उदाहरण के लिए git add -u), "समस्या" स्वयं का ख्याल रखती है।

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