2009-09-10 8 views
20

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

git checkout master [changes a bunch of working tree files] 
git merge feature1 [changes the same files right back] 

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

कुछ की तरह:

git checkout master --merge-branch feature1 

संपादित करें:

मैं केवल तेजी से आगे के बारे में बात कर रहा हूँ विलीन हो जाती है कि परिभाषा से फ़ाइलों की स्थिति बदलने नहीं होता।

+0

http://stackoverflow.com/questions/1282639/switch-git-branch-without-files-checkout की [मर्ज, अद्यतन, और Git शाखाओं खींच –

+0

संभावित डुप्लिकेट चेकआउट का उपयोग किए बिना] (http://stackoverflow.com/questions/3216360/merge-update-and-pull-git-branches-without-using-checkouts) –

उत्तर

7

[संपादित करें] यह केवल आंशिक समाधान/कामकाज है। नीचे @djpohly द्वारा वास्तविक उत्तर देखें।

सबसे पहले, आप कहीं से भी धक्का दे सकते हैं। कोई फर्क नहीं पड़ता कि आपने क्या चेक आउट किया है, या क्या आप जिस चीज को धक्का देना चाहते हैं वह मास्टर में है।

git push REMOTE_REPO feature1:master 

देख git help push

सुझाव: git push remoteRepo localRef:remoteRef

जहाँ आप अपने काम के प्रति के साथ नगण्य बिना अब कर रहे हैं करने के लिए मास्टर लाने के लिए के रूप में ... आप यह इतना की तरह मजबूर कर सकते हैं:

# (while still on feature1 branch) 
git checkout -B master origin/master 

लेकिन यह मास्टर पर एक हार्ड रीसेट करता है। यानी यह तेजी से आगे की जांच नहीं करता है।

+0

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

+1

अच्छी तरह से, आपके प्रश्न का दूसरा हिस्सा (आपकी फाइलों के संशोधन समय को किसी भी तरह से सही तरीके से बदलकर जानना) वास्तव में हल करने योग्य नहीं है। गिट के बारे में जानने का कोई तरीका नहीं है कि कौन सी फाइलें संकलित की गई थीं। इसलिए जब यह फ़ाइलों को बदलता है तो गिट हमेशा टाइमस्टैम्प अपडेट करता है। इसका परिणाम कुछ अतिरिक्त पुन: संकलन में होता है, लेकिन कभी-कभी इसे फिर से संकलित करने में असफल होने की तुलना में यह काफी बेहतर होता है। – JasonWoof

+2

शायद आप अपने कंप्यूटर पर एक और क्लोन रखना चाहते हैं, तो आप दोनों एक बार में चेक आउट कर सकते हैं? यदि आप अंतरिक्ष की परवाह करते हैं, तो दो स्थानीय क्लोनों को रेपो स्टोरेज साझा करना संभव है। – JasonWoof

3

कोई तरीका नहीं है कि विलय (या रीबेस) कार्यशील निर्देशिका (और अनुक्रमणिका) को छूए बिना काम कर सकता है, क्योंकि कार्यशील निर्देशिका (और/या अनुक्रमणिका) का उपयोग करके हल किए जाने वाले संघर्ष विलय हो सकते हैं।

आप डिस्क स्थान को बचाने के लिए हमेशा एक और क्लोन (वैकल्पिक रूप से वैकल्पिक, या सिम्लिंकिंग ऑब्जेक्ट निर्देशिका का उपयोग कर सकते हैं), या contrib/workdir/git-new-workdir के साथ एक और कार्यशील निर्देशिका हो सकती है। या ccache जैसे टूल का उपयोग करें।

36

एक धक्का या एक मजबूर बिना इस-क्या करना एक सरल और सुरक्षित तरीका मास्टर में feature1 लाने के लिए अद्यतन-है:

(feature1)$ git fetch . feature1:master 
From . 
    4a6000d..8675309 feature1 -> master 

चाल . उपयोग कर रहा है स्थानीय feature1 रेफरी मिलता है। यह जबरन मास्टर मास्टर को अद्यतन करने से सुरक्षित है, क्योंकि यह सुनिश्चित करता है कि अपडेट एक तेज़-आगे है। (विवरण के लिए git-fetch documentation में < रेफस्पेक > पैरामीटर देखें।)

अब जब कि feature1 और मास्टर, एक ही हैं उन दोनों के बीच स्विच करने से किसी भी फाइल स्पर्श नहीं करेगा:

(feature1)$ git checkout master 
Switched to branch 'master' 
(master)$ 
+0

धन्यवाद, यह काम किया। हालांकि, मुझे समझ में नहीं आता कि 'fetch' भाग क्या कर रहा है। – towi

+1

@towi आप कामकाजी प्रति अपडेट किए बिना प्रभावी रूप से 'गिट पुल' कर रहे हैं (गिट पुल मूल रूप से 'गिट फ़ेच' और 'गिट मर्ज' का संयोजन है)। – dlitz

+3

यह स्वीकार्य उत्तर होना चाहिए। मैं विभिन्न परिदृश्यों में वापस आ रहा हूं :) –

0

आप केवल वही फ़ाइलें की एक जोड़ी के बारे में परवाह है और आप यूनिक्स का उपयोग कर रहे हैं, तो आप मैन्युअल रूप से बदल सकते हैं touch -d <timestamp> का उपयोग कर तथ्य के बाद mtime को ठीक करें। सुनिश्चित करें कि आप टाइमस्टैंप प्राप्त करने के लिए ls --full-time का उपयोग करें, क्योंकि डिफ़ॉल्ट डिस्प्ले में सटीकता की कमी है।

उदाहरण के लिए, कल्पना करें कि आप पाइथन-आधारित वेब ऐप के लिए एक छवि बनाने के लिए डॉकर का उपयोग कर रहे हैं। यदि requirements.txt फ़ाइल में परिवर्तनों को पुनर्निर्माण के लिए काफी समय लगता है, क्योंकि इसे तृतीय-पक्ष पुस्तकालयों का समूह डाउनलोड करना है और उन्हें संकलित करना है। सीधे शब्दों में विलय करने के बाद उस फ़ाइल के mtime रीसेट:

ls -og --full-time src/requirements.txt 
# -rw-r--r-- 1 282 2015-11-04 20:03:28.918979065 +0400 src/requirements.txt 

git checkout master 
git merge --no-ff feature-foo 

touch src/requirements.txt -d "2015-11-04 20:03:28.918979065 +0400" 
संबंधित मुद्दे