Làm cách nào để tôi quay lại phiên bản cũ hơn của mã của chúng tôi trong Subversion?


486

Tôi đang làm việc trên một dự án với một người bạn và tôi muốn quay lại phiên bản cũ hơn của mã của chúng tôi và đặt nó là hiện tại. Tôi phải làm nó như thế nào?

Tôi đang sử dụng "anksvn" trên vs08.

Tôi có phiên bản mà tôi muốn trên PC của mình, nhưng cam kết không thành công; Thông báo mà tôi nhận được là "cam kết không thành công, tệp hoặc thư mục đã hết hạn."

Tôi cũng có máy khách lật đổ trên PC của tôi.

Câu trả lời:


783

Về cơ bản bạn cần phải "ngược hợp nhất" - áp dụng một diff giữa phiên bản hiện tại và trước đến phiên bản hiện tại (do đó bạn kết thúc với một bản sao làm việc trông như phiên bản cũ) và sau đó cam kết một lần nữa. Vì vậy, ví dụ để chuyển từ phiên bản 150 (hiện tại) trở lại phiên bản 140:

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

Sách đỏ Subversion có một phần tốt về điều này .


3
nhưng hợp nhất không ghi đè các thay đổi của tôi và sửa đổi mới.
Chen Kinnrot

76
Nếu bạn đang sử dụng TortoiseSVN, bấm chuột phải vào tệp chọn Hợp nhất, sau đó Hợp nhất Phạm vi Sửa đổi. Trong hộp nhật ký gõ 140-150 và bấm vào Hộp kiểm đảo ngược. Sau đó, cam kết như bình thường. Điều này sẽ thực hiện các hoạt động tương tự như ví dụ của Jon.
DavGarcia

8
Với nhật thực và subclipse, bạn có thể nhấp chuột phải vào dự án của mình, Team / Show History, sau đó chọn sau đó sửa đổi mà bạn muốn "hoàn tác" và với một nhấp chuột phải khác chọn "Hoàn nguyên các thay đổi từ các Sửa đổi được chọn".
fego

36
Để hoàn nguyên từ sửa đổi đầu, bạn cũng có thể viết svn merge -r HEAD:140.
sschmeck

3
Các hướng dẫn TortoiseSVN của @ DavGarcia không phù hợp với tôi, ít nhất là không hoàn nguyên tất cả các tệp trong bản sửa đổi (sử dụng TortoiseSVN 1.8.8). Nhấp chuột phải vào thư mục, chọn TortoisSVN-> Hiển thị nhật ký. Chọn (các) bản sửa đổi mà bạn muốn hoàn nguyên, nhấp chuột phải vào câu "Hoàn nguyên các thay đổi từ bản sửa đổi này". Cam kết thay đổi.
mhenry1384

178

Bạn chỉ có thể cam kết những thay đổi mới ở phần đầu của lịch sử lật đổ.

Lý do bạn không thể làm bất cứ điều gì trực tiếp với bản sao tốt mà bạn có trên PC, là vì các .svnthư mục của nó biết rằng đó là mã từ quá khứ, vì vậy cần phải cập nhật trước khi có bất kỳ cam kết nào.

Tìm số sửa đổi tốt và hoàn nguyên

  1. Tìm số sửa đổi của bản sao cũ mà bạn muốn.

    Nhận bản sửa đổi hiện tại của bạn với:

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

    Hoặc để kiểm tra các phiên bản cũ hơn của dự án của bạn, hãy sử dụng:

    svn update -r <earlier_revision_number>

    cho đến khi bạn tìm thấy số sửa đổi đúng

  2. Lưu ý số sửa đổi tốt (giả sử 123ví dụ dưới đây).

  3. Cập nhật lên bản sửa đổi mới nhất:

    svn update
  4. Hoàn tác tất cả các thay đổi giữa phiên bản bạn muốn và phiên bản mới nhất:

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

    (giống như câu trả lời của Jon Skeet ở trên.)

Nếu bạn không thể tìm thấy số sửa đổi

Nếu bạn không thể tìm thấy bản sao cũ và bạn chỉ muốn cam kết các tệp hiện có trên PC của mình:

  1. Tạo một bản sao của phiên bản tốt của bạn (nhưng không có bất kỳ .svnthư mục nào ):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. Bây giờ hãy chắc chắn rằng bạn có phiên bản mới nhất:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. Sao chép phiên bản tốt của bạn trên đầu của bản sao làm việc.

    Lệnh này sẽ sao chép và cũng xóa bất kỳ tệp nào khỏi cây làm việc không có trong bản sao tốt của bạn, nhưng nó sẽ không ảnh hưởng đến các .svnthư mục hiện có .

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

    Nếu bạn không có rsync, bạn có thể sử dụng cp -anhưng bạn cũng sẽ cần xóa mọi tệp không mong muốn theo cách thủ công.

  4. Bạn sẽ có thể cam kết những gì bạn có bây giờ.

    cd project
    svn commit "Reverted to good copy"

2
svn không giải thích nó như là một sửa đổi, tôi không thể cam kết điều đó.
Sandburg

hợp nhất svn -r TRƯỚC: 12345. là lệnh chính xác để hoàn nguyên, không thực hiện cập nhật -r. Bạn điên người.

Tôi đoán câu trả lời này đã được đánh giá cao bởi những người không thể tìm thấy số sửa đổi của họ, hoặc những người đánh giá cao lời giải thích hàng đầu. Tôi đã cập nhật câu trả lời ngay bây giờ để bao gồm cả hai phương pháp.
joeytwiddle

36

Chỉ cần sử dụng dòng này

cập nhật svn -r yourOldRevesion

Bạn có thể biết bản sửa đổi hiện tại của mình bằng cách sử dụng:

thông tin svn


15
Điều này không giải quyết được vấn đề. Thay vào đó, điều này tạo ra trạng thái mà người hỏi đang ở thời điểm đặt câu hỏi của họ.
Ingo Schalk-Schupp

1
Nếu bạn không may làm theo lời khuyên này, hãy chạy: "svn giải quyết - chấp nhận làm việc -R."

27

Cách tiêu chuẩn sử dụng hợp nhất để hoàn tác toàn bộ đăng ký hoạt động tuyệt vời, nếu đó là điều bạn muốn làm. Tuy nhiên, đôi khi, tất cả những gì bạn muốn làm là hoàn nguyên một tệp. Không có cách hợp pháp để làm điều đó, nhưng có một hack:

  1. Tìm phiên bản mà bạn muốn sử dụng nhật ký svn.
  2. Sử dụng tiểu ban xuất khẩu của svn:

    svn xuất http: // url-to-your-file @ 123 / tmp / tên tệp

(Trong đó 123 là số sửa đổi cho phiên bản tốt của tệp.) Sau đó, di chuyển hoặc sao chép tệp duy nhất đó để ghi đè lên tệp cũ. Kiểm tra các tập tin sửa đổi và bạn đã hoàn tất.


Sử dụng Rùa-svn Tôi có thể nhấp chuột phải vào một tệp duy nhất và hợp nhất nó. Có nên có một cách để làm điều này bằng cách sử dụng svnlà tốt?
lc.

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291

8

Một chút trường học cũ

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

sau đó là bình thường

svn diff
svn commit

5

Tôi nghĩ rằng điều này là phù hợp nhất:

Ví dụ, thực hiện việc hợp nhất ngược lại, nếu mã đã cam kết chứa bản sửa đổi từ rev 5612 thành 5616, chỉ cần hợp nhất nó ngược lại. Nó hoạt động cuối cùng của tôi.

Ví dụ:

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

Nó sẽ chứa một mã được hợp nhất trở lại bản sửa đổi trước đó, sau đó bạn có thể cam kết nó.


3

Đây là những gì tôi đã làm và làm việc cho tôi.

Tôi muốn hoàn tác các thay đổi trong nhiều lần xác nhận mà tôi đã thực hiện trong một số thời điểm nhất định và muốn đi đến điểm cam kết trước đó.

  1. Chuyển đến Đội -> Hiển thị Lịch sử.
  2. Nhấp chuột phải vào hoặc phạm vi sửa đổi mà bạn muốn bỏ qua.
  3. Chọn tùy chọn "Hoàn nguyên thay đổi".

Điều này sẽ chạy hợp nhất ngược, hoàn tác các thay đổi trong bản sao làm việc của bạn.

Chỉ cần xem lại mã và cam kết.


2

Nhấp chuột phải vào hệ thống phân cấp cao nhất bạn muốn hoàn nguyên >> ReverthoặcRevert to Revision


2

Hầu hết các câu trả lời trước đây đã được sử dụng hợp nhất ngược và đó thường là câu trả lời đúng. Tuy nhiên, có một tình huống (điều vừa xảy ra với tôi) không xảy ra.

Tôi đã vô tình thay đổi một tệp có kết thúc dòng Unix thành kết thúc dòng DOS khi thực hiện một thay đổi nhỏ và cam kết nó. Điều này có thể dễ dàng hoàn tác, bằng cách thay đổi các kết thúc dòng và cam kết lại, hoặc bằng cách hợp nhất ngược, nhưng nó có tác dụng làm cho svn blamedanh sách chỉnh sửa của tôi là nguồn của mỗi dòng của tệp. (Thật thú vị, TortoiseSVN trên Windows không bị ảnh hưởng bởi điều này; chỉ có dòng lệnhsvn blame .)

Nếu bạn muốn duy trì lịch sử như đã báo cáo svn blame, tôi nghĩ bạn cần làm như sau:

  • Xóa tập tin và cam kết.
  • Trong kho lưu trữ, sao chép bản sao tốt trước đó của tệp vào phần đầu và cam kết.
  • Khôi phục mọi chỉnh sửa mà bạn muốn giữ.

Việc xóa là hơi đáng sợ, nhưng hãy nhớ rằng bạn luôn có tệp được lưu trong kho lưu trữ, vì vậy việc khôi phục nó không phải là vấn đề lớn. Đây là một số mã để minh họa các bước. Giả sử đó xxxlà số sửa đổi của bản sao tốt cuối cùng.

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"

Lưu ý rằng đối với một bản sao trong kho lưu trữ, đích cần phải là một thư mục, không phải là tên tệp.


1

Nhấp chuột phải vào dự án> Thay thế bằng> Sửa đổi hoặc URL> Chọn sửa đổi cụ thể mà bạn muốn hoàn nguyên.

Bây giờ cam kết phiên bản mã cập nhật cục bộ vào kho lưu trữ. Điều này sẽ hoàn nguyên cơ sở mã để sửa đổi cụ thể.


1

Có rất nhiều câu trả lời nguy hiểm trên trang này. Lưu ý rằng kể từ SVN phiên bản 1.6, thực hiện cập nhật -r có thể gây ra xung đột cây, nhanh chóng leo thang thành cơn ác mộng có khả năng mất dữ liệu kafkeresque khi bạn đang tìm kiếm thông tin về xung đột cây.

Cách chính xác để trở lại phiên bản là:

svn merge -r HEAD:12345 .

Trong đó 12345 là số phiên bản. Đừng quên dấu chấm.


0

Đồng bộ hóa với phiên bản cũ hơn và cam kết nó. Cái này cần phải dùng mẹo.

Đây cũng là một lời giải thích về những thay đổi hoàn tác.


0

Câu trả lời của Jon Skeet gần như là giải pháp ngắn gọn, tuy nhiên nếu bạn giống như tôi, bạn có thể muốn một lời giải thích. Hướng dẫn Subversion gọi đây là

Hợp nhất Cherry-Pick

Từ những trang đàn ông.

  1. Biểu mẫu này được gọi là hợp nhất 'cherry-pick': '-r N: M' đề cập đến sự khác biệt trong lịch sử của nhánh nguồn giữa các phiên bản N và M.

    Một "phạm vi đảo ngược" có thể được sử dụng để hoàn tác các thay đổi. Ví dụ: khi nguồn và mục tiêu đề cập đến cùng một chi nhánh, bản sửa đổi được cam kết trước đó có thể là 'hoàn tác'. Trong phạm vi đảo ngược , N lớn hơn M trong '-r N: M' hoặc tùy chọn '-c' được sử dụng với số âm: '-c -M' tương đương với '-r M:'. Hoàn tác các thay đổi như thế này còn được gọi là thực hiện 'hợp nhất ngược'.


  • Nếu nguồn là một tệp, thì sự khác biệt được áp dụng cho tệp đó (hữu ích cho việc hợp nhất ngược lại các thay đổi trước đó). Mặt khác, nếu nguồn là một thư mục, thì mục tiêu mặc định là '.'.

    Trong sử dụng bình thường, bản sao làm việc phải được cập nhật, tại một lần sửa đổi, không có sửa đổi cục bộ và không có phụ đề chuyển đổi.

Thí dụ:

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

Điều này sẽ thay thế bản sao cục bộ [2983] (mà theo trích dẫn ở trên, phải đồng bộ với máy chủ - trách nhiệm của bạn) với bản sửa đổi 289 từ máy chủ. Thay đổi xảy ra cục bộ, có nghĩa là nếu bạn có kiểm tra sạch, thì những thay đổi có thể được kiểm tra trước khi thực hiện.


-1

Sau đây đã làm việc cho tôi.

Tôi đã có rất nhiều thay đổi cục bộ và cần phải loại bỏ những thay đổi trong bản sao cục bộ và kiểm tra phiên bản ổn định cuối cùng trong SVN.

  1. Kiểm tra trạng thái của tất cả các tệp, bao gồm các tệp bị bỏ qua.

  2. Grep tất cả các dòng để có được các tập tin mới được thêm và bỏ qua.

  3. Thay thế bằng //.

  4. và rm -rf tất cả các dòng.

    trạng thái svn - không bỏ qua | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.