Git में किसी अन्य शाखा पर आधारित होने के लिए कुछ निश्चित चालें कैसे चलती हैं?


381

स्थिति:

  • मास्टर एक्स पर है
  • quickfix1 X + 2 पर है

ऐसा है कि:

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

फिर मैंने क्विकफिक्स 2 पर काम करना शुरू किया, लेकिन गलती से क्विकफिक्स 1 को कॉपी करने के लिए सोर्स ब्रांच के रूप में लिया, न कि मास्टर को। अब quickfix2 X + 2 कमिट्स + 2 प्रासंगिक कमिट्स पर है।

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

अब मैं क्विकफिक्स 2 के साथ एक शाखा रखना चाहता हूं, लेकिन 2 के बिना जो क्विकफिक्स 1 से संबंधित है।

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

मैंने क्विकफिक्स 2 में एक निश्चित संशोधन से एक पैच बनाने की कोशिश की, लेकिन पैच प्रतिबद्ध इतिहास को संरक्षित नहीं करता है। क्या मेरे प्रतिबद्ध इतिहास को बचाने का एक तरीका है, लेकिन क्विकफिक्स 1 में बदलाव के बिना एक शाखा है?



8
@Kevin यही सवाल केवल एक से दूसरे शाखा से प्रतिबद्ध जाने के बारे में पूछता है, यह एक की अतिरिक्त आवश्यकता है नहीं पर प्रतिबद्ध सहित quickfix1। (उत्तरों में अंतर पर भी ध्यान दें।)
स्कॉट वेल्डन

जवाबों:


372

यह एक क्लासिक मामला है rebase --onto:

 # let's go to current master (X, where quickfix2 should begin)
 git checkout master

 # replay every commit *after* quickfix1 up to quickfix2 HEAD.
 git rebase --onto master quickfix1 quickfix2 

तो आप से जाना चाहिए

o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

सेवा:

      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

यह एक साफ काम करने वाले पेड़ पर किया जाता है।
देखेंgit config --global rebase.autostash true , खासकर Git 2.10 के बाद


24
सावधान रहें कि ये चरण क्विकफिक्स 2 के इतिहास को संशोधित करेंगे, इसलिए यदि आप पहले से ही शाखा साझा करते हैं, तो इसके बजाय चेरी-पिकिंग का उपयोग करें (निम्नलिखित उत्तर देखें)।
मैक्स चिरनायक

बस रिकॉर्ड के लिए: SmartGit की लॉग बस खींचें के साथ q2aपर Xऔर चुनें रिबेस 2 प्रतिबद्ध होने वाली संवाद के विकल्पों में से।
थॉमस एस।

1
@ThomasS। दिलचस्प। यह एक अच्छा जीयूआई कार्यान्वयन है git rebase --onto
VonC

1
मुझे स्वीकार करना होगा, मैं मूर्खतापूर्ण चीजें करता हूं जैसे कि गलत शाखा पर कमिटमेंट करना जो मुझे वास्तव में करना चाहिए, स्मार्टगिट लॉग व्यू जीयूआई ने मुझे एक ही स्थिति के साथ कई बार बचाया है।
वर्कस

1
@ कोसाइन सहमत। मैंने rebase.autostashकॉन्फ़िगरेशन के संदर्भ को जोड़ने के लिए अपने उत्तर को संपादित किया है: जो कि रिबास करते समय कार्यशील पेड़ में प्रगति के किसी भी नुकसान से बच जाएगा।
वॉनसी

155

आप git cherry-pickकेवल उस प्रति को लेने के लिए उपयोग कर सकते हैं जिसे आप कॉपी करना चाहते हैं।

संभवत: सबसे अच्छा तरीका यह है कि शाखा को मास्टर से बाहर बनाना है, फिर उस शाखा git cherry-pickमें 2 पर उपयोग करना है क्विकफिक्स 2 जो आप चाहते हैं।


अगर आप सिर्फ एक कमिट करना चाहते हैं तो यह भी सबसे अच्छा विकल्प है। धन्यवाद।
एलेक्स

142

सबसे आसान काम जो आप कर सकते हैं वह है चेरी का एक रेंज। यह वैसा ही करता है, rebase --ontoलेकिन आंखों के लिए आसान है :)

git cherry-pick quickfix1..quickfix2

6
यह भी, यह मूल कमानों को नहीं खोता है, IIUC, इसलिए मेरे जैसे "प्ले-इट-सेफ़्स" के लिए बेहतर लगता है?) या rebase --ontoमूल परिवर्तनों को भी संरक्षित करता है ?
10

6
दोनों rebaseऔर cherry-pickआप नए SHA कुंजी देते हैं। ऐसा इसलिए है क्योंकि प्रत्येक प्रतिबद्ध भंडार का एक अनूठा स्नैपशॉट है।
क्रिस्टोफ़

6
@Akavel का मतलब यह है कि चेरी-पिक मूल शाखा को अपनी शाखा में रखेगा जो सत्य है
Mr_and_Mrs_D

4
जो भी इसके लायक है, मैंने cherry-pickइस उत्तर में एक सीमा तक कोशिश की और इसने मेरे रेपो को भ्रमित किया। मुझे cherry-pickप्रत्येक कमिट के लिए अलग-अलग काम करना था । (और हो सकता है कि यह बिना कहे चला जाए, लेकिन अगर कोई संघर्ष कर रहा है, तो आपको cherry-pickकालानुक्रमिक क्रम में होना चाहिए जो आपके द्वारा लागू किया गया है।)
कार्मिकवाद

3
git checkoutयहाँ महत्वपूर्ण है। आपका HEAD :) क्या है?
शालोमोइर लेनार्ट

28

मेरा मानना ​​है कि यह है:

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2

3
cherry-pickकमिट हैश के साथ काम करता है, अगर आप बस कहीं से एक कमिट हड़पना चाहते हैं और इसे कहीं और रखना चाहते हैं तो जाने का रास्ता यही है। बस यह सुनिश्चित करें कि आप checkout <branch>पहले सही शाखा का करें।
जॉन लेडिग्रेन

-1
// on your branch that holds the commit you want to pass
$ git log
// copy the commit hash found
$ git checkout [branch that will copy the commit]
$ git reset --hard [hash of the commit you want to copy from the other branch]
// remove the [brackets]

स्पष्टीकरण के साथ यहां अन्य अधिक उपयोगी कमांड: गिट गाइड

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