2010-01-17 10 views
6

रिबेस के साथ खेल काफी कुछ घंटे के बाद, रेपो अभी भी से अलग दिखता है कि मैं क्या जरूरत है:गिट रिबेस का उपयोग करके मैं कैसे काम/गठबंधन कर सकता हूं?

मैं निम्नलिखित कार्यों को पूरा करना चाहते हैं:
[जिनमें से कुछ ठीक थे इससे पहले कि मैं रिबेस के साथ खिलवाड़ शुरू कर दिया :(]

  • ले जाएँ शीर्ष प्रतिबद्ध ("बाहरी निकाला गया ...") शाखा बंद (सही "# 226 के लिए ठीक" ऊपर) से पहले।
  • करने के लिए दो करता है कि 'मोड़ में हैं कम्बाइन/मुख्य 'शाखा।   "अल्पविराम" और "लोड किया गया ..." एक ही प्रतिबद्ध होना चाहिए, और मुझे प्रतिबद्ध संदेश की आवश्यकता नहीं है o एफ "कॉमा" बिल्कुल।
  • नए संयुक्त "ले जाएं लोड" प्रतिबद्धता को 'बैकअप' शाखा में मर्ज करें, और 'मोड़' से छुटकारा पाएं।
  • 'मास्टर' को ले जाएं जहां यह अब 'बैकअप' कहता है।
  • "रिमोट/उत्पत्ति/मास्टर" टैग का क्या अर्थ है?

enter image description here

मुझे लगता है कि यह एक बहुत पूछ रहा है, लेकिन वास्तविक GIT आदेशों शामिल करें।

मुझे अपने आप को पढ़ने और कोशिश करने में कोई फर्क नहीं पड़ता है, लेकिन परिणामों से थोड़ा उलझन में हूं जो मुझे उम्मीद नहीं थी, और मैं वास्तव में किसी भी काम को गलती से नष्ट नहीं करना चाहता हूं।

+0

इस प्रश्न में काफी खराब शीर्षक "गिट रीबेस सहायता" है और यह अलग-अलग संचालनों की एक श्रृंखला है जिसे आप करना चाहते हैं। एक प्रश्न के रूप में इसे पुनः प्रयोग करने का प्रयास करें। पहला लक्ष्य जिसे आप पूरा करने की कोशिश कर रहे हैं, एक प्रश्न के रूप में, संभवतः उनमें से बाकी को स्पष्ट कर देगा। – Dustin

+0

मुझे नहीं लगता कि यह एक बुरा शीर्षक है, यह निश्चित रूप से एक समस्या है जिसके लिए काम करने की आवश्यकता होती है। –

+1

क्या आप वाकई 'मोड़' और 'बैकअप' शाखाओं को मर्ज करना चाहते हैं? मैं पूछता हूं क्योंकि वे दोनों समान दिखने वाले विवरणों के साथ काम करते हैं। –

उत्तर

8

सबसे पहले, backup फिर से ऑर्डर करना।

# Safety, should be a no-op if your gitk snapshot is accurate 
git checkout backup 

# Temporary branch 
git branch backup-save backup 

# Move top commit onto 'Fix for #226: 
git rebase --onto origin/master HEAD^ 

# Go back to saved branch's parent (i.e. without the moved commit) 
git reset --hard backup-save^ 

# Rebase onto the moved commit ([email protected]{1} is where HEAD was 1 step 
# ago i.e. before the reset.) 
git rebase [email protected]{1} 

# Don't need the saved branch any more (although you might want 
# to keep it for a bit just in case). This deletes it: 
git branch -D backup-save 

शीर्ष प्रतिबद्ध संदेश को अनदेखा करते हुए मोड़ पर दो कामों को संयोजित करें।

git checkout twist 

git reset --soft HEAD^ 

# Just re-save the commit message, alternatively to skip the 
# editor step do this: git commit --amend -C HEAD 
git commit --amend 

backup में twist शाखा मर्ज, मोड़ शाखा को हटा दें।

git checkout backup 
git merge twist 
git branch -d twist 

master ले जाएं। कई फैंसी तरीके हैं, लेकिन यह सबसे आसान है। मुझे लगता है कि आप master संपादित करना चाहते हैं ताकि backup स्थिति को इंगित किया जा सके और यह मूल रूप से कहां नहीं था।

git checkout master 
git reset --hard backup 

remote/origins/master रिमोट ट्रैकिंग शाखा है और आपको बताता है जहां दूरदराज के भंडार origin में master शाखा के लिए शाखा सूचक है, या बल्कि था जब आप पिछले प्राप्त किए गए, धक्का दिया या खींच लिया।

+0

वाह, आप अच्छे हैं। 1. 'गिट चेकआउट मोड़' कदम मोड़ शाखा में दो कामों के संयोजन में सफल नहीं हुए। क्या यह माना जाता था, या क्या मुझे कुछ याद आ रहा है?
2. 'गिट मर्ज ट्विस्ट' पर। यह शिकायत करता है: CONFLICT (सामग्री): स्रोत/Depender.js में विलय विलय स्वचालित विलय विफल; संघर्ष को ठीक करें और फिर परिणाम दें।
मैं संघर्ष कैसे ठीक करूं? – SamGoody

+0

रुको, मुझे गिट एड के साथ संघर्ष को ठीक करने के बारे में पता है। एक मिनट में वापस रिपोर्ट करेंगे, या तो आगे गड़बड़ हो जाएगी, या सभी खुश होंगे। – SamGoody

+0

जबकि मुझे काम करने के लिए उन दो कदमों को काफी कुछ नहीं मिला, लेकिन मुझे उद्देश्य प्राप्त करने के लिए काफी करीब मिला। जो कुछ भी आपने लिखा था वह स्पष्ट और बिंदु पर था। बहुत बहुत धन्यवाद। – SamGoody

6

कैसे डर

मैं तुम्हें दिखाना चाहते हैं रहो नहीं करने के लिए कि कोई बात नहीं कितना बुरा आप गंदगी, करता है कभी नहीं नष्ट हो * और आप हमेशा वापस करने के लिए जहां आप कार्य आरंभ कर सकते हैं।

मैं एक छद्म Git पेड़ एक ही आकार है कि के रूप में आप सचित्र कर दिया है:

मैं अब 'बैकअप' शाखा से पिछले तीन प्रतिबद्ध का सफाया करने जा रहा हूँ:

$ git log --oneline 
9b41f46 Removed extraneous whitespace 
981e2e8 Merged the "loadscripts" function 
005bc62 Pick up a few very fringe cases 
07e71d9 Merged "getDepsForScript" function 
... 
$ git reset --hard HEAD~3 
HEAD is now at 07e71d9 Merged "getDepsForScript" function 
$ git log --oneline 
07e71d9 Merged "getDepsForScript" function 
... 

ओह, वह बुरा था। आइए हम वापस कहां से शुरू करें। सबसे पहले देखते हैं कि हम क्या किया:

$git reflog 
07e71d9 [email protected]{0}: HEAD~3: updating HEAD 
9b41f46 [email protected]{1}: commit: Removed extraneous whitespace 
... 

आप देख सकते हैं कि जब हम रीसेट, सभी Git कि पुराने प्रतिबद्ध करने के लिए प्रमुख बिंदु बनाने के लिए था। लेकिन वास्तव में कोई काम नहीं हुआ - वे सिर्फ अनाथ बन गए, किसी भी शाखा का हिस्सा नहीं। आइए उन्हें फिर से "बैकअप" शाखा का हिस्सा बनाएं:

$ git reset --hard 9b41f46 
HEAD is now at 9b41f46 Removed extraneous whitespace 
$ git log --oneline 
9b41f46 Removed extraneous whitespace 
981e2e8 Merged the "loadscripts" function 
005bc62 Pick up a few very fringe cases 
07e71d9 Merged "getDepsForScript" function 
... 

गिट का मतलब है कि आपको कभी भी खेद नहीं है।

* ढीले वस्तुओं को अंततः कचरा इकट्ठा किया जाता है, लेकिन जब तक वे कम से कम दो सप्ताह तक नहीं होते हैं।

आप जो चाहते हैं उसे कैसे करें।

पहले के मास्टर में दो करता गठबंधन करते हैं:

$ git checkout master 
$ git rebase -i HEAD~2 

Git अपने संपादक का शुभारंभ करेंगे। इस बदलें:

pick 6389f4e Moved "loaded" function out of "require". 
pick 41fb646 comma 
इस के लिए

:

pick 6389f4e Moved "loaded" function out of "require". 
s 41fb646 comma 

और सेव करें। गिट फिर से आपका संपादक लॉन्च करेगा। इस बदलें:

# This is a combination of two commits. 
# The first commit's message is: 

Moved "loaded" function out of "require". 

# This is the 2nd commit message: 

comma 
इस के लिए

:

Moved "loaded" function out of "require". 

और सहेजें।

अब चलो 'बैकअप' में प्रतिबद्ध पुन: व्यवस्थित करते हैं:

$ git checkout backup 
$ git rebase -i remotes/origin/master 

अपने संपादक पॉप अप होता है, यह बदलने के लिए:

pick ec7f71c moved "loaded" function out of "require" 
pick 4a76897 Replaced maploaded event 
pick 07e71d9 Merged "getDepsForScript" function 
pick 005bc62 Pick up a few very fringe cases 
pick 981e2e8 Merged the "loadscripts" function 
pick 9b41f46 Removed extraneous whitespace    <----- 
इस के लिए

:

pick 9b41f46 Removed extraneous whitespace    <----- 
pick ec7f71c moved "loaded" function out of "require" 
pick 4a76897 Replaced maploaded event 
pick 07e71d9 Merged "getDepsForScript" function 
pick 005bc62 Pick up a few very fringe cases 
pick 981e2e8 Merged the "loadscripts" function 

और सहेजें।

अब चेरी लेने मर्ज किए गए "लोड ले जाया गया" एक ही करने के लिए गुरु के बंद और वर्तमान शाखा पर ("बैकअप")

$git cherry-pick master 

मेक मास्टर बिंदु प्रतिबद्ध "बैकअप"

$git checkout master 
$git reset --hard backup 
के रूप में प्रतिबद्ध

मोड़ शाखा से छुटकारा

$git branch -D twist 
+0

मैं आपके काम की बहुत सराहना करता हूं। बहुत विस्तृत और सहायक। – SamGoody

+0

सैम, मेरी खुशी। और यह सिर्फ एक अभिव्यक्ति नहीं है - मुझे बहुत मज़ा आता है और जब मैं परिचित हूं, तो किनारे पर कोई सवाल उठाता हूं। –

+1

+1। पुराने काम करने के लिए अन्य उपयोगी कमांड: fsck (http://freeasinbeard.org/post/318519782/reflog-and-fsck-your-git-disaster-recovery-toolkit) – VonC

0

चीजें आप प्राप्त करने की कोशिश कर रहे हैं की एक संख्या हैं यहाँ और यह एक बालक प्रदान की वास्तव में क्या जरूरत है चित्र से स्पष्ट नहीं है, लेकिन निम्नलिखित संकेत मदद मिल सकती है:

  • बल्कि अपनी शाखा ले जाने की कोशिश की तुलना में

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

  • दो कामों को गठबंधन करने के लिए आप interactive rebase कर सकते हैं।

  • एक शाखा से एक ही प्रतिबद्धता लेने के लिए और इसे दूसरे पर लागू करने के लिए, लक्ष्य शाखा पर git cherry-pick का उपयोग करें। पूरा होने पर आप git branch -D twist का उपयोग कर पुरानी शाखा को हटा सकते हैं।

आशा है कि ये सुझाव आपको अपने लक्ष्य के लिए सड़क पर ले जाएंगे।

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