Mặc dù Mercurial không cung cấp giải pháp thay thế dễ dàng và tránh xa ý tưởng về lịch sử có thể thay đổi, có một số cách để đạt được điều gì đó gần gũi. Trong bài đăng này, tôi sẽ phác thảo một vài trong số chúng.
hg rollback
Nếu bạn đặc biệt muốn undo bạn cam kết cuối cùng, bạn có thể sử dụng:
hg rollback
mà sẽ lùi lại các cam kết (mà không chạm vào cây làm việc - bạn sẽ có thể để theo dõi nó với một số hg revert --all
hoặc hg update -C
nếu bạn muốn đặt lại toàn bộ thư mục làm việc).
hg bản sao -r
Giả sử bạn muốn thiết lập lại kho lưu trữ của bạn được gọi giraffe
để sửa đổi 77182fb7451f. Nếu bạn cd
vào thư mục cha và chạy:
hg clone -r 77182fb7451f giraffe new-giraffe
cp giraffe/.hg/hgrc new-giraffe/.hg/
sau đó bạn sẽ kết thúc với mới hươu cao cổ, một kho lưu trữ ở phiên bản 77182fb7451f. (Các cp
là cần thiết để đảm bảo rằng mới hươu cao cổ paths
(như "điều khiển từ xa" git của) một cách chính xác trỏ đến repo gốc thay vì vào thư mục giraffe
vì nó sẽ theo mặc định.)
Đây là nhanh hơn so với sao chép lại từ internet vì nó chỉ sao chép các tệp cục bộ trên đĩa của bạn (và trên nhiều hệ thống, liên kết chúng với nhau để tiết kiệm nhiều thời gian và không gian hơn), nhưng vẫn có thể tốn thời gian nếu kho lưu trữ của bạn lớn.
dải hg
Nếu bạn muốn làm những điều phức tạp hơn với thay đổi lịch sử phạm (trong đó có phần cau mày ra trong thế giới hg, bằng cách này), lần đầu tiên cho phép các Mercurial Queues extension bằng cách thêm các dòng sau vào tệp .hgrc
(không cần chỉ định đường dẫn sau dấu bằng):
[extensions]
mq =
này cung cấp cho bạn (trong số những thứ hữu ích khác) lệnh hg strip
để loại bỏ hoàn toàn một changeset và tất cả các hậu duệ của nó từ một kho lưu trữ.Do đó, bạn có thể sử dụng lệnh như:
hg strip 1cc72d33ea76
nếu 1cc72d33ea76 là bộ thay đổi "xấu" đầu tiên trong kho lưu trữ mà bạn muốn xóa. Thật không may, thường rất khó để loại bỏ chính xác các thay đổi phù hợp sử dụng phương pháp này và nó quá dễ dàng để kết thúc với nhiều đầu (bạn có thể xem bằng cách sử dụng hg heads
), yêu cầu ứng dụng lặp đi lặp lại tẻ nhạt hg strip
trước khi bạn có thể đến nơi bạn muốn không có thêm đầu.
hg dải sử dụng revsets
Sử dụng hg revsets bạn có thể xóa tất cả các tổ tiên của .
(phiên bản hiện hành) mà là không tổ tiên của phiên bản bạn muốn trở lại, sử dụng một lệnh như:
hg strip "ancestors(.) and not ancestors(77182fb7451f)"
Hãy chắc chắn để chạy đầu tiên:
hg log -r "ancestors(.) and not ancestors(77182fb7451f)"
mà sẽ cho bạn thấy al l changesets rằng hg strip
sẽ loại bỏ, vì vậy bạn có thể chắc chắn rằng bạn không thể khắc phục không thể khắc phục lịch sử cam kết của bạn (bởi vì bạn có sao lưu ... phải không?).
Vì vậy, trong hg, cuộn lùi/dải tương đương đặt lại nhiều hơn là chỉ thay đổi những gì cam kết một thẻ nhánh trỏ đến, có một số thay đổi thực sự đối với cơ sở dữ liệu liên quan? – jthill