स्विच किए बिना एक और गिट शाखा के लिए खींचो


55

हमने हाल ही में SVN से Git में स्विच किया और उसी समय हमारे लाइव सिस्टम को संस्करण नियंत्रण में रखा (बजाय स्थानीय चेकआउट और लाइव करने के लिए फ़ाइल कॉपी)।

इस परियोजना के लिए, हम सभी को एक ही रिपॉजिटरी का उपयोग करने के लिए सौंपा गया है और हम अभी git pullवहाँ रहते हैं । इसके कारण समस्याएँ होती हैं क्योंकि हमारे वेबसाइनर्स VCS में परिवर्तन को धक्का देते हैं जो कि अभी तक लाइव नहीं होना चाहिए लेकिन वेब-परीक्षण वातावरण पर होना चाहिए।

जब डेवलपर्स में से एक अब लाइव में खींचता है तो उसे सभी (संभवतः अपूर्ण) परिवर्तन मिलते हैं।

मैंने लाइव को एक अतिरिक्त शाखा में बदलने के बारे में सोचा और बस जो मिला उसे बदल दिया लेकिन मेरे ज्ञान की कमी के कारण मुझे पता नहीं है कि कैसे।

मेरा विचार है:

  • लाइव में एक नई शाखा बनाएँ ( git branch live)।
  • हर बार कुछ न कुछ लाइव करना होता है
    • मास्टर में पुल परिवर्तन (जैसे: git checkout master; git pull; git checkout live)
    • git merge master

समस्या यह है कि मास्टर पर स्विच करने या लाइव सिस्टम में सीधे सब कुछ खींचने से समस्याएं पैदा होंगी, इसलिए मैं इससे बचना पसंद करूंगा।

क्या ऐसा करने का कोई तरीका है या लाइव सिस्टम को प्रबंधित करने के लिए कोई बेहतर तरीका है (वेबिन को प्रशिक्षण देने के लिए छोड़कर अनैतिक सामान को धक्का न दें)।


git pull --allडिफ़ॉल्ट रूप से मास्टर को लाइव में नहीं खींचेगा, यह मास्टर को खींच लेगा और इसे मास्टर के साथ मर्ज कर देगा, और (यदि सर्वर पर मौजूद है) लाइव को मर्ज करने के लिए लाइव खींचें। क्या तुमने कोशिश की?
टोबियास किंजलर

क्या आपकी समस्या एक फ़ाइल के कारण है जो बाद में मास्टर करने के लिए संशोधन के बाद लाइव और गिट-जोड़ा बंद करने से पहले संस्करण नियंत्रण में नहीं थी? इससे पहले कि मेरे साथ क्या हुआ, आमतौर पर यह उस फ़ाइल को अस्थायी रूप से नाम बदलने के लिए पर्याप्त होना चाहिए, या यदि इसे लाइव की आवश्यकता नहीं है , git checkout -fतो समस्या को अनदेखा करने के लिए उपयोग करें - लेकिन बैकअप करें!
टोबियास किन्ज़लर

जवाबों:


21

आप git stashमास्टर की जाँच करने और खींचने से पहले उपयोग कर सकते हैं , और फिर से बाहर की जाँच करने के बाद लाइव का उपयोग करें git stash pop(या यदि आपका गिट पुराना है, git stash applyऔर git stash clearमान लें कि आपने कुछ और नहीं लिया है)


6
git pull --allसभी रिमोट प्राप्त करेंगे, लेकिन यह अभी भी एक शाखा (या डिफ़ॉल्ट शाखा) को वर्तमान शाखा में भी मर्ज करने का प्रयास करेगा।
मिपाडी

@mipadi हाँ, लेकिन केवल वर्तमान शाखा में ही जांच करने की कोशिश कर रहा है और विरोध का कारण बना, नहीं?
टोबियास किंज़्लर

यह जो भी शाखा कॉन्फ़िगर है उसे स्वचालित रूप से वर्तमान शाखा में विलय कर दिया जाएगा (यदि ऐसी शाखा कॉन्फ़िगर की गई है)।
मिपाडी

1
@Superole यह "सभी अवशेषों को लाने" के रूप में प्रलेखित है, जिसमें न केवल कई रिपॉजिटरी, बल्कि शाखाएं भी शामिल हैं। हालाँकि, दृष्टि में, git fetch --allएक बेहतर जवाब हो सकता है
टोबियास किन्ज़लर

2
@TobiasKienzler यह केवल सभी कॉन्फ़िगर किए गए रिमोट से लाने के लिए गिट को निर्देश देता है। सबसे आम मामला मूल नाम के केवल एक रिमोट का होना है। यदि आप अपने वर्तमान के समान शाखा के साथ एक से अधिक दूरस्थ होते हैं, और वे प्रत्येक अभिभावक के साथ तेजी से आगे के रिश्ते में नहीं हैं, तो --allविकल्प का उपयोग करने से आपको शाखा के विभिन्न संस्करणों का एक ऑक्टोपस मर्ज वर्तमान में मिल जाएगा ! इसलिए मेरी सलाह है --allकि जब तक आप उसके पीछे रहें, उससे दूर रहें , क्योंकि अन्य मामलों में यह आपको कुछ नहीं देगा।
सुपरोल

74

मैं इस आदेश का उपयोग करके किसी अन्य शाखा में काम origin/masterकरते masterहुए परिवर्तनों को खींचने में सक्षम था :

git fetch origin master:master

6
बहुत बढ़िया! वास्तव में मैं क्या देख रहा था - यह बहुत अधिक प्रमुखता से प्रलेखित होने की जरूरत है ...
मार्कस शेफर्ड

2
आप इस पर प्रलेखन यहाँ पा सकते हैं: git-scm.com/docs/git-fetch#_examples
c1moore


5

पहले समस्या का समाधान करें। उन्हें ऐसी शाखा में नहीं जाना चाहिए, जिसके पास कोई व्यवसाय न हो।

जो आप पूछ रहे हैं वह कुछ ऐसा होगा

git checkout live
git pull origin master

यह दूरस्थ मास्टर और आपकी लाइव शाखा के विलय का प्रयास करेगा।


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

2
@dbeme: आप टारबॉल और पैच का उपयोग कर सकते हैं। ;) जब तक वे गिट सीखने के लिए तैयार नहीं हैं (और यह शाखा और मर्ज करने के लिए बिल्कुल भी मुश्किल नहीं है) आपके पास समस्याएँ हैं।
जोश के

0

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

संक्षेप में, हर किसी का git रेपो परीक्षण रेपो का एक क्लोन है। लाइव उत्पादन साइट परीक्षण रेपो का एक क्लोन भी है। वैकल्पिक रूप से, परीक्षण लाइव prodcution का एक क्लोन हो सकता है ताकि एक "गिट पुश" हमेशा उत्पादन की ओर बढ़े।

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

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