आवागमन की पुनरावृत्ति


104

मैं वर्तमान में एक शाखा पर काम कर रहा हूं और चाहता हूं कि कुछ अन्य शाखाओं में विलय हो जाएं:

    a-b-c-d-e-f-g (branchA)
   /
--o-x-x-x-x-x-x-x-x-x-x (master)
   \
    x-x-x-x-x (branchB)

(पत्र कमिट निरूपित करते हैं, और "x" अप्रासंगिक हैं।)

हालाँकि मैंने देखा कि कुछ कमिट्स को पूल करना एक अच्छा विचार होगा। मैं एक पैच में "ए, डी, ई और जी" बनाना और इसे मास्टर करना चाहता हूं। कमिट B और f को एक कमेटी के रूप में जाना चाहिए। क्या इसे प्राप्त करने के लिए एक अच्छा 'git'-ish तरीका है?


4
पहले से दिए गए दो उत्तरों ने सही कमांड का उल्लेख किया है, लेकिन मुझे लगता है कि यह एक मूल काम है, यह स्टैकऑवरफ्लो पर यहां वास्तविक निर्देश होने के लायक है, इसलिए मैंने कुछ पोस्ट किया है। (मुझे आश्चर्य है कि मुझे लिंक करने के लिए एक अच्छा पिछला सवाल नहीं मिल सकता है।)
कास्कैबेल

जवाबों:


125

आप जिस कमांड की तलाश कर रहे हैं git rebase, वह विशेष रूप से -i/--interactiveविकल्प है।

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

git rebase -i <SHA1 of commit a>^ branchA

^पिछली प्रतिबद्ध का मतलब है, इसलिए यह कमांड आधार के रूप में "ए" से पहले कमिट का उपयोग करके शाखा ए को रिबास करने के लिए कहता है। Git आपको इस रेंज के कमिट्स की एक सूची के साथ प्रस्तुत करेगा। उन्हें पुनः व्यवस्थित करें और उचित लोगों को स्क्वाश करने के लिए कहें:

pick c ...
pick a ...
squash d ...
squash e ...
squash g ...
pick b
squash f

अब इतिहास को इस तरह देखना चाहिए:

    c - [a+d+e+g] - [b+f] (branchA)
   /
--o-x-x-x-x-x-x-x-x-x-x (master)

अब, चलिए ब्रांच के लिए नव-स्क्वैस्ड कमिट b + f को पकड़ो।

git checkout branchB
git cherry-pick branchA  # cherry-pick one commit, the tip of branchA

और मास्टर के लिए एक + डी + ई + जी के लिए समान:

git checkout master
git cherry-pick branchA^

अंत में, ब्रांच को अपडेट करें ताकि यह c को इंगित करे:

git branch -f branchA branchA^^

अब हमें होना चाहिए:

    c (branch A) - [a+d+e+g] - [b+f] (dangling commits)
   /
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master)
   \
    x-x-x-x-x-[b+f] (branchB)

ध्यान दें कि यदि आपके पास कई कमिटियाँ थीं जिन्हें आप शाखाओं के बीच ले जाना चाहते थे, तो आप फिर से रिबास (गैर-अंतःक्रियात्मक) का उपयोग कर सकते हैं:

# create a temporary branch
git branch fromAtoB branchA
# move branchA back two commits
git branch -f branchA branchA~2
# rebase those two commits onto branchB
git rebase --onto branchB branchA fromAtoB
# merge (fast-forward) these into branchB
git checkout branchB
git merge fromAtoB
# clean up
git branch -d fromAtoB

अंत में, एक अस्वीकरण: यह इस तरह से पुन: व्यवस्थित करने के लिए काफी संभव है कि कुछ अब सफाई से लागू न हों। ऐसा इसलिए हो सकता है क्योंकि आपने एक खराब ऑर्डर चुना (यह पैच किए गए फीचर को पेश करने से पहले एक पैच लगाते हुए); उस स्थिति में आप रिबेट ( git rebase --abort) को निरस्त करना चाहते हैं । अन्यथा, आपको बुद्धिमानी से संघर्षों को ठीक करना होगा (जैसे आप मर्ज संघर्षों के साथ करते हैं), फ़िक्सेस जोड़ें, फिर git rebase --continueआगे बढ़ने के लिए दौड़ें । ये निर्देश त्रुटि संदेश द्वारा भी प्रदान किए जाते हैं जब संघर्ष होता है।


git branch -f branchA branchA^^गलत के बाद आरेख नहीं है? अर्थात्, शाखा को इस बिंदु पर ग की ओर इशारा नहीं किया जाना चाहिए, ताकि आरेख की पहली पंक्ति हो c (branchA)और नहीं c - [a+d+e+g] - [b+f] (branchA)?
ntc2

@enoksrd: हाँ, एक गलती है, लेकिन आपके संपादन में गलतियाँ थीं। जब मुझे यहाँ मौका मिलेगा मैं इसे ठीक करूँगा।
Cascabel

ऐसा करने के बजाय git branch -f branchA branchA^^आप केवल git reset --hard <sha1 of c>शाखा ए पर क्यों नहीं कर सकते ?
मिखाइल वासिलीव

17
git rebase -i HEAD~3

कहाँ 3है कि आवागमन की आवश्यकता है ( स्रोत ) की संख्या।

यह vi खोल देगा , लिस्टिंग सबसे पुराने (शीर्ष) से नवीनतम (नीचे) तक जाती है।
अब लाइनों को फिर से व्यवस्थित करें, सहेजें और संपादक से बाहर निकलें

ddpचालू लाइन को नीचे
ddkP ले जाएगा, वर्तमान लाइन को ऊपर ले जाएगा ( स्रोत )


9

git rebase --interactive आप चाहते हैं आदेश है।

उदाहरण:

वर्तमान स्थिति यह है:

bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git status
On branch master
nothing to commit, working tree clean
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
a6e3c6a (HEAD -> master) Fourth commit
9a24b81 Third commit
7bdfb68 Second commit
186d1e0 First commit

मैं कमिट्स 9a24b81(थर्ड कमिट) और 7bdfb68(सेकंड कमिट) करना चाहता हूं । ऐसा करने के लिए, मैं पहली बार हम जिस पहले कमिटमेंट को बदलना चाहते हैं, उससे पहले कमिटमेंट ढूंढ लेते हैं । यह प्रतिबद्ध 186d1e0(फर्स्ट कमिट) है।

git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGEइस मामले में निष्पादित करने का आदेश है :

bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git rebase --interactive 186d1e0

यह निम्न सामग्री के साथ डिफ़ॉल्ट संपादक में एक फ़ाइल खोलता है:

pick 7bdfb68 Second commit
pick 9a24b81 Third commit
pick a6e3c6a Fourth commit

# Rebase 186d1e0..a6e3c6a onto 186d1e0 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#

ध्यान दें कि फ़ाइल में कमिट्स का क्रम गिट लॉग के लिए उपयोग किए जाने वाले के विपरीत है। गिट लॉग में, सबसे हालिया प्रतिबद्धता शीर्ष पर है। इस फ़ाइल में, सबसे हालिया प्रतिबद्ध सबसे नीचे है।

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

pick 9a24b81 Third commit
pick 7bdfb68 Second commit
pick a6e3c6a Fourth commit

pickप्रत्येक पंक्ति का अर्थ है "उपयोग (यानी शामिल हैं) इस के लिए प्रतिबद्ध" और जब मैं बचाने रिबेस आदेशों के साथ अस्थायी फ़ाइल और संपादक से बाहर निकलें, Git आदेश पर अमल और भंडार और कार्यशील निर्देशिका अद्यतन करेगा के शुरू में आदेश:

$ git rebase --interactive 186d1e0
Successfully rebased and updated refs/heads/master.
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
ba48fc9 (HEAD -> master) Fourth commit
119639c Second commit
9716581 Third commit
186d1e0 First commit

इतिहास को फिर से लिखने पर ध्यान दें।

लिंक:


1
कृपया पूर्ण, और स्व-निहित उत्तर प्रदान करने के लिए अपने लिंक से प्रासंगिक विवरण जोड़ें। एसओ "लिंक-ओनली उत्तर" पर भौंकता है। विशेष रूप से, git rebase --interactiveओपी के लक्ष्य को प्राप्त करने के लिए कोई कैसे उपयोग करेगा ?
शेरलहोमन

दूसरा लिंक अब मौजूद नहीं है।
देवसॉ

उत्तर पूर्ण और स्व-सम्‍मिलित बनाने के लिए सामग्री जोड़ी गई। दूसरी कड़ी निकाली।
कोडेप


-1

git rebase जो आप चाहते हैं। बाहर का विकल्प देखें।


4
कृपया पूर्ण, और स्व-निहित उत्तर प्रदान करने के लिए अपने लिंक से प्रासंगिक विवरण जोड़ें। एसओ "लिंक-ओनली उत्तर" पर भौंकता है।
शेरलहोमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.