2010-01-21 42 views
87

Tôi mới đến Mercurial. Chỉ không thể tìm thấy đúng lệnh. Đã cố gắng cập nhật/thanh toán mà không có may mắn. Tôi đang sử dụng kho lưu trữ cục bộ. Cảm ơnCách lấy phiên bản cụ thể của tệp trong Mercurial?

+0

Ý anh là gì bởi 'phiên bản đặc biệt'? Bạn có phiên bản cụ thể không? Bạn đang cố gắng thực hiện chính xác bằng cách nhận một phiên bản đặc biệt? – Omnifarious

+0

@Omnifarious: Tôi đã cam kết một phiên bản ổn định của một tệp. Sau đó tiếp tục làm việc trên tập tin nhưng sớm nhận ra tôi cần phiên bản "tốt" cuối cùng. Điều này có thể được thực hiện bằng cách cập nhật trong svn nhưng khi tôi thử cập nhật hg, nó nói "0 tập tin ..." – Codism

Trả lời

125

Tôi nghĩ bạn muốn hg revert -r<rev> <file> (điều này sẽ thay đổi tệp đó giống như ở bản sửa đổi đã cho).

+0

Đúng, đó là chính xác những gì anh ta muốn. :-) – Omnifarious

+9

hoặc chỉ hg hoàn nguyên nếu bạn muốn hủy thay đổi hiện tại của mình và nhận được thay đổi mới nhất – BlackTigerX

+0

@BlackTigerX Nếu không sửa đổi, tệp không được sửa đổi sẽ không được hoàn nguyên về bất kỳ thứ gì, ngay cả khi nó không phải là phiên bản cam kết gần đây. Đôi khi tôi sử dụng tệp này cho các tệp 'cherry pick' giữa các bản sửa đổi, vì vậy điều này rất quan trọng. – user2864740

73

Như djc đã nói revert thay đổi tệp tại chỗ để khớp với bản sửa đổi trước. Nếu bạn muốn nó không đúng chỗ bạn có thể sử dụng hg cat -r revisionid filename (thay thế bản sửa đổi và tên tệp của khóa học) sẽ xuất ra tệp để stdout, thích hợp cho việc chuyển hướng bất kỳ nơi nào bạn muốn.

+3

purrrfect, chính xác những gì tôi mong muốn. – yota

+0

Tuyệt vời, nó luôn luôn tốt đẹp để nghe một cái gì đó như thế. –

23

hg revert thực sự giải quyết được sự cố này. Nhưng tôi nghĩ rằng bạn đang bối rối về một phạm vi rộng hơn của sự vật hơn là câu trả lời cho câu hỏi của bạn và muốn cố gắng trả lời đầy đủ hơn.

hg update là toàn bộ lệnh lưu trữ và sẽ không hoạt động trên các tệp riêng lẻ. Nó không giống như subversion svn update theo cách này. Nếu bạn làm hg --help update, bạn có thể thấy rằng đây là trường hợp vì lệnh này không có đối số tệp. Nó có thể được sử dụng để di chuyển toàn bộ kho lưu trữ của bạn đến một ảnh chụp cụ thể, nhưng không thể được sử dụng để làm điều đó chỉ với một tệp.

Nếu bạn nhập hg --help bạn sẽ thấy danh sách các lệnh. Đó là một danh sách khá lớn và hơi nặng nề, nhưng nếu bạn đọc qua nó, bạn sẽ thấy dòng này:

revert  restore individual files or directories to an earlier state 

Bây giờ, nếu bạn chỉ muốn trạng thái cuối cùng cho mục đích so sánh, có một lệnh bạn có thể quan tâm và đó là hg cat. Điều đó sẽ cho phép bạn in ra các nội dung của một tập tin tại bất kỳ sửa đổi cụ thể. Sau đó bạn có thể chuyển hướng đầu ra của nó vào một số tệp khác. Sau đó, bạn có thể có phiên bản tốt được biết trước đó của tệp của bạn và phiên bản cũ để so sánh song song.

Lý do tại sao Mercurial có lệnh update riêng biệt là có thể thực hiện điều gì đó trong Mercurial không thể thực hiện được trong Subversion. Bạn có thể update thành phiên bản cũ hơn, thực hiện thay đổi, sau đó cam kết. Điều này sẽ tạo ra một chi nhánh. Lệnh update có tác dụng cũng thay đổi bản sửa đổi gốc của thư mục làm việc hiện tại cũng như thay đổi nội dung của tất cả các tệp trong thư mục đó thành các phiên bản của phiên bản gốc đó.

Điều đó có nghĩa là revert thay đổi nội dung của tệp (hoặc thậm chí toàn bộ kho lưu trữ nếu bạn cung cấp lệnh cho đối số đúng) nhưng để lại bản sửa đổi gốc của bản sao làm việc hiện tại.

Bạn có thể tìm hiểu bản sửa đổi gốc (hoặc sửa đổi trong trường hợp hợp nhất) bản sao làm việc hiện tại bằng cách sử dụng lệnh hg parents.

Trong bản sửa đổi Subversion là một tiến trình tuyến tính nghiêm ngặt. Mercurial tạo ra các chi nhánh ở một chiếc mũ, và chúng gần như dễ dàng hợp nhất. Bản sửa đổi tạo thành một DAG, không phải là một sự tiến triển nghiêm ngặt tuyến tính.

9

Để trích xuất một phiên bản cụ thể của một tập tin cụ thể mà bạn có thể làm điều này trên Windows:

hg cat "<FileToBeExtractedPath>" -r 9 > "<ExtractionPath>" 

Ở đây, 9 là số phiên bản.

Hoặc thậm chí tốt hơn:

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>" 
Các vấn đề liên quan