2010-01-08 14 views
15

यहां स्थिति है। मैं master शाखा पर काम कर रहा हूं। मैं file1 बनाते हैं और प्रतिबद्ध करते हैं। मैं file2 बनाते हैं और प्रतिबद्ध करते हैं। ओह। मैं किसी दिन फ़ाइल 2 का उपयोग करना चाहूंगा, लेकिन यह निश्चित रूप से कुछ नहीं है जिसे मास्टर शाखा में रखा जाना चाहिए। इसलिए कि मैं फ़ाइल 2 नहीं खोता हूं, मैंगिट: मैं विलय पर सभी स्थानीय परिवर्तनों को कैसे ओवरराइट कर सकता हूं?

git checkout head~1 
git branch new-branch 
git checkout new-branch 

का उपयोग करता हूं ताकि मैं विकास जारी रख सकूं। मैं फ़ाइल 3 को new-branch में जोड़ता हूं। यदि आप ध्यान दे रहे हैं, तो मुझे दो शाखाएं मिली हैं, master जिसमें "file1" और "file2" और new-branch शामिल हैं जिनमें "file1" और "file3" है।

अब मास्टर शाखा में किए गए परिवर्तनों को प्राप्त करने का समय है। ऐसा करने का सबसे अच्छा तरीका क्या है? new-branch में दिखाई देने वाली फ़ाइलों को इंगित करने के लिए मैं निश्चित रूप से master शाखा का सिर चाहता हूं, लेकिन अगर मैं इसका उपयोग करना चाहता हूं, तो मैं रीसेट करके फ़ाइल 2 में किए गए काम को भी खोना नहीं चाहता हूं।

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

कोई विचार?

+0

आपने कहा "ऐसा लगता है कि यह मुझे चाहिए", लेकिन क्या आपने शाखा को स्विच करने का प्रयास किया जैसा कि मैंने अपने उत्तर में इंगित किया है? – VonC

+0

मैंने किया। रंदल का जवाब मेरे समाधान के करीब भी था। यह पता चला है कि कुंजी 'गीट रीसेट - हार्ड हेड ~ 1' है। मुझे एहसास नहीं हुआ कि आप एक कमांड के साथ काम करने की स्ट्रिंग को रीसेट कर सकते हैं। मुझे बस इतना करना है कि वर्तमान मास्टर शाखा से शाखा है, फिर वापस जहां मैं घबराहट करना शुरू कर दिया। – kubi

उत्तर

3

में मैं मास्टर शाखा पर काम कर रहा हूँ। मैं फ़ाइल 1 बनाएँ और प्रतिबद्ध करें।

date >file1 
git add file1 
git commit -m 'added file1' 

मैं करें 2 बना सकते हैं और करते हैं।

date >file2 
git add file2 
git commit -m 'added file2' 

ओह। मैं किसी दिन फ़ाइल 2, का उपयोग करना चाहूंगा, लेकिन यह निश्चित रूप से कुछ नहीं है जिसे मास्टर शाखा में रखा जाना चाहिए।

ओह। बहुत आसान।

git checkout -b savingfile2 

यह करें 2 बदल savingfile2 के लिए प्रतिबद्ध कर देगा: तुम कहाँ से एक नई शाखा करें। अब वापस जाने के लिए और इस बिंदु पर मास्टर

git checkout master 
git reset --hard HEAD~1 

पर एक कदम तनाव कम, प्रतिबद्ध मास्टर करने के लिए अग्रणी file1, के अलावा प्रतिबिंबित करेगा और अतिरिक्त मास्टर और savingfile2 के बीच प्रतिबद्ध है कि करने के लिए करें 2 के अलावा होगा ।

आप मास्टर के लिए और अधिक परिवर्तन करें, और फिर वापस अंततः करें 2 लाना चाहते हैं, तो आप नए मास्टर पर उस तरफ शाखा rebase चाहता हूँ:

date >file3 
git add file3 
git commit -m 'adding file3' 
date >file4 
git add file4 
git commit -m 'adding file4' 

और अब हम अंत में करें 2 हैं:

git checkout savingfile2 
git rebase master # might need to fix conflicts here 
git checkout master 
git merge savingfile2 # will be a fast-forward 
git branch -d savingfile2 # no need any more 

ऐसा करना चाहिए।

+0

"गिट मर्ज savefile2 # एक तेज़ आगे होगा" <- यह सुनिश्चित करने के लिए '--ff-only' जोड़ने के बारे में क्या? – weakish

+0

@weakish - वह विकल्प उत्तर से नया है। :) –

1

आप क्या करना चाहिए जब आप करें 2 करने से की अपनी गलती देखा है कि तुम क्या करना चाहिए था है: पूर्ववत प्रतिबद्ध (एक नई शाखा बनाने के बजाय):

git checkout master 
git reset HEAD^ 

इस पत्ते करें 2 ट्रैक न किए गए और कोई नुकसान नहीं पहुंचा और संभव संशोधन uncommited। तो फिर तुम (है) चाहिए stash (ईडी) मामले में uncommited संशोधनों आप उन्हें बाद में उपयोग करना चाहते हैं:

:

git stash save "modifications that should not be in the master branch" 

stashing किसी भी स्थानीय परिवर्तन, जो masternew-branch इंगित किए जाने के लिए अनुमति देता है से छुटकारा मिलता है

git merge new-branch 

यहां लक्ष्य दो शाखाओं के बीच विचलन को खत्म करना था, यानी masternew-branch के पूर्वजों को बनाना था। इस तरह कोई वास्तविक विलय नहीं होना चाहिए, और अंतिम आदेश केवल तेजी से आगेmaster शाखा (बशर्ते कोई स्थानीय परिवर्तन न हो)।

+0

यह काम कैसे करेगा यदि मैंने ध्यान से पहले अपनी मास्टर शाखा पर कई काम किए हैं? 'गिट रीसेट' सिर्फ सिर को रिवाइंड करने जा रहा है, मुझे उन अनुचित कामों को स्थानांतरित करने की अनुमति नहीं है, है ना? – kubi

+0

जब तक प्रतिबद्धता को कहीं भी धक्का नहीं दिया जाता है, तब तक आप प्रतिबद्ध इतिहास के साथ मनमाने ढंग से काम करने के लिए (इंटरैक्टिव) 'रीबेज' का उपयोग कर सकते हैं (जैसा कि 'गिट रीसेट' के विपरीत) है। –

1

चूंकि आपने optimal workflow का पालन नहीं किया है, Tomi Kyöstilä द्वारा वर्णित है, लेकिन चूंकि आपने अभी तक कुछ भी प्रकाशित नहीं किया है, इसलिए दो शाखाओं को क्यों नहीं स्विच करें?
(बशर्ते सब कुछ प्रतिबद्ध है)

master और new-branch बस कुछ SHA1 करने के लिए कुछ संकेत दिए गए हैं:

$ git checkout master    #start from master 
$ git branch tmp     # tmp points on master HEAD 
$ git checkout new-branch   # switch to new-branch 
$ git branch -f master new_branch # master points at new-branch HEAD 
$ git checkout tmp     # switch back to *former* master branch 
$ git branch -f new_branch tmp  # new-branch points at former master HEAD 
$ git checkout master    # go to new master 
$ git branch -D tmp    # remove tmp pointer 

... और बस हो गया।
(अस्वीकरण: अभी तक परीक्षण किया है, इसलिए सावधानी से यह कोशिश नहीं;))

देखें:

  • पैराग्राफ में एक समान दृष्टिकोण "Branching and merging with git" की "फिक्सिंग गलतियों git-reset बिना",
  • और भी this thread
+0

ऐसा लगता है कि मुझे क्या चाहिए। धन्यवाद! – kubi

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

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