Git प्रतिबद्ध समाप्त नहीं हुआ, लेकिन उस मशीन पर जारी नहीं रह सकता


11

कभी-कभी मैं ऐसे वर्कस्टेशन पर अनकम्फर्टेड कोड होने की समस्या में भाग लेता हूं, जो कमिट के लिए तैयार नहीं होता है, लेकिन उसे एक अलग वर्कस्टेशन या लैपटॉप पर पूरा करने की जरूरत होती है।

क्या किसी के पास इस समस्या का हल है, जैसे कि "सॉफ्ट कमिट" या किसी अन्य मशीन में बदलाव करने के लिए किसी अन्य तरीके से उन्हें किसी अन्य स्थान पर स्थानांतरित करने का तरीका?

मैं उन परिवर्तनों को करने के लिए मजबूर नहीं होना पसंद करूंगा, जिन्हें ठीक से लागू नहीं किया गया है।


2
इस पोस्ट को पढ़ना मुश्किल है (पाठ की दीवार)। क्या आप बेहतर आकार में आईएनजी को संपादित करेंगे ?
gnat

.. जैसे आप के बाद घाव git stash...?
साइमन व्हाइटहेड

@ शिमोनहाइटहेड हाँ, लेकिन क्या मैं आसानी से किसी अन्य मशीन पर एक गिट स्टैश को स्थानांतरित कर सकता हूं?
csteifel

सभी गिट कमिट "सॉफ्ट कमिट्स" हैं।
user253751

जवाबों:


12

निम्नलिखित मानता है कि आपका स्थानीय रेपो किसी अन्य सर्वर पर रेपो का क्लोन है, जैसे जीथब; और यह कि आपके पास अपस्ट्रीम सर्वर में बदलाव करने के अधिकार हैं। मेरे उदाहरण में, मैंने इस अपस्ट्रीम रेपो को "मूल" कहा है। git remote showअन्य रेपो को सूचीबद्ध करने के लिए चलाएँ , यह आपको संकेत दे सकता है कि इसे क्या कहा जाता है।

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

  • अपने रेपो को शाखा देने के लिए: git checkout -b MyNewBranch
  • अपनी नई शाखा के प्रतिबद्ध बदलावों को आगे बढ़ाने के लिए: git push origin MyNewBranch
  • किसी अन्य मशीन पर शाखा देखने के लिए: git checkout MyNewBranch
  • दूसरी शाखा में स्विच करने के लिए (उदाहरण के लिए "मास्टर"): git checkout master
  • जब मास्टर में, MyNewBranch को वापस मर्ज करने के लिए: git merge MyNewBranch
  • शाखाओं को सूचीबद्ध करने के लिए: git branch

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

इसके अलावा, और इसका कारण मैं यह करता हूं: यदि आप आधे रास्ते में गलती करते हैं, तो आप वर्तमान शाखा पर पिछले कमिट्स पर जा सकते हैं। या, वापस कूदो, इसका एक टुकड़ा पकड़ो, आगे कूदो और आवेदन करो।
AMADANON Inc.

1
क्या यह विधि मर्ज किए गए मास्टर ब्रांच में अपूर्ण कमिटों को भी शामिल नहीं करेगी?
ईमरेक

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

2
" दूसरी शाखा में जाने के लिए क्या करेंgit branch -d master " के बारे में, मैं उलझन में हूँ, कि मास्टर शाखा को हटाने के लिए सवाल नहीं करता है ?? (यह धारणा मुझे वैसे भी गिट ब्रांच मैनुअल पढ़ने से मिलती है)
टासोस पापस्टीलियनौ

2

आप git diffएक पैच बनाने के लिए उपयोग कर सकते हैं और फिर इसे अन्य मशीन पर लागू कर सकते हैं। या आप एक अस्थायी प्रतिबद्ध बना सकते हैं, फिर इसे अन्य मशीन से खींच सकते हैं। आप किसी अन्य मशीन पर एक अस्थायी शाखा भी बना सकते हैं, अपनी अस्थायी प्रतिबद्ध को वहां धक्का दे सकते हैं, फिर शाखा को हटा सकते हैं।

मेरा पसंदीदा तरीका दूसरा है: एक अस्थायी प्रतिबद्ध बनाना, फिर किसी अन्य मशीन पर जाना और कुछ ऐसा करना:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^

इतना जटिल और सिर्फ उपयोग क्यों नहीं git format-patch?
-कैच-अंततः

वास्तव में इससे अलग नहीं है git diff। क्या मुझे कुछ याद आ रहा है?
arager

1
git format-patch deadbee..badcab1e- यह .patchअच्छी तरह से नाम और प्रतिबद्ध संदेश संरक्षित के साथ हर प्रतिबद्ध के लिए अलग से फाइल बनाता है ।
कोशिश-कैच-अंततः

क्या यह उन परिवर्तनों के लिए एक पैच भी बनाता है जो अभी तक प्रतिबद्ध नहीं हैं? क्या यह वर्तमान सूचकांक और उन चीजों को अलग करता है जो अभी तक मंचित नहीं हैं? ऐसा लगता है कि यह नहीं है।
arager

नहीं, नहीं के लिए नहीं uncommitted / अस्थिर परिवर्तन। लेकिन जब से एक प्रतिबद्ध किसी और को चोट नहीं पहुंचाता है, जब तक आप इसे धक्का नहीं देते हैं तब तक इसे ठीक करने के लिए ठीक होना चाहिए (एक स्पष्ट संदेश के साथ जो "WIP" - प्रगति में काम करता है)।
कोशिश-कैच-अंततः

2

मैं इसे प्रतिबद्ध करता हूं । मैं इसे व्यक्तिगत शाखा में धकेलता हूं , दूसरी तरफ देखें और संशोधन करें। और जब किया तो व्यक्तिगत शाखा को हटा दें।

बेशक आप रेपो के बीच सीधे धक्का दे सकते हैं, आप बंडल या format-patch/ का उपयोग कर सकते हैं am, लेकिन एक व्यक्तिगत शाखा अब तक का सबसे आसान समाधान है। और इतिहास को फिर से लिखना कोई बड़ी बात नहीं है क्योंकि इसे किसी साझा शाखा में नहीं धकेला जाता है। कई परियोजनाओं में लोगों को समीक्षा के लिए समझने में आसान रखने के लिए सुविधा शाखाओं को फिर से चालू करना चाहिए


0

आसान तरीका वह है जिसका आप वर्णन करते हैं: .gitछिपी निर्देशिका और प्रोजेक्ट फ़ाइलों को किसी अन्य मशीन पर कॉपी करें जहां आप या तो कमिट कर सकते हैं और समाप्त कर सकते हैं, या बस काम जारी रख सकते हैं।

.gitनिर्देशिका जहां अपना Git इतिहास रखा जाता है, इसलिए वास्तविक फ़ाइलों के साथ इस संरक्षण अपनी पूरी परियोजना का इतिहास बरकरार रखता है।

यदि आप मूल मशीन का उपयोग कर रहे हैं, तो मैं शायद इस दृष्टिकोण की सिफारिश करूंगा।


0

जैसे दूसरों ने उत्तर दिया है, Git के साथ आपको अपनी व्यक्तिगत शाखाओं में गैर-समाप्त कोड की परवाह नहीं करनी चाहिए। हालांकि, अगर किसी कारण से, आप वास्तव में वास्तव में वास्तव में अपने अधूरे काम को कभी भी मुख्य रेपो को छूना नहीं चाहते हैं, तो आप गिट के वितरित प्रकृति का उपयोग कर सकते हैं!

एक सरल उपकरण है जिसका नाम git bundleकेंद्रीय भंडार के बिना परिवर्तन को आसानी से पारित करने में आपकी सहायता कर सकता है। सबसे पहले, रेपो को क्लोन करें:

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

कुछ परिवर्तन करें और उन्हें एक अस्थायी शाखा के लिए प्रतिबद्ध करें:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

अब, उन्हें बदलें बंडल:

git bundle create ../tmp.bundle tmp_branch

अब आपके पास एक बंडल फाइल है जिसे आप अपनी नई मशीन पर मेल कर सकते हैं। आप वहां इसका उपयोग कैसे करते हैं? आइए एक नई वर्किंग कॉपी बनाएं:

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

हमें अपने बंडल को दूसरे रिमोट के रूप में व्यवहार करने की आवश्यकता है, इसलिए हम इसमें से बदलाव ला सकते हैं

git remote add tmp ../tmp.bundle
git fetch tmp

चूंकि पूरे बिंदु को ट्रेस छोड़ने के बिना परिवर्तनों को स्थानांतरित करना था, इसलिए हम उन्हें अस्थायी रूप से खोने के लिए काम की प्रतिलिपि में स्क्वैश करना चाहते हैं:

git merge tmp/tmp_branch --squash

और जो कुछ बचा है वह अस्थायी रिमोट को हटाने के लिए है:

git remote remove tmp

आहा! परिवर्तन न तो शाखा और न ही प्रतिबद्ध का एक निशान छोड़ने के बिना नई काम करने की प्रतिलिपि में स्थानांतरित कर दिया गया!

लेकिन वास्तव में - यह प्रक्रिया काफी लंबी और बोझिल है। यह Git है, SVN नहीं - वास्तव में केंद्रीय रेपो में आपकी व्यक्तिगत शाखा को धक्का न देने का कोई कारण नहीं होना चाहिए।

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