2011-01-21 27 views
109

Làm cách nào để hoàn tác thay đổi vô tình cuối cùng của tôi (không được đẩy) trong Mercurial?Mercurial undo cam kết cuối cùng

Nếu có thể, cách làm như vậy với TortoiseHg sẽ được ưu tiên hơn.

Cập nhật

Trong trường hợp cụ thể của tôi, tôi cam kết một changeset (không đẩy). Sau đó, tôi kéo và cập nhật từ máy chủ. Với những cập nhật mới này, tôi quyết định rằng cam kết cuối cùng của tôi đã lỗi thời và tôi không muốn đồng bộ hóa nó. Vì vậy, có vẻ như, rằng hg rollback là không chính xác những gì tôi đang tìm kiếm, bởi vì nó sẽ rollback kéo thay vì cam kết của tôi.

+1

Điều gì về việc tạo ra hai 'hg rollback', và sau đó kéo lại? – VonC

+1

Việc khôi phục đầu tiên không hoàn tác thao tác kéo, cuộn thứ hai cho tôi biết "không có sẵn thông tin rollback". –

+1

Tôi đã gặp phải tình huống tương tự, và theo như tôi biết rằng một khi bạn đã thực hiện bất kỳ hoạt động nào khác - bạn không thể quay lại hoặc xóa nó khỏi lịch sử. Bạn sẽ cần phải sao chép lại kho lưu trữ hg. –

Trả lời

68

Một cách sẽ được hg rollback (bị phản đối như của Hg2.7, August 2013)

Vui lòng sử dụng hg commit --amend thay vì rollback để sửa chữa sai lầm trong cam kết cuối cùng.

Cuộn lại giao dịch cuối cùng trong kho lưu trữ.

Khi committing hoặc merging, Mercurial thêm mục nhập changeset cuối cùng.
Mercurial lưu nhật ký giao dịch tên của từng tệp được chạm và độ dài của nó trước giao dịch. Ngày hủy bỏ, nó cắt ngắn từng tập tin với độ dài trước đó của nó. Sự đơn giản này là một lợi ích của việc thêm revlogs chỉ thêm vào. Nhật ký giao dịch cũng cho phép hoạt động hoàn tác.

Xem TortoiseHg Recovery section:

alt text

This thread cũng chi tiết sự khác biệt giữa hg rollbackhg strip:
(được viết bởi Martin Geisler người cũng góp phần vào SO)

  • 'hg rollback' sẽ xóa giao dịch cuối cùng. Giao dịch là một khái niệm thường được tìm thấy trong cơ sở dữ liệu. Trong Mercurial chúng ta bắt đầu một giao dịch khi một số hoạt động được chạy, chẳng hạn như cam kết, đẩy, kéo ...
    Khi hoạt động kết thúc thành công, giao dịch được đánh dấu là hoàn tất. Nếu xảy ra lỗi, giao dịch sẽ được "cuộn lại" và kho lưu trữ còn lại trong cùng trạng thái như trước.
    Bạn có thể kích hoạt cuộn ngược theo cách thủ công bằng 'hg rollback'. Thao tác này sẽ hoàn tác lệnh giao dịch cuối cùng. Nếu lệnh kéo đưa 10 changesets mới vào kho lưu trữ trên các nhánh khác nhau, thì 'hg rollback' sẽ xóa tất cả. Xin lưu ý: có không sao lưu khi bạn khôi phục giao dịch!

  • 'hg strip' sẽ xóa một changeset và tất cả con cháu của nó. Các thay đổi được lưu dưới dạng nhóm mà bạn có thể áp dụng lại nếu bạn yêu cầu chúng trở lại.

ForeverWintr gợi ý trong các ý kiến ​​(vào năm 2016, 5 năm sau)

Bạn có thể 'un-cam kết' file theo hg đầu tiên quên họ, ví dụ như: hg forget filea; hg commit --amend, nhưng điều đó dường unintuitive .
hg strip --keep có lẽ là giải pháp tốt hơn cho hg hiện đại.

+0

Khi tôi hiểu rằng việc khôi phục sẽ loại bỏ giao dịch cuối cùng. Trong trường hợp của tôi, tôi đã thực hiện một cam kết, sau đó tôi lấy từ máy chủ. Vì vậy, có nghĩa là tôi sẽ rollback kéo thay vì cam kết? –

+1

@ Martin Buberl: Theo http://www.selenic.com/mercurial/hg.1.html#rollback, kéo được coi là một giao dịch. Vì vậy, nếu bạn kéo, thực thi 'hg rollback' sẽ hoàn tác thao tác kéo thay vì cam kết. –

+0

Cảm ơn, tôi sẽ chỉnh sửa câu hỏi của tôi một chút để chỉ ra rằng tốt hơn ou. –

5

hg rollback là những gì bạn muốn.

Trong TortoiseHg, hg rollback được thực hiện trong hộp thoại cam kết. Mở hộp thoại cam kết và chọn "Hoàn tác".

alt text

+1

Tôi đã thực hiện một cam kết, sau đó kéo và cập nhật/đồng bộ hóa. Với những thay đổi mới này, tôi đã quyết định cam kết cuối cùng của tôi là ám ảnh và muốn hoàn tác nó. Nút Hoàn tác trong TortoiseHg bị tắt trong trường hợp của tôi. –

+0

Rollback hiện không được chấp nhận. – UpTheCreek

+0

Trong phiên bản Tortoise HG hiện tại, bạn có thể truy cập tùy chọn Rollback/Undo từ mục trình đơn Kho lưu trữ. – daveywc

19

Vì bạn không thể rollback bạn nên kết hợp có hành vào đầu mới, bạn nhận được khi bạn kéo. Nếu bạn không muốn bất kỳ công việc bạn đã làm trong nó, bạn có thể dễ dàng làm điều đó bằng cách sử dụng this tip.

Vì vậy, nếu bạn đã kéo và cập nhật để người đứng đầu của họ bạn có thể làm điều này:

hg --config ui.merge=internal:local merge 

giữ tất cả những thay đổi trong phiên bản hiện kiểm tra ra, và không ai trong số những thay đổi trong tương lai không-kiểm tra -out revision (bản bạn đã viết mà bạn không muốn nữa).

Đây là một cách tuyệt vời để làm điều đó vì nó giữ cho lịch sử của bạn chính xác và đầy đủ. Nếu 2 năm kể từ bây giờ ai đó tìm thấy một lỗi trong những gì bạn kéo xuống bạn có thể nhìn vào của bạn (không sử dụng nhưng lưu) thực hiện cùng một điều và đi, "oh, tôi đã làm đúng". :)

42

hg strip sẽ loại bỏ hoàn toàn bản sửa đổi (và bất kỳ hậu duệ nào) khỏi kho lưu trữ.

Để sử dụng dải bạn sẽ cần phải cài đặt MqExtension bằng cách thêm các dòng sau vào .hgrc của bạn (hoặc mercurial.ini):

[extensions] 
mq = 

Trong TortoiseHg lệnh dải có sẵn trong bàn làm việc. Nhấp chuột phải vào bản sửa đổi và chọn 'Sửa đổi lịch sử' -> 'Dải'.

Kể từ khi strip thay đổi lịch sử của kho lưu trữ, bạn chỉ nên sử dụng nó trên các bản sửa đổi chưa được chia sẻ với bất kỳ ai. Nếu bạn đang sử dụng mercurial 2.1+, bạn có thể sử dụng phases để theo dõi thông tin này. Nếu một cam kết vẫn còn trong giai đoạn dự thảo, nó chưa được chia sẻ với các kho lưu trữ khác để bạn có thể xóa nó một cách an toàn. (Cám ơn Zasurus vì đã chỉ ra điều này).

+2

NẾU bản sửa đổi được đề cập vẫn còn trong dự thảo cụm từ (hoặc bạn có quyền truy cập TẤT CẢ của repo rằng nó đã được đẩy/kéo vào và áp dụng các dải cho tất cả chúng) (đó là trường hợp trong mô tả này) thì điều này là sooo lựa chọn tốt nhất và sạch nhất. – GazB

+4

Nếu bạn đã cài đặt TortoiseHg, có một giao diện đồ họa để kích hoạt mq trên toàn cầu. Trong phiên bản hiện tại: bật "file-> settings-> global settings tab-> extensions-> mq" hoặc truy cập tệp cài đặt thông qua nút "Chỉnh sửa tệp". – David

0

sau khi bạn đã kéo và cập nhật không gian làm việc của bạn lên và nhấp chuột phải vào bộ thay đổi bạn muốn loại bỏ và sau đó nhấp vào sửa đổi lịch sử -> dải, nó sẽ xóa bộ thay đổi và bạn sẽ trỏ đến mẹo mặc định .

0

Giải pháp thay thế của nó.

Nếu bạn không đẩy vào máy chủ, bạn sẽ sao chép vào thư mục mới khác để xóa (xóa tất cả các tệp) khỏi thư mục lưu trữ của bạn và sao chép mới.

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