मैं तोड़फोड़ में हमारे कोड के पुराने संस्करण पर कैसे लौटूं?


486

मैं एक दोस्त के साथ एक परियोजना पर काम कर रहा हूं और मैं अपने कोड के पुराने संस्करण पर लौटना चाहता हूं और इसे वर्तमान होना चाहिए। मैं यह कैसे करुं?

मैं vs08 पर "aksvn" का उपयोग कर रहा हूं।

मेरे पास वह संस्करण है जो मैं अपने पीसी पर चाहता हूं, लेकिन प्रतिबद्ध विफल हो रहा है; मुझे जो संदेश मिलता है वह है "प्रतिबद्ध विफल है, फ़ाइल या निर्देशिका पुराना है।"

मेरे पास मेरे पीसी पर सबवर्सन क्लाइंट भी है।

जवाबों:


783

मूल रूप से आपको "पीछे की ओर मर्ज" करने की आवश्यकता है - वर्तमान और पिछले संस्करण के बीच वर्तमान संस्करण में एक अंतर लागू करें (इसलिए आप पुराने संस्करण की तरह काम करने वाली कॉपी के साथ समाप्त होते हैं) और फिर फिर से प्रतिबद्ध करें। इसलिए उदाहरण के लिए पुनरीक्षण 150 (वर्तमान) से वापस संशोधन 140 पर जाएं:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

द सबवर्सन रेड बुक में इस बारे में एक अच्छा खंड है


3
लेकिन मर्ज मेरे परिवर्तनों और नए संशोधन को ओवरराइड नहीं कर रहा है।
चेन किनरोट

76
यदि आप TortoiseSVN का उपयोग कर रहे हैं, तो फ़ाइल चयन मर्ज पर राइट-क्लिक करें, फिर संशोधन की एक श्रृंखला मर्ज करें। 140-150 में लॉग बॉक्स टाइप करें और रिवर्स चेकबॉक्स पर क्लिक करें। उसके बाद हमेशा की तरह कमिट करें। यह जॉन के उदाहरण के समान ऑपरेशन करेगा।
दावग्रेसिया

8
ग्रहण और उप-ग्रहण के साथ, आप अपनी परियोजना, टीम / शो इतिहास पर राइट-क्लिक कर सकते हैं, फिर उन संशोधनों का चयन करें जिन्हें आप "पूर्ववत करना" चाहते हैं और एक अन्य राइट-क्लिक करें "चयनित संशोधनों से परिवर्तन वापस करें"।
फागो

36
हेड रिवीजन से रिवर्ट करने के लिए आप लिख भी सकते हैं svn merge -r HEAD:140
sschmeck

3
@ DavGarcia के TortoiseSVN निर्देश मेरे लिए सही नहीं थे, कम से कम सभी फाइलों को एक संशोधन (TortoiseSVN 1.8.8 का उपयोग करके) में वापस करने के लिए नहीं था। फ़ोल्डर पर राइट क्लिक करें, TortoisSVN-> शो लॉग चुनें। उस संशोधन को चुनें जिसे आप वापस करना चाहते हैं, "इस संशोधन से परिवर्तन वापस करें" के रूप में राइट क्लिक करें। परिवर्तन करें।
1922 को mhenry1384

177

आप केवल में नए परिवर्तन के लिए प्रतिबद्ध कर सकते हैं सिर तोड़फोड़ इतिहास की।

आपके पीसी पर आपके द्वारा की गई अच्छी प्रति के साथ आप सीधे कुछ नहीं कर सकते, इसका कारण यह है कि इसके .svnफ़ोल्डरों को पता है कि यह अतीत से कोड है, इसलिए किसी भी प्रतिबद्ध से पहले अपडेट की आवश्यकता होती है।

अच्छा रिवीजन नंबर ढूंढें और रिवर्ट करें

  1. अपनी इच्छित पुरानी प्रति की संशोधन संख्या का पता लगाएं।

    अपना वर्तमान संशोधन प्राप्त करें :

    svn info --show-item revision
    # or
    svn log

    या अपनी परियोजना के पुराने संस्करणों की जांच करने के लिए , उपयोग करें:

    svn update -r <earlier_revision_number>

    जब तक आपको सही संशोधन संख्या नहीं मिलेगी।

  2. अच्छे रिवीजन नंबर को नोट करें ( 123नीचे दिए गए उदाहरणों के लिए)।

  3. नवीनतम संशोधन के लिए अद्यतन करें:

    svn update
  4. अपने इच्छित संशोधन और नवीनतम संस्करण के बीच सभी परिवर्तनों को पूर्ववत करें:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (जॉन स्कीट के उत्तर के समान ही)

यदि आपको संशोधन संख्या नहीं मिल रही है

यदि आपको पुरानी कॉपी नहीं मिल रही है, और आप अभी अपने पीसी पर फाइल करना चाहते हैं:

  1. अपने अच्छे संस्करण की प्रतिलिपि बनाएँ (लेकिन किसी भी .svnफ़ोल्डर के बिना ):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. अब सुनिश्चित करें कि आपके पास नवीनतम संस्करण है:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. काम कर रहे कॉपी के शीर्ष पर अपना अच्छा संस्करण कॉपी करें।

    यह कमांड कॉपी करेगा, और वर्किंग ट्री से किसी भी फाइल को डिलीट कर देगा जो आपकी अच्छी कॉपी में नहीं है, लेकिन यह मौजूदा .svnफोल्डर को प्रभावित नहीं करेगा ।

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    यदि आपके पास rsync नहीं है, तो आप उपयोग कर सकते हैं cp -aलेकिन आपको मैन्युअल रूप से किसी भी अवांछित फाइल को हटाने की आवश्यकता होगी।

  4. आपके पास अभी जो है उसे करने में सक्षम होना चाहिए।

    cd project
    svn commit "Reverted to good copy"

2
svn इसे एक संशोधन के रूप में व्याख्या नहीं करता है, मैं ऐसा नहीं कर सकता।
सैंडबर्ग

svn मर्ज -r HEAD: 12345। वापस करने के लिए सही कमांड है, अपडेट -r नहीं करें। आप पागल व्यक्ति
उल्लू

मुझे लगता है कि यह उत्तर उन लोगों द्वारा उतारा गया था जो अपने संशोधन संख्या को नहीं पा सके, या जिन्होंने प्रमुख स्पष्टीकरण की सराहना की। मैंने दोनों दृष्टिकोणों को शामिल करने के लिए अब उत्तर को अपडेट कर दिया है।
joeytwiddle

36

बस इस लाइन का उपयोग करें

svn अपडेट -r yourOldRevesion

आप अपने वर्तमान संशोधन का उपयोग करके जान सकते हैं:

svn जानकारी


15
इससे समस्या का समाधान नहीं होता है। इसके बजाय, यह उस राज्य का निर्माण करता है जो पूछने वाला अपने सवाल पूछने के समय था।
इंगो शल्क-स्कूप

1
यदि आप इस सलाह का पालन करने के लिए पर्याप्त रूप से दुर्भाग्यशाली रहे हैं, तो दौड़ें: "svn solution --accept working -R।"
उल्लू

27

संपूर्ण चेक-इन कार्यों को पूर्ववत् करने के लिए मर्ज का उपयोग करने का मानक तरीका, यदि आप ऐसा करना चाहते हैं। कभी-कभी, हालांकि, आप जो भी करना चाहते हैं, वह एकल फ़ाइल को वापस करना है। ऐसा करने का कोई वैध तरीका नहीं है, लेकिन एक हैक है:

  1. वह संस्करण ढूंढें जिसे आप svn लॉग का उपयोग करना चाहते हैं।
  2. Svn के निर्यात उपकमांड का उपयोग करें:

    svn निर्यात http: // url-to-your-file @ 123 / tmp / फ़ाइल नाम

(जहां 123 फ़ाइल के अच्छे संस्करण के लिए संशोधन संख्या है।) फिर पुरानी फ़ाइल को अधिलेखित करने के लिए उस एकल फ़ाइल को स्थानांतरित या कॉपी करें। संशोधित फ़ाइल में जाँच करें और आप कर रहे हैं।


Tortoise-svn का उपयोग करके मैं एक फ़ाइल पर राइट-क्लिक कर सकता हूं और इसे मर्ज कर सकता हूं। ऐसा करने का एक तरीका भी होना चाहिए svn?
एलसी।

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
डैश


5

मुझे लगता है कि यह सबसे अनुकूल है:

उदाहरण के लिए, मर्जिंग बैकवर्ड करें, यदि प्रतिबद्ध कोड में संशोधन 5612 से 5616 तक है, तो बस इसे पीछे की ओर मर्ज करें। यह मेरे अंत में काम करता है।

उदाहरण के लिए:

svn merge -r 5616:5612 https://<your_svn_repository>/

इसमें पूर्व संशोधन के लिए एक विलय कोड वापस होगा, फिर आप इसे कर सकते हैं।


3

यह वही है जो मैंने किया और मेरे लिए काम किया।

मैं कई बार किए गए परिवर्तनों को पूर्ववत करना चाहता हूं जो मैंने कुछ समय के लिए किए थे और पिछले प्रतिबद्ध बिंदु पर जाना चाहते हैं।

  1. टीम पर जाएं -> इतिहास दिखाएं।
  2. उन संशोधनों की श्रेणी पर राइट-क्लिक करें जिन्हें आप अनदेखा करना चाहते हैं।
  3. "परिवर्तन वापस करें" विकल्प चुनें।

यह आपकी कार्य प्रतिलिपि में परिवर्तनों को पूर्ववत करते हुए एक रिवर्स मर्ज चलाएगा।

बस कोड की समीक्षा करें और प्रतिबद्ध करें।


2

उस उच्च पदानुक्रम पर राइट-क्लिक करें जिसे आप वापस करना चाहते हैं >> RevertयाRevert to Revision


2

पिछले उत्तरों में से अधिकांश एक रिवर्स मर्ज का उपयोग कर रहे हैं, और यह आमतौर पर सही उत्तर है। हालाँकि, वहाँ एक स्थिति है (जो सिर्फ मेरे साथ हुआ है) जहां यह नहीं है।

मैंने गलती से एक छोटी सी परिवर्तन करते समय यूनिक्स लाइन के अंत के साथ फाइल को डीओएस लाइन के अंत में बदल दिया, और इसे प्रतिबद्ध किया। यह आसानी से पूर्ववत है, या तो लाइन एंडिंग को बदलकर और फिर से मर्ज करके, या रिवर्स मर्ज करके, लेकिन यह svn blameफ़ाइल के हर लाइन के स्रोत के रूप में मेरे संपादन सूची बनाने का प्रभाव है । (दिलचस्प बात यह है कि विंडोज पर TortoiseSVN इससे प्रभावित नहीं होता; केवल कमांड लाइन svn blame।)

यदि आप रिपोर्ट के अनुसार इतिहास को बनाए रखना चाहते हैं svn blame, तो मुझे लगता है कि आपको निम्नलिखित कार्य करने की आवश्यकता है:

  • फ़ाइल को हटा दें और प्रतिबद्ध करें।
  • रिपॉजिटरी में, फ़ाइल की पिछली अच्छी कॉपी को हेड में कॉपी करें, और कमिट करें।
  • किसी भी संपादन को पुनर्स्थापित करें जिसे आप रखना चाहते हैं।

विलोपन थोड़ा डरावना है, लेकिन याद रखें कि आपके पास हमेशा रिपॉजिटरी में सहेजी गई फ़ाइल होती है, इसलिए इसे पुनर्स्थापित करना कोई बड़ी बात नहीं है। चरणों का वर्णन करने के लिए यहां कुछ कोड दिए गए हैं। मान लें कि xxxअंतिम अच्छी प्रति का संशोधन संख्या है।

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

ध्यान दें कि रिपॉजिटरी में एक कॉपी के लिए, गंतव्य को एक निर्देशिका होने की आवश्यकता है, न कि एक फ़ाइल नाम।


1

प्रोजेक्ट पर राइट क्लिक करें> बदलें के साथ> संशोधन या URL> उस विशिष्ट संशोधन का चयन करें जिसे आप वापस करना चाहते हैं।

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


1

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

किसी संस्करण पर वापस लौटने का सही तरीका है:

svn merge -r HEAD:12345 .

जहाँ 12345 संस्करण संख्या है। डॉट मत भूलना।


0

पुराने संस्करण के साथ सिंक करें और इसे कमिट करें। यह काम कर जाना चाहिए।

यहां पूर्ववत परिवर्तनों का विवरण भी दिया गया है।


0

जॉन स्कीट का जवाब बहुत संक्षेप में समाधान है, हालांकि यदि आप मेरे जैसे हैं, तो आप एक स्पष्टीकरण चाहते हैं। तोड़फोड़ मैनुअल यह एक कहते हैं

चेरी-पिक मर्ज

आदमी पृष्ठों से।

  1. इस फॉर्म को 'चेरी-पिक' मर्ज कहा जाता है: '-r N: M', स्रोत शाखा के इतिहास में अंतर N और M के बीच के अंतर को दर्शाता है।

    परिवर्तनों को पूर्ववत करने के लिए एक 'रिवर्स रेंज' का उपयोग किया जा सकता है। उदाहरण के लिए, जब स्रोत और लक्ष्य एक ही शाखा को संदर्भित करते हैं, तो पहले से किया गया संशोधन 'पूर्ववत' हो सकता है। एक रिवर्स रेंज में , N '-r N: M' में M से बड़ा है, या '-c' विकल्प का उपयोग नकारात्मक संख्या के साथ किया जाता है: '-c -M' '-r M:' के बराबर है। इस तरह के बदलावों को 'रिवर्स मर्ज' करने के रूप में भी जाना जाता है।


  • यदि स्रोत एक फ़ाइल है, तो उस फ़ाइल पर अंतर लागू होते हैं (पहले के बदलावों को रिवर्स-मर्ज करने के लिए उपयोगी)। अन्यथा, यदि स्रोत एक निर्देशिका है, तो लक्ष्य ''। '

    सामान्य उपयोग में, कार्य की प्रति एक ही संशोधन पर, किसी स्थानीय संशोधन और बिना स्विच किए हुए उपप्रकारों के साथ अद्यतित होनी चाहिए।

उदाहरण:

svn merge -r 2983:289 path/to/file

यह स्थानीय प्रति [2983] (जो कि ऊपर बोली के अनुसार, सर्वर से - आपकी जिम्मेदारी के साथ सिंक में होना चाहिए) सर्वर से संशोधन 289 के साथ बदलनी होगी। परिवर्तन स्थानीय रूप से होता है, जिसका अर्थ है कि यदि आपके पास एक क्लीन चेकआउट है, तो उन्हें करने से पहले परिवर्तनों का निरीक्षण किया जा सकता है।


-1

निम्नलिखित ने मेरे लिए काम किया है।

मेरे पास बहुत सारे स्थानीय परिवर्तन थे और स्थानीय प्रतिलिपि में उन लोगों को छोड़ने और एसवीएन में अंतिम स्थिर संस्करण की जांच करने की आवश्यकता थी।

  1. नजरअंदाज की गई फाइलों सहित सभी फाइलों की स्थिति की जांच करें।

  2. नई जोड़ी गई और उपेक्षित फ़ाइलों को प्राप्त करने के लिए सभी लाइनों को ग्रीप करें।

  3. उन लोगों के साथ बदलें //

  4. और आरएम -आरएफ सभी लाइनों।

    svn स्थिति - नहीं-अनदेखा | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.