Git रिपॉजिटरी के पहले दो कम्बाइन को मिलाएं?


197

मान लें कि आपके पास तीन इतिहास हैं जिनमें A, B और C शामिल हैं :

A-B-C

मैं दो प्रतिबद्ध और बी को एक कमेटी एबी के साथ जोड़ना चाहूंगा :

AB-C

मैंने कोशिश की

git rebase -i A

जो निम्नलिखित सामग्री के साथ मेरे संपादक को खोलता है:

pick e97a17b B
pick asd314f C

मैं इसे बदलता हूं

squash e97a17b B
pick asd314f C

फिर Git 1.6.0.4 कहते हैं:

Cannot 'squash' without a previous commit

वहाँ एक रास्ता है या यह सिर्फ असंभव है?



जवाबों:


169

git rebase -i --root Git संस्करण 1.7.12 के रूप में उपयोग करें ।

इंटरएक्टिव रिबेस फाइल में, स्क्वैश के लिए कमिट बी की दूसरी लाइन को बदलें और अन्य लाइनों को पिक पर छोड़ दें :

pick f4202da A
squash bea708e B
pick a8c6abc C

यह दो कमिट A और B को एक कमिट AB के साथ जोड़ देगा ।

इस उत्तर में मिला ।


126

आपने कोशिश की:

git rebase -i A

यदि आप editइसके बजाय जारी रखना चाहते हैं तो यह संभव है squash:

edit e97a17b B
pick asd314f C

फिर भागो

git reset --soft HEAD^
git commit --amend
git rebase --continue

किया हुआ।


4
यदि आप चुपचाप गिथब गैस्ट को ठीक करने के लिए ऐसा कर रहे हैं, तो आपको कमिट में "आरंभिक" जोड़ना होगा। ;-)
ब्रूनो ब्रोंस्की

1
git rebase --abortशुरू करने के लिए और इसे सही तरीके से करने के लिए (संपादक में पहली प्रतिबद्ध नहीं)
oma

66

Aप्रारंभिक प्रतिबद्ध था, लेकिन अब आप Bप्रारंभिक प्रतिबद्ध होना चाहते हैं। git commits पूरे पेड़ होते हैं, भिन्न नहीं होते हैं भले ही वे आम तौर पर वर्णित किए गए हों और जिस रूप में वे पेश करते हैं, उसके संदर्भ में देखा गया हो।

ए और बी, और बी और सी के बीच कई कमिट होने पर भी यह नुस्खा काम करता है।

# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout <sha1_for_B>

# reset the branch pointer to the initial commit,
# but leaving the index and working tree intact.
git reset --soft <sha1_for_A>

# amend the initial tree using the tree from 'B'
git commit --amend

# temporarily tag this new initial commit
# (or you could remember the new commit sha1 manually)
git tag tmp

# go back to the original branch (assume master for this example)
git checkout master

# Replay all the commits after B onto the new initial commit
git rebase --onto tmp <sha1_for_B>

# remove the temporary tag
git tag -d tmp

1
जब मैं git rebase --onto tmp <sha1_for_B>
एलेक्स

यह देखते हुए कि मेरे पास केवल दो कमिट के साथ एक नया रेपो था (कि मैं एक में रोल करना चाहता था), यह मेरे लिए पूरी तरह से काम करता है। धन्यवाद @CB बेली
रोमिनरॉन

10

इंटरैक्टिव रिबेस के मामले में, आपको ए से पहले यह करना होगा ताकि सूची इस प्रकार हो:

pick A
pick B
pick C

बनने के लिए:

pick A
squash B
pick C

यदि A प्रारंभिक कमिटमेंट है, तो आपके पास ए। Git के अंतर के बारे में सोचने से पहले एक अलग प्रारंभिक कमिटमेंट होना चाहिए, यह (A और B) और (B और C) के बीच के अंतर पर काम करेगा। इसलिए स्क्वैश आपके उदाहरण में काम नहीं कर रहा है।


9

इस मामले में कि कोस्तो के उत्तर का उपयोग करते हुए आपके पास सैकड़ों या हजारों आवागमन हैं

git rebase -i --root

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

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

git checkout --orphan orphan <second-commit-sha>
git commit -m "Enter a commit message for the new root commit"
git rebase --onto orphan <second-commit-sha> master

प्रलेखन


1

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

यदि आप रुचि रखते हैं: git: पहले के रूप में एक प्रतिबद्धता कैसे डालें, अन्य सभी को स्थानांतरित करना?


अगर यहां भी जवाब दोहराया जाता तो क्या यह बेहतर होता? मुझे यकीन नहीं है।

0

दस्ते के लिए Git कमांड: git rebase -i HEAD ~ [संख्याओं की संख्या]

आओ हम कहते हैं कि आपके पास जीआईटी प्रतिबद्ध इतिहास है:


5152061 उपलब्धि उठाएं: छवि बचाने के लिए जोड़ा गया समर्थन। (ए)
39c5a04 ठीक करें: बग फिक्स। (बी)
839c6b3 फिक्स चुनें: संघर्ष हल हो गया। (सी)

अब आप A और B को AB में स्क्वैश करना चाहते हैं, नीचे दिए गए चरणों का पालन करें:


5152061 उपलब्धि उठाएं: छवि बचाने के लिए जोड़ा गया समर्थन। (ए) का
39c5a04 फिक्स: बग फिक्स। (बी)
839c6b3 फिक्स चुनें: संघर्ष हल हो गया। (सी)

नोट: स्क्वैश करने के लिए हम स्क्वैश या एस का उपयोग कर सकते हैं। अंतिम परिणाम होगा:
5152061 उपलब्धि उठाओ: छवि को बचाने के लिए जोड़ा गया समर्थन। (AB)
839c6b3 फिक्स चुनें: संघर्ष हल हो गया। (सी)


-1

आपको थोड़ी-सी कमांड-लाइन मैजिक करनी होगी।

git checkout -b a A
git checkout B <files>
git commit --amend
git checkout master
git rebase a

यह आपको एक शाखा के साथ छोड़ना चाहिए जिसमें एबी और सी है जैसा कि कमिट करता है।


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