मैं अपने स्थानीय अनधिकृत परिवर्तनों को दूसरी Git शाखा में कैसे मिलाऊँ?


621

मैं Git में निम्नलिखित कैसे कर सकता हूं?

मेरी वर्तमान शाखा शाखा 1 है और मैंने कुछ स्थानीय परिवर्तन किए हैं। हालाँकि, मुझे अब एहसास हुआ कि मैं वास्तव में इन परिवर्तनों को शाखा 2 में लागू करने वाला था। क्या इन परिवर्तनों को लागू करने / मर्ज करने का कोई तरीका है ताकि वे शाखा 1 पर प्रतिबद्ध किए बिना शाखा 2 पर स्थानीय परिवर्तन हो जाएं?


2
एसओ पर यहीं एक महान गिट ट्यूटोरियल है । स्टैक ओवरफ्लो पर सभी गिट सवालों के लिए अपनी तरह का एक केंद्रीय।
डेसियो लीरा

जवाबों:


896

चूंकि आपकी फाइलें अभी तक प्रतिबद्ध नहीं हैं branch1:

git stash
git checkout branch2
git stash pop

या

git stash
git checkout branch2
git stash list       # to check the various stash made in different branch
git stash apply x    # to select the right one

बेन्जोन द्वारा टिप्पणी के रूप में ( git stashमैन पेज देखें ):

वर्तमान में अनट्रैक की गई (नई जोड़ी गई) फ़ाइलों को भी छिपाने के लिए, तर्क जोड़ें -u, ताकि:

git stash -u

2
आपका स्वागत है। अनैतिकबगलर . com / posts / 2008/11/… पर उपयोग के अधिक उदाहरण ।
VONC

2
यदि आप एक ही समस्या का समाधान ढूंढ रहे हैं, लेकिन TFS के साथ, समतुल्य समाधान आपके परिवर्तनों को आश्रय देना है तो TFS पावर टूल्स का उपयोग करके / शाखा स्विच का उपयोग करके सही शाखा को अनचेक करें।
xr280xr

1
इसने मेरे लिए काम किया। हालाँकि, मुझे काम करने के लिए 'स्टश पॉप' के लिए एक स्थानीय शाखा भी बनानी पड़ी। अगर आपके साथ भी कुछ ऐसा ही हो रहा है, तो Checkout out stackoverflow.com/questions/1783405/git-checkout-remote-branch करें ।
मिमोरिया

21
वर्तमान में अनट्रैक की गई (नई जोड़ी गई) फ़ाइलों को भी छिपाने के लिए, तर्क जोड़ें -u, इसलिए git stash -u:।
बेन्जोन

2
@ बन्जोन गुड पॉइंट। अधिक दृश्यता के उत्तर में मैंने आपकी टिप्पणी शामिल की है।
VonC

84

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

git checkout branch2

यह तब तक काम करेगा जब तक कि आप जिन फ़ाइलों को संपादित कर रहे हैं वे शाखा 1 और शाखा 2 के बीच भिन्न नहीं हैं। यह आपके साथ शाखा 2 को छोड़ देगा जिसमें आप संरक्षित परिवर्तन काम कर रहे हैं। यदि वे अलग-अलग हैं तो आप निर्दिष्ट कर सकते हैं कि आप -mचेकआउट करने के विकल्प के साथ शाखाओं को स्विच करके शुरू किए गए परिवर्तनों के साथ अपने स्थानीय परिवर्तनों को मर्ज करना चाहते हैं ।

git checkout -m branch2

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

git reset

3
मैंने सोचा था कि किसी भी तरह से "सरल" को समझना, लेकिन विभिन्न शाखाओं में काम करने वाली निर्देशिका को ध्यान में रखना बेहतर है। +1
VonC

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

यदि checkout -mकिसी स्थिति में "सुरक्षित" नहीं है (शायद यह एक मर्ज संघर्ष का कारण होगा), तो क्या स्लैश कोई लाभ प्रदान करेगा (जैसे कि आप एक स्टश पॉप को अनपॉप कर सकते हैं)?
क्रेग मैकक्यून

1
@ craigMcQueen जब आप इसे पॉप करते हैं तो टकराव की स्थिति को समाप्त नहीं कर सकते हैं, लेकिन टकराव की शिकायत करेंगे। आप संघर्षों को ठीक कर सकते हैं और फिर प्रतिबद्ध कर सकते हैं, लेकिन इस मामले में मूल गतिरोध अभी भी बना हुआ है! :)
शॉन एफ

एक मर्ज संघर्ष की स्थिति में, क्या फ़ाइलों का बैकअप नहीं है .orig?
जूल

13

पहले उल्लेखित स्टैश एप्रोच का एक छोटा विकल्प होगा:

अस्थायी रूप से परिवर्तनों को एक स्लैश में ले जाएं।

  1. git stash

एक नई शाखा में बनाएं और स्विच करें और फिर इसे केवल एक चरण में स्टैश पॉप करें।

  1. git stash branch new_branch_name

फिर बस addऔर commitइस नई शाखा में परिवर्तन।


10

चेतावनी: गिट newbies के लिए नहीं।

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

यह मददगार भी है- यदि आप इस तरह की स्थितियों में भाग लेते हैं - तो आपके वर्तमान के साथ-साथ एक और कार्यशील निर्देशिका है जो हमेशा masterशाखा की जाँच करती है।

तो मैं इसे कैसे प्राप्त करता हूं इस तरह से होता है:

  1. git commit एक अच्छे संदेश के साथ बदलाव तुरंत होता है।
  2. git reset HEAD~1 वर्तमान शाखा से प्रतिबद्ध को पूर्ववत करने के लिए।
  3. (वैकल्पिक) सुविधा पर काम करना जारी रखें।

कभी-कभी बाद में (अतुल्यकालिक रूप से), या तुरंत किसी अन्य टर्मिनल विंडो में:

  1. cd my-project-master जो एक और WD साझा है वही .git
  2. git reflog मेरे द्वारा अभी बनाया गया बगफिक्स खोजने के लिए।
  3. git cherry-pick SHA1 कमिट का।

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

  1. cd my-project मुख्य WD जो मैं काम कर रहा हूँ।
  2. git rebase master बगफिक्स को पाने के लिए।

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

IMO git stashऔर git checkoutएक वास्तविक PIA है जब आप किसी बड़ी सुविधा पर काम करने के बीच में होते हैं।


मेरे जवाब का दिलचस्प और वैध विकल्प। +1
वॉनसी

क्या आप मेधावी से आ रहे हैं? my-project-masterएक ही साझा करने .gitबनाता है यह यह की तरह ध्वनि। क्यों नहीं git checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard, तो बाद में (अतुल्यकालिक रूप से), जबकि पर master, git cherry-pick <SHA1 of the commit(s) in bugfixABC? (या यहां तक ​​कि, SHA1 का पता लगाने से बचने के लिए, git rebase --onto master feature bugfixABCवर्तमान में आप जहां भी शाखा में हैं। इसका मतलब है कि आप git resetऊपर दिए गए समय के बाद सीधे ऐसा कर सकते हैं feature।)
Gauthier

हालांकि, ओपी को लगता है कि वे बदलाव के लिए तैयार नहीं हैं, इस मामले में बस checkout -mबेहतर है।
गौथियर

2

यदि यह प्रतिबद्ध परिवर्तनों के बारे में था, तो आपको गिट-रिबास पर एक नज़र डालनी चाहिए, लेकिन जैसा कि आप VonC द्वारा टिप्पणी में बताए गए हैं, क्योंकि आप स्थानीय परिवर्तनों के बारे में बात कर रहे हैं, git-stash निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका होगा।


मैं इस समाधान को नहीं समझता: यह शाखा 1 से शाखा 2 के इतिहास को फिर से लिखेगा ... शाखा 2 में शाखा 1 से सभी प्रतिबद्ध परिवर्तन क्यों हो रहे हैं जब हम केवल शाखा 2 में शाखा 1 के स्थानीय गैर-प्रतिबद्ध परिवर्तन प्राप्त करना चाहते हैं? ...
VONC

@VonC: इस मामले में, सहमत हैं, शाखा 1 में शाखाओं के बीच अंतिम विलय के बाद से रिबास को सभी प्रतिबद्ध परिवर्तन मिलते हैं। मुझे इस सवाल का "गैर-प्रतिबद्ध" पैरामीटर पहले नहीं मिला। रिबास अच्छा जवाब नहीं है।
क्लैफ

@ क्लेफेर्री: pfew ... मुझे सिरदर्द होने लगा था;) मैं आपके जवाब को अस्वीकार कर देता, लेकिन चूंकि मैंने खुद को प्रकाशित किया था, इसलिए "हितों का स्पष्ट संघर्ष" था। आपकी अपडेट की गई पोस्ट के साथ, मुझे अब बिलकुल भी डाउनवोट नहीं होना पड़ेगा। धन्यवाद :)
VonC

@VonC: अगली बार, बेझिझक मतदान करें क्योंकि जब तक मेरा उत्तर इस एक के रूप में गलत है;)
क्लैफ

1

अब तक दिए गए उत्तर आदर्श नहीं हैं क्योंकि उन्हें मर्ज संघर्षों को हल करने के लिए बहुत सारे अनावश्यक काम की आवश्यकता होती है, या वे बहुत अधिक धारणाएं बनाते हैं जो अक्सर झूठे होते हैं। यह पूरी तरह से कैसे करना है। लिंक मेरी अपनी साइट पर है।

कैसे एक अलग शाखा में करने के लिए प्रतिबद्ध करने के लिए

आपने उन सभी परिवर्तनों को रद्द my_branchकर दिया है, जिनसे आप masterसभी परिवर्तनों के लिए प्रतिबद्ध होना चाहते हैं my_branch

उदाहरण

git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop

व्याख्या

masterअपनी शाखा में विलय करके शुरू करें , क्योंकि आपको आखिरकार वैसे भी करना होगा, और अब किसी भी संघर्ष को हल करने का सबसे अच्छा समय है।

-uविकल्प (उर्फ --include-untracked) में git stash -uआप जब आप बाद में कर ट्रैक न किए गए फ़ाइलें खोने से रोकता है git clean -f -dभीतर master

इसके बाद git checkout masterयह महत्वपूर्ण है कि आप ऐसा न करें git stash pop, क्योंकि बाद में आपको इस स्टैश की आवश्यकता होगी। में बनाए गए गुप्त कोष में पॉप हैं my_branchऔर फिर कर git stashमें master, आप अनावश्यक मर्ज संघर्ष जब आप बाद में है कि गुप्त कोष में लागू कारण होगा my_branch

git resetसे उत्पन्न होने वाली हर चीज को अस्थिर करता है git stash apply। उदाहरण के लिए, फ़ाइलें जो स्टैश में संशोधित की गई हैं, लेकिन master"हमारे द्वारा हटाए गए" संघर्ष के रूप में मौजूद नहीं हैं ।

git checkout .और git clean -f -dजो कुछ भी प्रतिबद्ध नहीं है उसे छोड़ दें: सभी ट्रैक की गई फ़ाइलों और सभी अनट्रैक की गई फ़ाइलों और निर्देशिकाओं में परिवर्तन। वे पहले से ही स्टैश में सहेजे जाते हैं और यदि वापस छोड़ दिया जाता है, masterतो वापस स्विच करने पर अनावश्यक मर्ज संघर्ष हो सकता है my_branch

अंतिम git stash popमूल पर आधारित होगा my_branch, और इसलिए किसी भी मर्ज संघर्ष का कारण नहीं होगा। हालाँकि, अगर आपके स्टैच में अनट्रैक की गई फाइलें हैं, जो आपने मास्टर करने के लिए प्रतिबद्ध हैं, तो git को यह शिकायत होगी कि यह "स्टैक्ड से अनट्रैक फाइल्स को रिस्टोर नहीं कर सका"। इस विरोध को हल करने के लिए, अपने काम के पेड़, तो से उन फ़ाइलों को हटाने git stash pop, git add .और git reset


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

1
आप अगर वे विलय कर रहे हैं उन्हें अलग नहीं रख सकते हैं, लेकिन आप कर रहे हैं , एक से अधिक खातों के लिए अनुमति दी जब तक आप धोखाधड़ी मतदान प्रतिबद्ध करने के लिए उन्हें का उपयोग नहीं करते के रूप में (या उन्हें आपसी संवाद आम तौर पर है)। अपनी स्थिति को एक आधुनिक तरीके से समझाएं। साथ ही, विलोपन एक ईमानदार गलती थी, आप किसी को यह बताने की उम्मीद कैसे कर सकते हैं कि आप दो अलग-अलग खातों का उपयोग कर रहे थे?

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

1
डुप्लिकेट सामग्री पोस्ट न करें, विशेषकर विभिन्न खातों से। दो प्रश्न समान होने पर डुप्लिकेट के रूप में बंद या फ़्लैट करें।
छिपकली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.