खींच के बाद एक नई शाखा में जाने के लिए प्रतिबद्ध (लेकिन धक्का नहीं दिया गया)


459

मैंने काफी हद तक सही काम किया है ("आपकी शाखा 37 कमिट द्वारा 'मूल / मास्टर' से आगे है।") जो वास्तव में इसकी बजाय अपनी शाखा में जाना चाहिए था master। ये कमिट केवल मेरे स्थानीय मशीन पर मौजूद हैं और इन्हें धक्का नहीं दिया गया है origin, लेकिन स्थिति कुछ जटिल है कि अन्य देवता धक्का दे रहे हैं origin/masterऔर मैंने उन परिवर्तनों को खींच लिया है।

मैं अपनी 37 स्थानीय कमानों को एक नई शाखा में कैसे ले जाऊं? डॉक्स के आधार पर, यह प्रतीत होता है कि ऐसा करना चाहिए git rebase --onto my-new-branch masterया ...origin/masterकरना चाहिए, लेकिन दोनों ही मुझे "घातक: एक ही संशोधन की आवश्यकता" त्रुटि देते हैं। man git-rebaseइसके बारे में कोई संशोधन प्रदान करने के बारे में कुछ नहीं कहता है rebaseऔर इसके उदाहरण ऐसा नहीं करते हैं, इसलिए मुझे नहीं पता कि इस त्रुटि को कैसे हल किया जाए।

(ध्यान दें कि यह Git में एक नई शाखा में मौजूदा चालित, बिना किसी कार्य के डुप्लिकेट नहीं है या मेरे स्थानीय अनचाहे परिवर्तनों को किसी अन्य Git शाखा में कैसे मर्ज किया जाए? क्योंकि ये प्रश्न स्थानीय कार्यशील पेड़ में अनपेक्षित परिवर्तनों से निपटते हैं, जिनमें परिवर्तन नहीं हैं? स्थानीय रूप से प्रतिबद्ध है।)


इस उपाय को देखें । आसान और साफ लगता है।
टोनी

इस उपाय को देखें । आसान और साफ लगता है।
टोनी

जवाबों:


517

यह ठीक होना चाहिए, क्योंकि आपने अभी तक अपने कमिट को कहीं और नहीं धकेला है, और आप अपनी शाखा के इतिहास को फिर से लिखने के लिए स्वतंत्र हैं origin/master। पहले मैं git fetch originयह सुनिश्चित करने के लिए कि origin/masterआज तक चला हूँ। यह मानते हुए कि आप वर्तमान में हैं master, आपको ऐसा करने में सक्षम होना चाहिए:

git rebase origin/master

... जो आपके उन सभी कमेन्टों को फिर से प्ले करेगा जो origin/masterऑन नहीं हैं origin/master। रीबेस की डिफ़ॉल्ट कार्रवाई मर्ज कमिट्स को अनदेखा करना है (उदाहरण के लिए जिन्हें आपके द्वारा git pullसंभवतः पेश किया गया है) और यह आपके प्रत्येक कमिट द्वारा शुरू किए गए पैच को लागू करने का प्रयास करेगा origin/master। (आपको रास्ते में कुछ संघर्षों को हल करना पड़ सकता है।) फिर आप परिणाम के आधार पर अपनी नई शाखा बना सकते हैं:

git branch new-work

... और उसके बाद अपना masterबैक रीसेट करें origin/master:

# Use with care - make sure "git status" is clean and you're still on master:
git reset --hard origin/master

आदि के साथ इस तरह की जोड़-तोड़ करने वाली शाखाओं को करते समय git branch, git resetमुझे यह उपयोगी लगता है कि मैं कमिट ग्राफ को अक्सर gitk --allया इसी तरह के टूल के साथ देखूं , बस यह जांचने के लिए कि मैं समझता हूं कि सभी अलग-अलग रिफ्लेक्ट्स कहां इशारा कर रहे हैं।

वैकल्पिक रूप से, आप केवल एक विषय शाखा बना सकते हैं, जिसके आधार पर आपका मास्टर पहले स्थान पर है ( git branch new-work-including-merges) और फिर masterऊपर के रूप में रीसेट करें । हालाँकि, चूंकि आपकी विषय शाखा में मर्ज शामिल होगा origin/masterऔर आपने अभी तक अपने बदलावों को आगे नहीं बढ़ाया है, इसलिए मैं सुझाव दूंगा कि इतिहास टिडियर है। (साथ ही, जब आप अंततः अपनी विषय शाखा को वापस मास्टर में विलय कर देंगे, तो परिवर्तन अधिक स्पष्ट होंगे।)


8
@ ओली: नहीं, प्रश्न में मान्यताओं के तहत उत्तर सही है और जिन्हें मैंने उत्तर के शीर्ष पर स्थापित किया है। एक नई शाखा पर होने वाले कमिट पहले से ही हैं master; रिबास masterशाखा को फिर से लिखता है ताकि नए कमिट रैखिक रूप से शीर्ष पर हों origin/master, फिर वर्तमान शाखा पर स्विच किए बिना (वर्तमान शाखा) के सिरे पर इंगित करने वाली शाखा git branch new-workबनाता है । तो अब सभी नए कमिट शामिल हैं। फिर रीसेट वर्तमान शाखा (अभी भी ) को वापस ले जाता है । new-workmasternew-worknew-workmasterorigin/master
मार्क लोंगेयर

1
@ प्रश्न: यदि आपने काम खो दिया है तो मुझे बहुत खेद है, लेकिन मुझे यकीन है कि यह प्रश्न मूल प्रश्नकर्ता द्वारा वर्णित स्थिति के लिए सही है। (मैंने ओली की टिप्पणी का उत्तर स्पष्ट रूप से स्पष्ट करने के लिए दिया है।) वैसे भी, बस अगर यह आपके काम को वापस पाने में मदद करता है, तो मुझे यह कहना चाहिए कि यदि आपका काम पिछले कुछ दिनों के भीतर प्रतिबद्ध था (इस प्रश्न और उत्तर में धारणा में से एक) ) आपको आसानी से गिट रिफ्लॉग के माध्यम से इसे पुनः प्राप्त करने में सक्षम होना चाहिए।
मार्क लोंगेयर

5
@ ऑली: शायद समझाने का एक बेहतर तरीका: गिट में शाखाएं केवल लेबल की तरह हैं जो किसी विशेष प्रतिबद्ध पर इंगित करती हैं; यदि आप उन्हें उस शाखा पर बनाते हैं या git resetअन्य विभिन्न तरीकों से स्थानांतरित किया जा सकता है, तो वे स्वचालित रूप से नए कमिट में चले जाते हैं। git branch new-workबस "इस प्रतिबद्ध पर जबकि मैं अपने वर्तमान शाखा पर रहते हैं (जो इस मामले में मालिक है) एक शाखा की ओर इशारा करते बनाएँ" कह रहा है। तो वहाँ एक आदेश है कि मास्टर से नई शाखा में ले जाता है की जरूरत नहीं है - आप बस वहाँ एक नई शाखा बनाने के लिए और जब आप रीसेट मास्टर नई शाखा छोड़ दिया है जहां मास्टर था
मार्क Longair

1
पार्टी के लिए थोड़ा देर से लेकिन @ ओली, सिर्फ इसलिए कि जब नई शाखा पर गुरु के सामने स्थिति दिखाई नहीं देती है तो इसका मतलब यह नहीं है कि वे वास्तव में वहां नहीं हैं (यह मानते हुए कि आप चिंतित क्यों थे)। नई शाखा को मूल पर धकेलने का प्रयास करें: आप देखेंगे कि कमिट वहाँ हैं
Félix Gagnon-Grenier

2
@ FélixGagnon-Grenier, "लेट" के बारे में चिंता न करें - हमेशा ऐसे लोग होते हैं जो पुराने सवाल देख रहे होते हैं और हर क्लियरेंस मदद करता है। धन्यवाद! :)
ओली

147

यदि आपके पास कम # आवागमन है और आप परवाह नहीं करते हैं कि ये एक मेगा-कमेट में संयोजित हैं, तो यह अच्छी तरह से काम करता है और ऐसा करने में डरावना नहीं है git rebase:

फ़ाइलों को अनस्टेज करें (# कमिट्स के 1 बदलें)

git reset --soft HEAD~1

एक नई शाखा बनाएँ

git checkout -b NewBranchName

परिवर्तन जोड़ें

git add -A

एक कमिट करें

git commit -m "Whatever"

5
आसानी से समझ में आने वाला ग्राफ दिखाने के लिए, कृपया उपयोग करें git log --all --decorate --oneline --graph
एलिउएक्स

अरे @EliuX - मैं यहाँ प्रासंगिकता याद कर रहा हूँ। क्या आप विस्तार कर सकते हैं?
स्टैचू

यह जांचने के लिए कुछ उपयोगी है कि क्या आप चाहते हैं कि आपको क्या परिणाम मिला है
एलीयूएक्स

4
धन्यवाद!! यह एक बहुत ही सरल उपाय है और इसने पूरी तरह से काम किया है !!
क्रिस सिम

90

मैं उसी मुद्दे पर अड़ गया। मुझे सबसे आसान समाधान मिला है जिसे मैं साझा करना पसंद करता हूं।

1) अपने परिवर्तनों के साथ नई शाखा बनाएँ।

git checkout -b mybranch

2) (वैकल्पिक) दूरस्थ सर्वर पर नया शाखा कोड धक्का।

git push origin mybranch

3) मास्टर शाखा में वापस चेकआउट करें।

git checkout master

4) दूरस्थ सर्वर के साथ मास्टर शाखा कोड रीसेट करें और स्थानीय कमिट को हटा दें।

git reset --hard origin/master

10
यह वास्तव में सबसे आसान तरीका है
dhilt

4
आप चरण 2 को छोड़ सकते हैं। मेरा मानना ​​है कि शीर्ष उत्तर के बाद से, समय बदल गया है और इस प्रक्रिया को पहले अनुमति नहीं दी गई थी।
सेबेस्टियन

मेरी राय में यह सबसे अच्छा जवाब है।
मैक विंडो

1
इस उत्तर को शीर्ष पर ले जाने की आवश्यकता है। धन्यवाद।
अमित

27

एक और तरीका मान शाखा 1 - प्रतिबद्ध परिवर्तनों के साथ शाखा है शाखा 2 - वांछनीय शाखा है

git fetch && git checkout branch1
git log

कमिट आईडी का चयन करें जिसे आपको स्थानांतरित करने की आवश्यकता है

git fetch && git checkout branch2
git cherry-pick commit_id_first..commit_id_last
git push

अब प्रारंभिक शाखा से अप्रकाशित आवागमन को वापस लाएं

git fetch && git checkout branch1
git reset --soft HEAD~1

5
चेरी-पिक वास्तव में सबसे अच्छा "एक एकल कमिट / कमांड" जासूसी है। जब इतिहास आपके उद्देश्यों के लिए सामान है।
जॉन नेउहोस

यह अब तक प्रश्न का सबसे सुविधाजनक उत्तर है। कमांड के लिए धन्यवाद!
फराह

क्या आप अपनी पिछली टिप्पणी को अपडेट कर सकते हैं जहां 1 या n अप्रकाशित कमिट की संख्या है? यह अभी भी इस प्रश्न का एक अच्छा समाधान है।
च्लेक्सी

9

वैकल्पिक रूप से, गलत शाखा के लिए प्रतिबद्ध होने के बाद, आप इन चरणों का पालन करें:

  1. git log
  2. git diff {previous to last commit} {latest commit} > your_changes.patch
  3. git reset --hard origin/{your current branch}
  4. git checkout -b {new branch}
  5. git apply your_changes.patch

मैं सोच सकता हूं कि चरण एक और दो के लिए एक सरल दृष्टिकोण है।


6

व्हाट अबाउट:

  1. वर्तमान हेड से शाखा।
  2. सुनिश्चित करें कि आप मास्टर पर हैं , न कि आपकी नई शाखा।
  3. git reset इससे पहले कि आप बदलाव करना शुरू करें, आखिरी बार वापस।
  4. git pull केवल उन दूरस्थ परिवर्तनों को पुन: खींचने के लिए जिन्हें आपने रीसेट के साथ फेंक दिया था।

या जब आप शाखा को फिर से मर्ज करने का प्रयास करेंगे तो क्या वह फट जाएगा?


2
आह, यह मूल रूप से ऊपर @ मार्क-लोंगेयर द्वारा वर्णित बी विकल्प है
टिम कीटिंग

2

यहाँ एक बहुत सरल तरीका है:

  1. एक नई शाखा बनाएँ

  2. अपनी नई शाखा में a git merge master- यह आपके नए शाखा में आपके प्रतिबद्ध (धकेल नहीं) परिवर्तनों को मर्ज कर देगा

  3. आपको स्थानीय मास्टर शाखा हटाएं इसके बजाय git branch -D masterउपयोग करें क्योंकि आप शाखा को हटाना चाहते हैं।-D-d

  4. बस git fetchअपनी मास्टर ब्रांच पर करें और git pullअपनी मास्टर ब्रांच पर यह सुनिश्चित करने के लिए कि आपकी टीमें नवीनतम कोड हैं।


1

एक सरल दृष्टिकोण, जिसका मैं उपयोग कर रहा हूं (यह मानकर कि आप 4 आवागमन करना चाहते हैं):

git format-patch HEAD~4

(उस निर्देशिका को देखें जिसमें से आपने 4 .patchफ़ाइलों के लिए अंतिम कमांड निष्पादित की है )

git reset HEAD~4 --hard

git checkout -b tmp/my-new-branch

फिर:

git apply /path/to/patch.patch

जिस क्रम में आप चाहते थे।


0
  1. आप स्रोतों की नई प्रतिलिपि चेकआउट करें

    git clone ........

  2. इच्छित स्थिति से शाखा बनाएं

    git checkout {position} git checkout -b {branch-name}

  3. दूरस्थ रिपॉजिटरी जोड़ें

    git remote add shared ../{original sources location}.git

  4. दूरस्थ स्रोत प्राप्त करें

    git fetch shared

  5. चेकआउट वांछित शाखा

    git checkout {branch-name}

  6. सूत्रों का विलय करें

    git merge shared/{original branch from shared repository}


0

मेरे लिए यह सबसे अच्छा तरीका था:

  1. परिवर्तनों की जांच करें और संघर्षों को मर्ज करें git fetch
  2. एक नई शाखा बनाएँ git branch my-changes और रिमोट पर पुश करें
  3. अपस्ट्रीम को नई निर्मित शाखा में बदलें git master -u upstream-branch remotes/origin/my-changes
  4. अपनी अपस्ट्रीम को नई अपस्ट्रीम शाखा में पुश करें।
  5. पिछले अपस्ट्रीम पर वापस जाएं git branch master --set-upstream-to remotes/origin/master
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.