2011-01-07 13 views
14

यह आमतौर पर मेरे साथ होता है कि मैं कुछ स्थानीय परिवर्तन करता हूं, केवल यह पता लगाने के लिए कि मैंने इसे गलत शाखा में बनाया है, इसलिए मुझे काम करने से पहले शाखा स्विच करने की आवश्यकता है। समस्या यह है कि स्थानीय परिवर्तन होने पर मैं शाखा स्विच नहीं कर सकता। क्या उसे करने का कोई तरीका है?जीआईटी: गैर-वर्तमान शाखा में स्थानीय परिवर्तन जोड़ना

जाहिर है, मैं अद्यतन फ़ाइलों की प्रतिलिपि बना सकता हूं, शाखा स्विच कर सकता हूं, फिर उन्हें कॉपी कर सकता हूं, लेकिन यह वास्तव में चालाक नहीं लगता है!

उत्तर

16

जब आप स्थानीय परिवर्तन करते हैं तो आप शाखाओं को स्विच कर सकते हैं जब तक कि आपके स्थानीय परिवर्तन दो शाखाओं के बीच अंतर के साथ संघर्ष न करें। इस मामले में आप चेकआउट करने के लिए -m या --merge विकल्प checkout का उपयोग कर सकते हैं और किसी भी तरह से विलय betwee परिवर्तन और शाखाओं स्विचिंग के कारण परिवर्तन कर सकते हैं।

git checkout -m other-branch 
9

जब ऐसा होता है तो मैं git stash का उपयोग करता हूं। यह कार्यशील प्रतिलिपि (कैश और अनचाहे दोनों फाइलों) की वर्तमान स्थिति का एक अस्थायी प्रतिबद्ध बनाता है और कार्यशील प्रति को वर्तमान HEAD में बदल देता है। फिर आप दूसरी शाखा में स्विच कर सकते हैं और git stash pop कर सकते हैं।

+0

मीठे। आपको बस यह सुनिश्चित करना होगा कि आपके परिवर्तन चरणबद्ध हैं। अच्छी तरह से काम। – helios

+0

बहुत चालाक, निश्चित रूप से कुछ छेड़छाड़ करना वास्तव में आसान बनाता है – Martin

2

जैसा कि अन्य ने कहा है, आप stash या checkout --merge का उपयोग कर सकते हैं। हालांकि उन विकल्पों में कुछ फाइल के टाइमस्टैम्प में बदलाव आएगा। यदि आप एक बड़ी परियोजना पर काम कर रहे हैं जहां संकलन में काफी समय लग सकता है (हमारी वर्तमान परियोजना वितरित बिल्डों के साथ संकलित करने में आधे घंटे लगती है), यह इष्टतम नहीं हो सकता है।

इस स्थिति में, आप सही शाखा में प्रतिबद्धता को स्थानांतरित करने के लिए एक और भंडार का उपयोग कर सकते हैं। सबसे पहले, आप (केवल एक बार करना होगा इस जरूरत को) अपने वर्तमान भंडार क्लोन करने के लिए की आवश्यकता होगी:

$ cd /path/to/repository 
$ git add path/to/modified/files 
$ git commit -m 'Commit message' 

अन्य भंडार में:

$ git clone /path/to/repository repository.clone 
$ cd repository.clone 
$ git remote add origin repository.clone 
$ git fetch origin 

फिर अपने मौजूदा भंडार में, आप अपने परिवर्तन के लिए प्रतिबद्ध , आप लाने के नए प्रतिबद्ध है, और सही शाखा पर ले जाते हैं:

$ cd ../repository.clone 
$ git fetch origin 
$ git checkout correct-branch 
$ git reset --hard origin/correct-branch 
$ git cherry-pick origin/current-branch 
$ # resolve conflicts if any, commit with -c option in this case 
$ git push origin correct-branch:correct-branch 

फिर मूल भंडार पर, आप निकालना अस्थायी प्रतिबद्ध है, और (जुड़े संशोधन को हटाने को छोड़कर आप k करना चाहते हैं उन्हें दोनों शाखाओं में लगाओ)।

$ cd /path/to/repository 
$ git reset HEAD^ 
$ # edit file and remove modifications moved to other branch 

यह अधिक जटिल है और इतिहास नए सिरे से लिखना शामिल है, लेकिन जब अपनी परियोजना वास्तव में बड़े हैं, और संकलन समय एक सीमित कारक है, यह तकनीक का पता करने के लिए महान हो सकता है। ध्यान दें कि आप क्लोन रिपोजिटरी का पुन: उपयोग कर सकते हैं, इसलिए प्रत्येक बार इसे हटाने/फिर से बनाने की आवश्यकता नहीं है (यदि संकलन समय लंबा है, तो भंडार शायद बड़ा है, और क्लोनिंग में कुछ समय लग सकता है)।

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