2011-08-22 13 views
18

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

इन "अस्थायी" परिवर्तन के बारे में:

  • मैं उन्हें अपने शाखा के मेरे कार्य नकल में चाहते हैं, क्योंकि वे मेरे वास्तविक परिवर्तन पर काम करने के लिए मदद,
  • मैं नहीं चाहता वे शाखा के लिए प्रतिबद्ध हैं, क्योंकि शाखा को कुछ समय में मास्टर में विलय किया जा रहा है और वे उत्पादन कोड नहीं हैं।

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

  • सभी बार मैं जो फाइलें मैं छोड़ करने की जरूरत है याद रखना होगा,
  • किसी दिन मैं एक फ़ाइल में 2 बदलाव के साथ समाप्त करने के लिए जा रहा हूँ, एक अस्थायी होना, एक प्रतिबद्ध होना, और यह वास्तव में परेशानी होगी।

मुझे इससे कैसे निपटना चाहिए?


gitignore सवाल से बाहर क्योंकि मैं पूरी फ़ाइलों को अनदेखा नहीं करना चाहती स्पष्ट रूप से है और मैं अभी भी अन्य कमिटर से परिवर्तन में रुचि (मैं समय-समय पर गुरु के शाखा rebase करने की जरूरत है) कर रहा हूँ ।

+0

यह हंक ग्रैन्युलरिटी को अनदेखा करने का प्रयास करने का प्रयास करने के लिए एक दिलचस्प विचार की तरह दिखता है। गिट मेलिंग सूची पर पूछने की कोशिश करने के लायक भी हो सकता है (आपको पोस्ट की सदस्यता लेने की आवश्यकता नहीं है और क्योंकि यह अपेक्षाकृत अधिक मात्रा है, शायद आप नहीं चाहते हैं)। –

+0

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

+0

मैंने अपने बारे में एक विचार जोड़ा है, मेरे लिए ठीक दिखता है लेकिन अगर मैं किसी और अनुभवी व्यक्ति को देख सकता हूं तो इसमें कोई समस्या नहीं है तो मैं सराहना करता हूं। – Kos

उत्तर

12

मैं आम तौर पर उपयोग कर इस के साथ सौदा:

git add -p 

... परिवर्तन हंक-दर-हंक मंच। फिर आपको अपने डीबगिंग परिवर्तनों के लिए n दबाएं।


अगर मैं इस प्रकार के और अधिक शामिल परिवर्तन है, मैं इसकी टिप कि डिबगिंग कोड का परिचय पर एक प्रतिबद्ध साथ local-changes की तरह एक शाखा कुछ कहा पैदा हो जाएगी। कुछ और प्रतिबद्ध बनाने के बाद, मैं तो का उपयोग करेंगे:

git rebase -i master 

... उनका क्रम बदलने के लिए इतना है कि स्थानीय परिवर्तनों से प्रतिबद्ध फिर से नोक पर है। फिर मास्टर को अपडेट करने और स्थानीय परिवर्तन शाखा में लौटने के लिए, आप यह कर सकते हैं:

git checkout master 
git merge local-changes^ 
git checkout local-changes 
+0

प्रासंगिक परिवर्तनों का चयन मैन्युअल रूप से करना है जो मैं यहां से बचने की कोशिश कर रहा हूं :) मैं केवल एक बार ऐसा करना चाहता हूं। – Kos

+1

:) ठीक है, मैंने अपने जवाब में एक वैकल्पिक सुझाव जोड़ा है। –

0

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

6

git update-index --assume-unchanged <file> आज़माएं। इस तरह गिट git add या git commit -a का उपयोग करते समय फ़ाइल को इंडेक्स में नहीं जोड़ देगा।

संपादित करें: यह आपको अस्थायी और स्थायी दोनों परिवर्तनों के साथ एक फ़ाइल रखने के मामले से निपटने की अनुमति नहीं देता है।

+0

यह संभवतः '--assume-unchanged' का उपयोग करने के परिणामों को इंगित करने के लायक है, वास्तव में भ्रमित भी हो सकता है :) –

+1

@Mark I' --assume-unchanged' का उपयोग करते समय कभी भ्रमित नहीं हुआ है। क्या आप विस्तार से समझा सकते हैं? एक बार या दो बार सामना करने वाली एकमात्र कठिनाई यह पता लग रही है कि कौन सी फाइलें इस ध्वज सेट हैं। –

+0

बस यह भूलना आसान है कि आपने इसका उपयोग किया है। यह सिर्फ मुझे हो सकता है ... –

2

आप इसे एक अस्थायी स्थान में बचाने के लिए

git stash 

उपयोग कर सकते हैं। अपना विलय करने के बाद, आप

git stash pop 

का उपयोग अपने कार्य-निर्देशिका में अपने अस्थायी परिवर्तनों को वापस लोड करने के लिए कर सकते हैं।

+0

यह उपयोगी वैश्विक परिवर्तनों और स्थानीय-केवल परिवर्तनों के बीच भेदभाव नहीं करता है, क्योंकि ओपी ने अनुरोध किया है .. – naught101

0

मुझे इस तरह के असामान्य परिवर्तनों को रखना पड़ता है। मैं हमेशा चरण परिवर्तन के लिए git add -i या git add -p का उपयोग करता हूं (जब तक मुझे यकीन नहीं है कि मैं पेड़ के सभी परिवर्तनों को चाहता हूं)। इस तरह मैं उन सभी परिवर्तनों की समीक्षा करता हूं जो मैं करना चाहता हूं और आसानी से अस्थायी लोगों को छोड़ देता हूं। यह उन परिवर्तनों को चरणबद्ध करने में भी मदद करता है जिन्हें आप जानते हैं कि आप जल्दी ही करना चाहते हैं और उन्हें चरणबद्ध रखें या उन्हें भी प्रतिबद्ध रखें और git commit --amend के साथ और अधिक परिवर्तन जोड़ने से पहले।

4

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

स्थापना:

git branch tempChanges [branch for temporary changes] 
    [create your temporary changes] 
git add -A 
git commit 

ध्यान दें कि प्रतिबद्ध के लिए शा। फिर अपनी कार्यशील शाखा में स्विच करें, और:

git cherry-pick shaOfTempChangesCommit 

अब आपके कार्यरत शाखा में बदलाव हैं। अपना काम करो और काम करें। फिर, इससे पहले कि आप धक्का:

pick bfd4d2e This first commit is your temporary changes. 
pick 186a99d Some stuff done on the working branch. 
pick ec871c6 More stuff done on the working branch. 
(etc.) 

अपने अस्थायी परिवर्तनों के अनुरूप हटाएँ:

git rebase -i 

आप कुछ इस तरह देखेंगे। फिर सहेजें और बाहर निकलें। अस्थायी परिवर्तनों को बाहर करने के लिए आपका इतिहास फिर से लिखा जाएगा। (परिवर्तन अभी भी tempChanges शाखा में मौजूद होंगे।) एक बार ऐसा करने के बाद, आपको कोई भी परीक्षण करने की आवश्यकता है और फिर git push

जब आप फिर से काम करने के लिए तैयार हों, तो आप अपने वर्तमान काम कर शाखा पर वापस अस्थायी परिवर्तन खींच सकते हैं (या एक नया काम कर शाखा):

git cherry-pick shaOfTempChangesCommit 

तो, राशि में, तुम सब है इस पद्धति में याद करने के लिए आपके पास एक कार्यशील शाखा बनाने के बाद

  • है

    git cherry-pick shaOfTempChangesCommit

  • के बाद आपका काम हो गया काम करने और पुश करने के लिए तैयार

    git rebase -i[इससे पहले कि आप धक्का अस्थायी परिवर्तन दूर करने के लिए]

1

मैं इस समस्या के लिए एक साफ समाधान मिल गया है : (मेरी एसीआई-कला क्षमा करें)। इसे विषय शाखा के लिए एक अतिरिक्त शाखा की आवश्यकता है। (यह खामियां है और विवादित किया जा रहा है/ठीक किया, टिप्पणी देखें)

काम शुरू में इस तरह दिखता है:

master 
    \ 
     \ 
    commit1 ---- commit2 ---- "branch" 

काम "शाखा" पर किया जाता है।

कुछ अस्थायी परिवर्तन शुरू करने के लिए:

  • "मास्टर"
  • अस्थायी परिवर्तन
  • रिबेस "शाखा" "मास्टर" से पर प्रतिबद्ध "से शाखा" शाखा-अस्थायी "बनाने शाखा-अस्थायी "

रेपो अब की तरह दिखता है:

master 
    \ 
     \ 
    "branch-temp" ----- commit1 ---- commit2 ---- "branch" 

कार्य अब शाखा पर खुशी से जारी रहा है और स्थिति में अस्थायी परिवर्तन दिखाई नहीं दे रहे हैं।

बदलने के लिए या अस्थायी परिवर्तन का विस्तार करने के लिए:

  • चेकआउट शाखा-अस्थायी
  • --amend प्रतिबद्ध वहाँ अस्थायी परिवर्तन - यह गलत है, क्योंकि यह बनाता है "शाखा-अस्थायी" वितरित हो जाते हैं

शाखा से परिवर्तन मर्ज करने के लिए गुरु:

यह थोड़ा और मुश्किल है। हम "शाखा-अस्थायी" द्वारा पेश किए गए परिवर्तनों को छोड़कर, सभी परिवर्तनों में विलय करना चाहते हैं।मेरा विचार है:

  • "मास्टर"
    (अब हम एक मर्ज है, लेकिन कुछ अनावश्यक अस्थायी परिवर्तन के साथ - उन्हें निकाल देने के) पर "शाखा" से एक सामान्य मर्ज चलाने
  • Git वापस लाएं - -no-प्रतिबद्ध शाखा-अस्थायी
  • Git प्रतिबद्ध --amend
    (इन दो चरणों मर्ज को संशोधित करना चाहिए, के लिए प्रतिबद्ध है जिससे अब वह कोई शाखा-अस्थायी से परिवर्तन होता है)
+०१२३५१६४१०६१
+0

मैं इसके बजाय इंटरेक्टिव रीबेस का उपयोग करके मास्टर पर रीबेस कर दूंगा और न केवल उपयोग किए जाने वाले कामों ([परीक्षण] के साथ चिह्नित) या उनके विषयों में कुछ हटा दूंगा)। यह "शाखा-अस्थायी" की आवश्यकता से भी बच जाएगा और इसके परिणामस्वरूप रैखिक इतिहास होगा। –

+0

'गिट चेकआउट शाखा-अस्थायी' + 'गिट प्रतिबद्ध - कमांड' प्रस्तुत के रूप में काम नहीं करेगा, क्योंकि उस 'शाखा-अस्थायी' के बाद नया संस्करण होगा, लेकिन 'शाखा' के पास अभी भी प्रतिबद्धता का पुराना संस्करण होगा । और मुझे यकीन नहीं है कि सादा 'गिट रीबेज --onto शाखा-temp' इसे ठीक करेगा। 'Git rebase -i' को आसान बनाना और उस तरह से प्रतिबद्धता को संपादित करना आसान है, लेकिन यह 'शाखा-अस्थायी' को पीछे छोड़ देगा (यही वह है जो मैं उपयोग करता हूं और इसके बजाय रीबेज का उपयोग करके प्रतिबद्धता छोड़ देता हूं या + वापस विलय करता हूं)। –

+0

हां, आप सही हैं- मैंने डॉक्टर की जांच की है और प्रतिबद्ध --मेन्ड एक नई प्रतिबद्धता बनाता है और वर्तमान शाखा को अद्यतन करता है, जबकि मैंने सोचा कि यह जगह पर सिर पर प्रतिबद्धता को संशोधित करता है। – Kos

1

मैं आमतौर पर अपने सभी डीबग कोड को अपनी प्रतिबद्धता में डालता हूं, इससे पहले कि मैं विलय करता हूं, मैं revert प्रतिबद्ध करता हूं। मैंने कभी-कभी अन्य उत्तरों के कुछ बदलावों का उपयोग किया है, लेकिन मुझे इसकी सादगी और तथ्य यह है कि यह मेरे विकास इतिहास को संरक्षित करता है। हां, मैं अंतिम उत्पाद में अपना डीबग कोड नहीं चाहता, इसलिए revert, लेकिन यदि परीक्षण किसी समस्या को पाता है तो मैं आगे के काम के लिए उस डीबग कोड को बहाल करने में सक्षम होना चाहता हूं।

+1

जो आपके पेड़ को बदसूरत अवांछित काम से भरा छोड़ देता है ... – naught101

1

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

उदा।

git apply-my-debug 
... 
do coding 
... 
git remove-my-debug 
git add . 
git commit -m "Don't worry about debug changes" 
1

अपने मचान क्षेत्र को अव्यवस्थित रूप में आप एक विशेषता बना रहे हैं से बचने के लिए प्रतिबद्ध साथ अपने डिबग परिवर्तन एक उज्ज्वल चेतावनी है कि वे इसे अंतिम मर्ज में नहीं करना चाहिए निमिष:

#warning - DEBUG ONLY - DO NOT MERGE 

print(debugInfo) 

#warning - DEBUG ONLY - DO NOT MERGE 

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

फिर आप डिबग दूर करने के लिए अलग अलग तरीकों से होगा करता है:

  1. revert विशिष्ट डिबग करता है। यह शाखा में अपना इतिहास बनाए रखेगा।

  2. cherry-pickअच्छा काम करता है। यह पूरी तरह से डीबग को हटा देगा।

  3. कुछ और जटिल जैसे rebase -interactive जगहों पर जगहों को हटाने के लिए।