Cách tốt hơn để trở lại bản sửa đổi SVN trước đó của một tệp?


167

Tôi đã vô tình cam kết quá nhiều tệp vào kho lưu trữ SVN và thay đổi một số điều tôi không có ý định. (Thở dài.) Để hoàn nguyên chúng về trạng thái trước đó, điều tốt nhất tôi có thể nghĩ ra là

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Trời ạ! Có cách nào tốt hơn không? Tại sao tôi không thể viết một cái gì đó như thế này:

svn revert -r 854 l3toks.dtx

Được rồi, tôi chỉ sử dụng v1.4.4, nhưng tôi đã lướt qua danh sách thay đổi cho nhánh 1.5 và tôi không thể thấy bất cứ điều gì liên quan trực tiếp đến điều này. Tôi có bỏ lỡ điều gì không?


Chỉnh sửa: Tôi đoán tôi đã không đủ rõ ràng. Tôi không nghĩ rằng tôi muốn đảo ngược hợp nhất, bởi vì sau đó tôi sẽ mất những thay đổi mà tôi đã muốn làm! Nói vậy fileAfileBcả hai đều sửa đổi nhưng tôi chỉ muốn cam kết fileA; vô tình gõ

svn commit -m "small change"

cam kết cả hai tập tin và bây giờ tôi muốn quay lại fileB. Hợp nhất ngược làm cho nhiệm vụ này không dễ dàng hơn (như tôi có thể nói) so với các bước tôi đã nêu ở trên.


Câu trả lời:


243
svn merge -r 854:853 l3toks.dtx

hoặc là

svn merge -c -854 l3toks.dtx

Hai lệnh tương đương nhau .


5
Cảm ơn vì điều này, tôi chỉ muốn nêu điều gì đó - giả sử, tôi đang ở phiên bản 855, tôi muốn hoàn nguyên một tệp để sửa đổi 854. Nếu tôi làm svn merge -c -854 my.file, và sau đó làm svn diff, nó dường như hiển thị một bản sửa đổi trước 854 (nghĩa là 853 ); Chỉ khi tôi làm svm merge -c 854 myfile(không có -), có vẻ như myfile được hoàn nguyên về rev 854. Cảm ơn một lần nữa, chúc mừng!
sdaau

11
Có một lý do tại sao tùy chọn đầu tiên ở trên hoạt động như một cơ duyên đối với tôi trong khi tùy chọn thứ hai không hoạt động TẠI TẤT CẢ?
skybondsor

7
Đừng quên cam kết sau khi hợp nhất ngược lại, mặc dù. Tôi thường quên :)
Vineeth Pradhan

11
Thực sự nên trừ 1 điều này vì không nói rõ sự khác biệt giữa hai lệnh này là gì. Câu trả lời kém
Angry Dan

4
@sprog - nếu có sự khác biệt tôi đánh giá cao việc biết
orip

34

Kiểm tra phần " hoàn tác thay đổi " của sách svn


5
Liên kết đến các tài nguyên bên ngoài được khuyến khích, nhưng vui lòng thêm ngữ cảnh xung quanh liên kết để người dùng đồng nghiệp của bạn sẽ có một số ý tưởng về nó là gì và tại sao nó ở đó. Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang đích không thể truy cập được hoặc ngoại tuyến vĩnh viễn.
dùng2084795

32

xin lỗi vì đã sử dụng hết dung lượng chỉ để nhắc lại câu trả lời đã được đưa ra trước đó - nhưng đây là điều tôi luôn gặp rắc rối.

Giả sử tôi đã cập nhật các tệp cục bộ lên bản sửa đổi mới nhất là 854. Sau đó, tôi muốn nhận bản sửa đổi cũ hơn - phiên bản của tệp từ một vài bản sửa đổi trước đó, giả sử bản sửa đổi 851.

Sao chép sẽ hoạt động:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. tuy nhiên, tôi không thể bận tâm grepping cho URL repo :)

Cập nhật dường như có thể hoạt động:

svn up -r 851 ./l3toks.dtx

... tuy nhiên, nó cũng đánh dấu bản sao cục bộ là "vừa mới kiểm tra", hay đúng hơn là "giống như sửa đổi trực tuyến" (nghĩa là trong Rùa / RabbitVCS bạn có dấu kiểm OK màu xanh lá cây) - có nghĩa là bạn không thể làm svn ci -m "rolled back to r 851": đơn giản vì địa phương subversionthực thi sẽ không nhận thấy bất kỳ thay đổi cục bộ nào và sẽ không bị làm phiền khi tải lên bất cứ thứ gì lên kho lưu trữ trực tuyến.

Và, như đã trả lời, hợp nhất ngược hoạt động - nhưng trong trường hợp này, người ta không nên dựa vào cú pháp phím tắt; nhưng cụ thể là:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Tôi phải thừa nhận - Tôi sẽ không bao giờ hiểu câu "Hợp nhất ngược r854 đến r852 thành tệp " có nghĩa là " Chỉ cần nhận r851 tệp của bạn và ghi đè lên bất cứ điều gì bạn đã có trước đây - và nó được đánh dấu là khác với sửa đổi trực tuyến mới nhất, vì vậy bạn có thể kiểm tra lại trực tuyến dưới dạng sửa đổi 'rollback' mới ", nhưng tôi đoán (và hy vọng :)) đó là những gì nó làm :)

Sau này, người ta có thể sử dụng svn diffđể đảm bảo nhanh chóng nếu chúng tôi nhận được bản sửa đổi phù hợp tại địa phương; và đồng thời, tệp sẽ được đánh dấu bằng dấu chấm than màu đỏ trong Rùa / RabbitVCS (nghĩa là khác với phiên bản cam kết mới nhất) và vì vậy svn ci -m "rolled back to r 851"có thể chạy lần này.

Ngoài ra, lưu ý rằng, cuối cùng, bạn sẽ thay đổi quyết định sau khi hợp nhất ngược lại ( tức là dù sao bạn cũng muốn tiếp tục sửa đổi bản sửa đổi mới nhất, ở đây 854 - sau khi bạn quay trở lại 851 cục bộ, nhưng vẫn chưa cam kết ), bạn không nên sử dụng svn up, vì đơn giản là nó sẽ nói rằng "Đã sửa đổi 854 "; sử dụng thay thế svn revert --recursive .hoặc tương tự ...

Chúc mừng!

Tham khảo: Cách khôi phục các thay đổi bằng Subversion - Jacob Wright - Flex, AIR, PHP, v.v.

EDIT: ... và rõ ràng, hiệu quả chính xác như svn merge -r HEAD:851 l3toks.dtx, có thể đạt được với:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

2
Bạn LUÔN LUÔN thích xuất svn, vì nó thực hiện chính xác những gì bạn muốn - kiểm tra một Tệp trong một sửa đổi nhất định, trong khi đó, sáp nhập ngược cũng sẽ thử và hợp nhất các thay đổi cục bộ của bạn với phiên bản đã chỉ định, đó là một hoạt động phức tạp và điên rồ, đó là dễ bị lỗi nếu bạn không coi chừng!
Falco

1
Tôi đã có vấn đề với sáp nhập ngược. Thay vì tìm hiểu tại sao, tôi chỉ thử xuất khẩu và nó hoạt động hoàn hảo. Tôi rất muốn giới thiệu chỉ sử dụng xuất khẩu. Bạn có thể sử dụng --forceđể ghi đè lên các thư mục. Chỉ cần nhớ nó sẽ ghi đè lên bất kỳ thay đổi.
Nick

Giải thích rất tốt về những gì đang thực sự xảy ra! Tôi sử dụng AnkhSVN và TortoiseSVN thường xuyên và tôi không thấy nơi nào để sử dụng svn export- tôi có thiếu thứ gì đó không hay chỉ là không được triển khai trong các GUI này?
Conrad

@Conrad, Bạn sử dụng điều đó bằng cách nhấp vào "Xuất ..." trong AnkhSVN và "Xuất" trong TortoiseSVN từ menu ngữ cảnh kho lưu trữ (nhấp chuột phải)
nitinr708

10

Gần đây tôi đã phải quay lại một bản sửa đổi cụ thể để gỡ lỗi một bản dựng cũ hơn và nó hoạt động như ma thuật:

svn up -r 3340 (or what ever your desired revision number)

Tôi đã phải giải quyết tất cả các xung đột bằng tùy chọn "tc" vì tôi không quan tâm đến các thay đổi cục bộ (đã kiểm tra mọi thứ tôi quan tâm trước khi hoàn nguyên)

Để quay lại sửa đổi đầu cũng đơn giản:

svn up

5

Những gì bạn đang tìm kiếm được gọi là "hợp nhất ngược". Bạn nên tham khảo các tài liệu liên quan đến chức năng hợp nhất trong sách SVN (dưới dạng luaccoad, hay chính xác hơn là người bình luận đầu tiên về bài đăng đó, chỉ ra). Nếu bạn đang sử dụng Rùa, bạn cũng có thể chỉ cần vào chế độ xem nhật ký và nhấp chuột phải và chọn "hoàn nguyên các thay đổi từ bản sửa đổi này" trên trang mà bạn đã mắc lỗi.


4

Hợp nhất ngược là chính xác những gì bạn muốn (xem câu trả lời của luaccoad). Chỉ cần áp dụng hợp nhất cho tệp được cam kết sai thay vì toàn bộ thư mục.


4

Nếu bạn chỉ muốn hoàn tác đăng ký cuối cùng, bạn có thể sử dụng cách sau

svn merge -r head:prev l3toks.dtx

Bằng cách đó, bạn không phải tìm kiếm các số phiên bản hiện tại và trước đó.


4

hợp nhất svn sẽ hợp nhất sửa đổi, không hoàn nguyên chúng. tức là nếu bạn có một số bổ sung trong phiên bản CHÍNH của mình thì hãy kết hợp nó với phiên bản trước, sau đó thay đổi sẽ tiếp tục.

Tôi sử dụng svn cat sau đó chuyển hướng nó vào tập tin:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Sau đó, bạn có nội dung 851 trong tệp đó và có thể kiểm tra lại.


3

Nếu bạn sử dụng IDE Eclipse với plugin SVN, bạn có thể làm như sau:

  1. Nhấp chuột phải vào các tệp mà bạn muốn hoàn nguyên (hoặc thư mục chứa trong đó, nếu bạn xóa nhầm và bạn muốn thêm lại chúng)
  2. Chọn " Đội> Chuyển đổi "
  3. Chọn nút radion "Sửa đổi" và nhập số sửa đổi bạn muốn hoàn nguyên. Nhấn vào OK
  4. Chuyển đến phối cảnh Đồng bộ hóa
  5. Chọn tất cả các tệp bạn muốn hoàn nguyên
  6. Nhấp chuột phải vào lựa chọn và thực hiện " Ghi đè và Cam kết ... "

Điều này sẽ hoàn nguyên các tập tin để sửa đổi mà bạn muốn. Chỉ cần lưu ý rằng SVN sẽ xem các thay đổi là một cam kết mới. Đó là, thay đổi có một số sửa đổi mới và không có liên kết giữa sửa đổi cũ và mới. Bạn nên chỉ định trong các nhận xét cam kết rằng bạn đang hoàn nguyên các tệp đó thành một bản sửa đổi cụ thể.

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.