2012-07-04 30 views
7

Sử dụng git, tôi có thể vứt bỏ một sai lầm hay tình cờ cam kết sử dụng một lệnh nhưLăn trở lại một phiên bản cũ trong Mercurial (như thiết lập lại git)

git reset --soft HEAD^ 

mà resets các chi nhánh hiện tại (ví dụ như master) để phụ huynh của bản sửa đổi hiện tại cam kết HEAD^ mà không cần chạm vào cây đang hoạt động - bạn có thể thay thế --soft bằng --hard nếu bạn muốn xóa bỏ cây làm việc.

Bên cạnh đó, nếu tôi muốn thoát khỏi nhiều hơn một cam kết, tôi có thể sử dụng một lệnh như

git reset --hard 53b94d0 

mà mang lại cho tôi trở lại một cách chính xác để thực hiện 53b94d0 như thể tôi chưa bao giờ cam kết bất cứ điều gì sau đó.

Tương đương Mercurial (hg) là gì?

Trả lời

19

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?).

+0

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

Các vấn đề liên quan