2015-04-08 6 views
30

मैं स्क्रिप्ट रीबिंग करने की कोशिश कर रहा हूं और मेरी स्क्रिप्ट किसी भी विवाद में रिबेस के परिणाम के आधार पर अलग-अलग पथ लेगी।क्या कोई गिट रिबेस - ड्राई-रन 'है, जो मुझे पहले से ही संघर्षों के बारे में सूचित करेगा?

क्या यह निर्धारित करने का कोई तरीका है कि रिबेस के परिणामस्वरूप रिबेस के परिणामस्वरूप संघर्ष हो सकता है?

+0

आप जिस 'गीट रिबेस' कमांड का उपयोग कर रहे हैं उसका सटीक रूप क्या है? क्या आप किसी भी वैकल्पिक झंडे का उपयोग कर रहे हैं? और आप किस स्क्रिप्टिंग भाषा का उपयोग कर रहे हैं? शैल? – Jubobs

+3

यदि आप 'गिट रिबेस' चलाते हैं और विलय विवाद को दबाते हैं, तो प्रक्रिया रुक जाएगी और एक गैर-शून्य स्थिति से बाहर निकल जाएगी। आप रिबेस ऑपरेशन की निकास स्थिति की जांच कर सकते हैं, और, यदि यह nonzero है, तो ऑपरेशन रद्द करने के लिए 'git rebase --abort' चलाएं। – Jubobs

+1

क्या आपको ऐसा करने का कोई तरीका मिला? – crmpicco

उत्तर

25

लिखने के समय (Git v2.6.1 v2.10.0) में git rebase आदेश का कोई --dry-run विकल्प प्रदान करता है। वास्तव में रीबेज करने का प्रयास करने से पहले, जानने का कोई तरीका नहीं है, चाहे आप संघर्ष में भाग लेंगे या नहीं।

हालांकि, यदि आप git rebase चलाते हैं और एक संघर्ष दबाते हैं, तो प्रक्रिया रुक जाएगी और एक गैर-शून्य स्थिति से बाहर निकल जाएगी।

git rebase ... || git rebase --abort 
+1

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

+0

@ bluenote10 आप शाखा के [reflog] (https://git-scm.com/docs/git-reflog) का उपयोग कर इसे रीसेट करने के लिए रीसेट करने के लिए उपयोग करने के लिए उपयोग कर सकते हैं। – Jubobs

4

मुझे लगता है कि git rebase ... --dry-run संभव नहीं है, निम्न कारणों से: क्या तुम कर सकते हो रिबेस आपरेशन के निकास की स्थिति की जांच, और, अगर यह अशून्य है, चलाने git rebase --abort रिबेस रद्द करने के लिए है।

जब आप git rebase कर रहे हैं, तो गिट प्रारंभिक बिंदु पर रोलबैक करेगा, फिर शाखा को अद्यतित करने के लिए प्रत्येक प्रतिबद्धता के लिए पैच लागू करें। यदि यह किसी संघर्ष को हिट करता है, तो यह & को जारी रखने से पहले संघर्ष को हल करने का इंतजार करेगा। जिस संघर्ष के बाद विद्रोह उस संघर्ष के बाद होता है उस पर निर्भर करता है कि आप संघर्ष को कैसे हल करते हैं - यदि आप इसे एक निश्चित तरीके से हल करते हैं, तो बाद में संघर्ष (या समाप्त) हो सकता है। बाद में संघर्ष की रिपोर्ट कैसे है कि पहले संघर्ष हल हो गई है पर निर्भर करेगा -

इस प्रकार, git rebase ... --dry-run केवल आप पहले संघर्ष देने के लिए सक्षम नहीं होगा।

ऐसा करने का एकमात्र तरीका मैं वर्तमान स्थिति और उस शाखा में अंतिम प्रतिबद्धता के बीच git diff के माध्यम से हो सकता हूं, जिस पर आप पुन: प्रयास कर रहे हैं। लेकिन यह वास्तव में आपको वह नहीं देगा जो आप खोज रहे हैं - आपको वास्तव में की एक सूची की आवश्यकता है जो दो बिंदुओं के बीच विरोधाभासी है। git diff के साथ ऐसा करने का एक तरीका हो सकता है, लेकिन यह सामान्य पैच नहीं है।

3

आप अभी भी गिट रिबेस कर सकते हैं, जैसा कि आप चाहते हैं, इसके साथ खेलें, पहले से सभी परिवर्तनों को पुनर्प्राप्त करने के बजाय। मान लें आप master में कुछ शाखा के अपने रिबेस किया है, और आप इसे पसंद नहीं है:

  1. git reflog -20 - आप एक छोटे से वर्णन
  2. git checkout <the_branch_name> के साथ अपने सिर के पिछले 20 पदों देता है - अपने सिर देता है शाखा
  3. git reset --hard <old_sha1_found_in_reflog> - पुरानी रेफरी पर आपके सिर और शाखा को स्थानांतरित करता है, इस तरह आप पुरानी शाखा को पुनर्प्राप्त कर सकते हैं।

कुछ यांत्रिकी यहाँ समझने के लिए कर रहे हैं:

  1. आप कभी नहीं कुछ भी Git में, वैसे भी हटा सकते हैं, आदेशों के साथ नहीं। इसका कचरा कलेक्टर जो अनियंत्रित शाखाओं (डिफ़ॉल्ट 3 महीने) के माध्यम से आता है और हटा देता है। तो आपकी शाखा, रिबेस से पहले, अभी भी मौजूद है।
  2. वही शाखा पुनर्भुगतान के लिए चला जाता है, यह सिर्फ एक नया पेड़ पुराना एक के बगल में लिखा जाता है।
  3. सभी rebase के इतिहास और सिर जोड़तोड़ पर अपने अन्य आप से reflog

तो, कुछ भी नहीं rebase के बाद खत्म हो जाता है, तो आप सिर्फ है @{N} व्याख्या का उपयोग कर सकते हैं पता है कि कैसे reflog

  • में लिखा है इसे खोजने और पुनर्प्राप्त करने के लिए।

    उदाहरण के लिए आप rebase से पहले इसे टैग या इसे हटाने से पहले एक टैग डाल सकते हैं। यह आपको सभी SHA1 शोध चरण से बचाता है।

  • 1

    तुम सिर्फ देखने के लिए कि रिबेस सफल होगा, लेकिन फिर आप करना चाहते हैं तो "वापस रोल," आप reposition the branch tip वापस मूल करने के लिए alway कर सकते हैं करते हैं। बस मूल SHA का टैग करें या नोट करें।

    या शायद आसान, एक नया अस्थायी शाखा बनाने जिसमें "मंच" रिबेस के लिए:

    git checkout your-branch 
    git checkout -b tmp 
    git rebase other-branch 
    

    यदि यह सफल रहा था लेकिन आप करना चाहते हैं "रोल बैक," your-branch अछूता है। बस git branch -D tmp और आप उस स्थान पर वापस गए हैं जहां से आपने शुरुआत की थी।

    यदि संघर्ष थे और आपने उन्हें हल करने के लिए कुछ काम किया था और अब आप रिबेस को रखना चाहते हैं, तो बस अपनी शाखा टिप को tmp (और फिर git branch -D tmp) पर पुनर्स्थापित करें।

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