2008-12-12 13 views
42

यहां एक उदाहरण है:शाखा में सभी परिवर्तनों को पुनर्जीवित करने के लिए मैं 'गिट रिबेस-आई' का उपयोग कैसे करूं?

>git status 
# On branch master 
nothing to commit (working directory clean) 
>git checkout -b test-branch 
>vi test.c 
>git add test.c 
>git commit -m "modified test.c" 
>vi README 
>git add README 
>git commit -m "modified README" 

अब मैं एक 'git rebase -i' करना चाहता हूं जो मुझे इस शाखा के लिए सभी कामों को दोबारा छोड़ देगा। क्या 'git rebase -i HEAD~MASTER' या इसी तरह कुछ है। मुझे लगता है कि मैं 'git rebase -i HEAD~2' कर सकता हूं, लेकिन मैं वास्तव में यह नहीं जानना चाहता कि कितने काम किए गए हैं। मैं 'git rebase -i sha1' भी कर सकता था लेकिन मैं पहले प्रतिबद्ध sha1 को खोजने के लिए गिट लॉग के माध्यम से कंघी नहीं करना चाहता हूं। कोई विचार?

+1

कृपया अपने प्रश्न को थोड़ा बेहतर शीर्षक दें। शायद उल्लेख करें कि आप शाखा में सभी बदलावों के लिए एक इंटरैक्टिव रिबेस करना चाहते हैं। एक प्रश्न के रूप में अधिमानतः (हालांकि हमेशा संभव नहीं)। – Dustin

+0

क्या आप एक संशोधित 'मास्टर' पर रीबेस करना चाहते हैं या सिर्फ 'टेस्ट-शाखा' पर किए गए कामों को संपादित करना चाहते हैं? – DylanYoung

उत्तर

32

क्या आपने कोशिश की है: git rebase -i master?

+0

मैंने अभी अपने नमूना भंडार में इसका परीक्षण किया और यह काम करता है। – Otto

+14

यह विफल रहता है यदि मास्टर आपकी शाखा में मौजूदा विलय आधार से आगे है। –

+3

'गिट रीबेज -आई मास्टर' के साथ समस्या यह है कि आप विवादों को विलय कर सकते हैं जिन्हें आप इस समय से निपटना नहीं चाहते हैं, या आप एक प्रतिबद्धता में एक संघर्ष को ठीक कर सकते हैं, केवल इसे किसी अन्य प्रतिबद्धता में ठीक करने के लिए रिबेस के दौरान। मैंने एक ऐसा उत्तर जोड़ा है जो इसके लिए एक विकल्प प्रदान करता है, और सटीक प्रतिबद्धता निर्दिष्ट करने का विकल्प, या जिस चीज से आप पुन: प्रयास करना चाहते हैं उसे वापस करने का विकल्प प्रदान करता है। –

17

गिटक (* निक्स), या गीट्क्स (ओएस एक्स) या अन्य प्लेटफॉर्म पर समान का उपयोग करें, और देखें कि कौन सी प्रतिबद्धता आपकी शाखा की जड़ थी। तब चलाएँ:

gitx screencap http://img.skitch.com/20081213-mq7qpp5nhceksdhfx14rerjgyx.jpg

अब मैं जड़ हैश पता है कि मैं इस चला सकते हैं::

git rebase -i 38965ed29d89a4136e47b688ca10b522b6bc335f 

git rebase -i <the SHA hash of the root commit> 

उदाहरण के लिए, मैं एक भंडार है कि मैं gitx का उपयोग कर निरीक्षण किया है

और मेरा संपादक इसके साथ पॉप अप करता है और मैं जो कुछ भी कर सकता हूं उसे पुनर्व्यवस्थित/स्क्वैश/कर सकता हूं।

pick 50b2cff File 1 changes. 
pick 345df08 File 2 changes. 
pick 9894931 File 3 changes. 
pick 9a62b92 File 4 changes. 
pick 640b1f8 File 5 changes. 
pick 1c437f7 File 6 changes. 
pick b014597 File 7 changes. 
pick b1f52bc File 8 changes. 
pick 40ae0fc File 9 changes. 

# Rebase 38965ed..40ae0fc onto 38965ed 
# 
# Commands: 
# pick = use commit 
# edit = use commit, but stop for amending 
# squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

मैं वहाँ Git को समझाने के लिए स्वचालित रूप से पेड़ की जड़ यह पता लगाने के लिए कुछ जादू तरीका है यकीन है, लेकिन मैं नहीं जानता कि यह क्या है।

संपादित करें: यह जादू यह है:

git log master..other_feature | cat 

कौन सा ताकि आप देख पहले तुरंत प्रतिबद्ध आप बिल्ली है कि शाखा पर सभी करता है, और पाइपिंग दिखाएगा पेजर को निष्क्रिय कर देगा।

संपादित करें: के संयोजन के ऊपर एक पूरी तरह से स्वचालित समाधान देता है:

git rebase -i `git log master..other_feature --pretty=format:"%h" | tail -n 1`~ 
+4

-1 ओपी ने कहा कि वह लॉग –

+0

'के माध्यम से trawl नहीं करना चाहता था। जब आप 'git --no-pager' का उपयोग कर सकते हैं तो बिल्ली' बिल्ली के बेकार उपयोग की तरह लगती है। –

+0

@MatthieuMoy --no-pager शायद उस संस्करण में नहीं था जिसका मैं दिसंबर 2008 में उपयोग कर रहा था। वह विकल्प जुलाई 2008 तक कोडबेस में नहीं मिला था। Https://github.com/git/git/commit/ 4e10738a9392ad285aca7d3a19e6775d6b7b513e – Otto

44

ठीक है, मैं कर रहा हूँ asuming शाखा "सुविधा" कहा जाता है और यह "मास्टर" से branched था।

इस छोटे गिट कमांड को मर्ज-बेस कहा जाता है। इसमें दो काम करता है और आपको उन दोनों का पहला आम पूर्वज देता है। तो ...

git merge-base feature master 

... आपको उन दो कामों का पहला आम पूर्वज देगा। पता है क्या होता है जब आप पारित कि मैं rebase, जैसे git करने के लिए प्रतिबद्ध ...

git rebase -i `git merge-base feature master` 

इंटरएक्टिव दोनों गुरु और सुविधा शाखा का पहला पूर्वज से rebase। लाभ! ;)

+1

हालांकि यह बदसूरत है - क्या हाथ पर कोई वाक्य रचनात्मक चीनी नहीं है? –

+8

यह बहुत सारे गिट समाधानों की तुलना में काफी सुंदर है :)। – studgeek

+5

मैं 'गिट मर्ज-बेस मास्टर हेड' का उपयोग करने के लिए सुझाव दूंगा जो हमेशा मौजूदा शाखा नाम टाइप किए बिना मौजूदा शाखा के लिए काम करना चाहिए। इस आदेश को उपनाम करें और आपको अपना अच्छा छोटा गिट कमांड मिल गया है। – jayeff

1

एक सामान्य समाधान (आप नदी के ऊपर शाखा का नाम पता नहीं है) है:

git rebase -i @{upstream} 

ध्यान दें कि यदि आपके अपस्ट्रीम (शायद एक ट्रैकिंग शाखा) को अद्यतन किया गया है के बाद से आप पिछले रिबेस, आप अपस्ट्रीम से नए कामों में भाग लेंगे।आप नए प्रतिबद्ध में खींचने के लिए नहीं करना चाहते हैं,

git rebase -i `git merge-base --all HEAD @{upstream}` 

का उपयोग लेकिन यह है कि एक कौर का एक सा है।

+0

मैंने सुझाव देखा है कि सममित अंतर सिर ... मास्टर (जो विलय आधार को अस्वीकृत तीसरा शा के रूप में उत्पन्न करता है) का उपयोग गिट रिबेस में किया जा सकता है, लेकिन मैं कैसे काम नहीं कर सकता। –

0
git rebase -i --onto @{u}... @{u} 

इंटरएक्टिव रिबेस प्रमुख के एकल मर्ज बिंदु और सिर में सभी प्रतिबद्ध है कि इसके अपस्ट्रीम में नहीं हैं अपनी नदी के ऊपर से शुरू।

दूसरे शब्दों में आप वास्तव में क्या चाहते हैं।

+0

लेकिन यदि '@ {u}' कॉन्फ़िगर किया गया है, तो आप तर्कहीन 'गिट रिबेस' का उपयोग कर सकते हैं, मेरा उत्तर देखें। –

4

गीट v1.7.10 के बाद से, आप तर्क के बिना git rebase चला सकते हैं, और इसे फोर्क पॉइंट मिलेगा और अपस्ट्रीम शाखा पर आपके स्थानीय परिवर्तनों को रीबेस कर देगा।

आपको काम करने के लिए अपस्ट्रीम शाखा को कॉन्फ़िगर करने की आवश्यकता है (यानी git pull तर्क के बिना काम करना चाहिए)।

अधिक जानकारी के लिए git rebase के लिए दस्तावेज़ देख सकेंगे:

अगर निर्दिष्ट नहीं है, नदी के ऊपर branch..remote और branch..merge विकल्पों में विन्यस्त उपयोग किया जाएगा (देखें Git-config [ 1] विवरण के लिए) और - फर्क-पॉइंट विकल्प माना जाता है। यदि आप वर्तमान में किसी भी शाखा पर नहीं हैं या यदि वर्तमान शाखा पर एक कॉन्फ़िगर अपस्ट्रीम नहीं है, तो rebase निरस्त हो जाएगा।

38

सभी प्रदत्त समाधानों के साथ समस्या यह है कि वे आपको पहली प्रतिबद्धता से पुनर्जीवित करने की अनुमति नहीं देते हैं। पहले प्रतिबद्ध हैश XYZ है और यदि आप करते हैं:

git rebase -i XYZ 

आप केवल 2 से शुरू रिबेस प्रतिबद्ध।

आप से rebase चाहते हैं पहले प्रतिबद्ध आप करते हैं:

git rebase -i --root 
+5

मुझे विश्वास है कि यह सही जवाब है। –

+12

लेकिन "--root" शाखा में पहली प्रतिबद्धता के बजाय पहली प्रतिबद्धता * कभी * से रीबेस करता है जो ओपी –

4

एक अलग शाखा

से रिबेसिंग के साथ समस्या यह

git rebase -i master के साथ समस्या यह है कि आप इस विलय के विरोध हो सकता है कि आप जरूरी नहीं कि इस समय से निपटना पड़े, या आप एक प्रतिबद्धता में एक संघर्ष को ठीक कर सकते हैं, केवल पुनर्जन्म के दौरान किसी अन्य प्रतिबद्धता में इसे ठीक करने के लिए।

प्रतिबद्ध एक ज्ञात से रिबेसिंग के साथ समस्या यह

पूरी समस्या यहाँ आप करने के लिए है पता जो प्रतिबद्ध आप का उल्लेख करने के लिए है, या तो अपने SHA द्वारा, या HEAD ~ एक्स, आदि है कि है यह केवल एक मामूली परेशानी है लेकिन यह एक परेशानी है।

बेहतर तरीका

आप के बजाय अपने वर्तमान शाखा में सभी प्रतिबद्ध rebase चाहते हैं, सबसे हाल ही में के बाद से प्रतिबद्ध यह अपनी मूल शाखा के साथ साझा किया है, तो आप के लिए निम्न उर्फ ​​जोड़ सकते हैं।gitconfig:

rbi = !sh -c \"git rebase -i `git merge-base $1 HEAD`\" - 

प्रयोग

git rbi parentBranch 

यह कैसे काम करता

यह अन्य नाम सिर्फ एक खोल स्क्रिप्ट है, कि एक तर्क जो माता-पिता शाखा को संदर्भित करता है उपयोग कर रहा है। उस शाखा और वर्तमान शाखा के बीच सबसे हालिया साझा प्रतिबद्धता निर्धारित करने के लिए यह तर्क git merge-base में पारित किया गया है।

+0

के लिए पूछ रहा है, मुझे यकीन नहीं है कि यह उत्तर दिए गए टोपोलॉजी के साथ बिल्कुल समझ में आता है। उस समय मर्ज बेस 'मास्टर' होगा जब 'टेस्ट-शाखा' बनाया गया था ('3hgn45' कहें)। तो यह विद्रोह वास्तव में कुछ भी नहीं करता है। यह कहता है कि इस शाखा को '3hgn45' से (लेकिन इसमें शामिल नहीं) (और सहित) 'HEAD'' को '3hgn45' पर) शामिल करें। लेकिन शायद मैं आपके सुझाव को गलत समझ रहा हूं ... – DylanYoung

+0

संपादित करें: मुझे यह मिल गया है; ओपी का सवाल सिर्फ मुझे स्पष्ट नहीं था। आप एक चेतावनी जोड़ने पर विचार कर सकते हैं कि यह 'मास्टर' से परिवर्तनों को बनाए रखेगा (यानी यह वास्तव में पुन: प्रयास नहीं कर रहा है, क्योंकि आप एक ही आधार बनाए रखते हैं, बस वर्तमान शाखा पर कुछ काम करते हैं)। – DylanYoung

+1

@DylanYoung - हाँ, ओपी के सवाल की मेरी समझ यह थी कि वे वास्तव में 'मास्टर' के शीर्ष पर पुनर्विचार नहीं करना चाहते थे, लेकिन 'मास्टर' से अलग होने के बाद से सभी स्क्वैश एक में काम करते हैं। –