2012-06-27 15 views
38

मैं गिट (अभी भी बहुत नोब) के साथ खेल रहा हूं और मैं "रीसेट" और "रीबेज" के बीच का अंतर जानना चाहता था। क्या दूसरे की तुलना में एक और शक्तिशाली है?"गिट रीसेट" बनाम "गिट रीबेस" के बीच क्या अंतर है?

कहें कि मैं इतिहास से बोल्ड में 3 कामों को हटाना चाहता हूं, जिसका उपयोग करने के लिए बेहतर होगा, या मुझे इसे टैग करना चाहिए और फिर इसे git tag -d <tagname> से हटा देना चाहिए?

17a64df 2012-06-21 | हैलो style.css (HEAD, मूल/शैली, मास्टर) का उपयोग करता है,
a6792e4 2012-06-21 | जोड़ा गया सीएसएस स्टाइलशीट
801e13e 2012-06-21 | जोड़ा गया README
5854339 2012-06-21 | जोड़ा गया index.html
0b1dd4c 2012-06-21 | Hello.html को lib
55649c3 2012-06-21 पर ले जाया गया। एक लेखक/ईमेल टिप्पणी जोड़ें
9 बी 2 एफ 3 सी 2012-06-21 | एक लेखक टिप्पणी
cdb39b0 2012-06-21 | टेक्स्ट के साथ कमिट पी टैग (v1.1)
b7b5fce 2012-06-21 | यह reverts a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8 प्रतिबद्ध करता है।
a6faf60 2012-06-21 | वापस लौटें "ओह, हम यह प्रतिबद्ध नहीं चाहते थे"
a006669 2012-06-21 | ओह, हम यह प्रतिबद्ध नहीं चाहते थे
262d1f7 2012-06-21 | जोड़ा गया एचटीएमएल हेडर (v1)
बी 1846e5 2012-06-21 | मानक HTML पृष्ठ टैग जोड़ा गया (v1-beta)
bf1131e 2012-06-21 | जोड़ा गया HI टैग
02b86d0 2012-06-21 | पहला Commit

उत्तर

43

वे पूरी तरह से अलग हैं। git-reset किसी भी प्रतिबद्ध ऑब्जेक्ट (या अन्य ऑब्जेक्ट्स) को छूए बिना, आपकी कार्यशील निर्देशिका और अनुक्रमणिका पर रेफरी के साथ काम करता है। दूसरी ओर git-rebase का उपयोग पहले किए गए प्रतिबद्ध वस्तुओं को फिर से लिखने के लिए किया जाता है।

तो यदि आप इतिहास को फिर से लिखना चाहते हैं, तो git-rebase वह है जो आप चाहते हैं। ध्यान दें कि आपको कभी इतिहास को फिर से लिखना चाहिए जो धक्का दिया गया था और किसी और के लिए उपलब्ध था, क्योंकि रीबेजिंग ऑब्जेक्ट्स को पुराने ऑब्जेक्ट्स के साथ असंगत बनाने के लिए फिर से लिखता है, जिसके परिणामस्वरूप किसी और के लिए गड़बड़ी होती है।

कहा जा रहा है कि आप क्या करना चाहते हैं interactive rebasinggit rebase -i 262d1f7 का उपयोग कर इसे आह्वान और आप एक शीघ्र इस तरह लग रही मिलना चाहिए:

pick 262d1f7 Added HTML header (v1) 
pick a006669 Oops, we didn't want this commit 
pick a6faf60 Revert "Oops, we didn't want this commit" 
pick b7b5fce This reverts commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8. 
pick cdb39b0 Commit p tags with text (v1.1) 
pick 9b2f3ce Added an author comment 
pick 55649c3 Add an author/email comment 
pick 0b1dd4c Moved hello.html to lib 
pick 5854339 Added index.html 
pick 801e13e Added README 
pick a6792e4 Added css stylesheet 
pick 17a64df Hello uses style.css (HEAD, origin/style, master), 

वहाँ, बस करता आप निकालना बचाने के लिए और संपादक से बाहर निकलें और Git अपने इतिहास को फिर से लिखने होगा चाहते हैं के लिए लाइनों को हटा दें। दोबारा, यदि आप पहले से ही परिवर्तनों को धक्का देते हैं तो यह मत करें। आम तौर पर इतिहास में ऐसा काम करना बिल्कुल ठीक है।

+0

उत्तर के लिए धन्यवाद और अंतर क्या है साफ़ करने के लिए धन्यवाद। – Q10

+0

स्क्वैश के लिए "पिक" शब्द को "एस" शब्द बदलने के समान ही रिबेस से लाइनों को हटा रहा है? – Ninjaxor

+4

@ निंजाक्सर नहीं, लाइनों को हटाने से पूरी तरह से काम और इतिहास से शुरू किए गए परिवर्तनों को हटा दिया जाएगा। ऐसा लगता है कि प्रतिबद्धता कभी नहीं बनाई गई थी। उदाहरण के लिए यदि आप एक प्रतिबद्धता को हटाते हैं जो एक पंक्ति जोड़ती है, तो वह लाइन रीबेज के बाद किसी भी प्रतिबद्धता में दिखाई नहीं देगी। दूसरी तरफ स्क्वैशिंग अभी भी उस प्रतिबद्ध प्रतिबद्धता से छुटकारा पाने के दौरान प्रतिबद्धता में किए गए बदलावों को बनाए रखेगी। – poke

8

हालांकि यह दो, here's के बीच मतभेदों की तुलना नहीं करता है, जो समझने में आसान है कि पुनर्जन्म को समझाते हुए एक उत्कृष्ट लेख है।

+1

यूआरएल अब है http://www.jarrodspillers.com/git/2009/08/19/git-merge-vs-git-rebase-avoiding-rebase-hell.html – AnneTheAgile

+1

वह लेख कहता है कि एकमात्र लाभ कम विलय हो रहा है काम करता है, और शेष विलय प्रतिबद्धता अधिक सार्थक हैं। यह जोखिम के लायक नहीं लगता है। क्या कोई अन्य फायदे हैं? –

+0

वह लेख बहुत उपयोगी था। अब तक इंटरनेट पर मैंने जो सबसे अच्छा स्पष्टीकरण देखा है। –

संबंधित मुद्दे