Mercurial hoàn tác cam kết cuối cùng


125

Làm cách nào tôi có thể hoàn tác thay đổi vô tình được cam kết (không bị đẩy) trong Mercurial?

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

Cập nhật

Trong trường hợp cụ thể của tôi, tôi đã cam kết một thay đổi (không được đẩ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, 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ư, đó hg rollbackkhông chính xác là những gì tôi đang tìm kiếm, bởi vì nó sẽ phục hồi sức kéo thay vì cam kết của tôi.


1
Thế còn làm hai hg rollback, rồi lại kéo?
VonC

1
Rollback đầu tiên hoàn tác kéo, rollback thứ hai cho tôi biết "không có thông tin rollback có sẵn".
Martin Buberl

1
Tôi đã gặp 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ỳ thao tác 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 sao chép lại kho hg.

3
strip --keep: stackoverflow.com/questions/29413851/ trực tiếp giải quyết nhiệm vụ, cũng như MQ qimport. Ngoài ra, có thể tốt hơn chỉ đơn giản là rebasetrong kịch bản nếu những thay đổi cục bộ cũng được giữ và không có xung đột. (Sử dụng hợp nhất để giữ một số thay đổi kết hợp từ cả hai nhánh khi đó là mục tiêu cuối cùng của biểu đồ mong muốn, đặc biệt là trong trường hợp không nhanh khác với hợp nhất) tùy thuộc vào trạng thái cuối cùng mong muốn.
dùng2864740

2
Như @ user2864740 nói, hg strip --keeplà lệnh sử dụng, nhưng bạn cần cung cấp bản sửa đổi, ví dụ : hg strip --keep -r .. Câu trả lời này giải thích tốt stackoverflow.com/a/19064016/1286571
ForeverWintr

Câu trả lời:


77

Một cách sẽ là hg rollback (không dùng nữa kể từ Hg2.7, tháng 8 năm 2013)

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

Quay trở lại giao dịch cuối cùng trong một kho lưu trữ.

Khi cam kết hoặc sáp nhập , Mercurial thêm changeset mục cuối cùng.
Mercurial giữ một bản ghi giao dịch tên của từng tệp được chạm và độ dài của nó trước khi giao dịch. Khi hủy bỏ, nó cắt ngắn từng tệp theo chiều dài trước đó. Sự đơn giản này là một lợi ích của việc làm cho các bản ghi lại chỉ phụ lục. Tạp chí giao dịch cũng cho phép hoàn tác một hoạt động.

Xem phần RecoveryHg Recovery :

văn bản thay thế

Chủ đề này cũng chi tiết về sự khác biệt giữa hg rollbackhg strip:
(được viết bởi Martin Geisler , người cũng đóng góp trên 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 tôi bắt đầu giao dịch khi một số hoạt động nhất định đượ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 "khôi phục" và kho lưu trữ được giữ nguyên trạng thái như trước.
    Bạn có thể tự kích hoạt rollback bằng 'hg rollback'. Điều này sẽ hoàn tác lệnh giao dịch cuối cùng. Nếu một lệnh pull mang 10 thay đổi 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ả chúng. Xin lưu ý: không có bản sao lưu khi bạn hoàn trả giao dịch!

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

ForeverWintr gợi ý trong các bình luận (năm 2016, 5 năm sau)

Bạn có thể 'hủy cam kết' bằng cách hg đầu tiên quên chúng, ví dụ : hg forget filea; hg commit --amend, nhưng điều đó có vẻ không trực quan.
hg strip --keepcó lẽ là một giải pháp tốt hơn cho hg hiện đại.


Khi tôi hiểu điều đó, rollback 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 rút từ máy chủ. Vì vậy, điều đó có nghĩa là tôi sẽ quay trở lại kéo thay vì cam kết?
Martin Buberl

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

2
Tôi không chắc làm thế nào hg commit --amendđể hoạt động, nhưng đối với tôi, nó đã cho tôi một trình soạn thảo để sửa đổi thông điệp cam kết và không có phương pháp nào để thay đổi tập tin nào được đưa vào. Tôi đã thoát khỏi trình chỉnh sửa mà không lưu và thấy rằng cam kết nhầm của tôi đã được thay đổi để bao gồm TẤT CẢ các tệp đã thay đổi!
Tim Tonomall

2
Tôi không rõ làm thế nào để hoàn thành một câu trả lời cho câu hỏi bằng cách sử dụng hg commit --amend. Bạn có thể 'hủy cam kết' bằng cách trước tiên hg forgetcho chúng, ví dụ : hg forget filea; hg commit --amend, nhưng điều đó có vẻ không trực quan. dải hg --keep có lẽ là một giải pháp tốt hơn cho hg hiện đại.
ForeverWintr

1
@JasonS book.mercurial-scm.org/read/ Từ là một cuốn sách hay, mặc dù trong trường hợp của bạn, bạn cũng có thể xem xét thiết lập lại hg: stackoverflow.com/a/31302998/6309
VonC

46

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

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

[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'.

stripthay đổ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 2.1+, bạn có thể sử dụng các giai đoạn để theo dõi thông tin này. Nếu một cam kết vẫn đang trong giai đoạn dự thảo thì nó đã không được chia sẻ với các kho lưu trữ khác để bạn có thể loại bỏ nó một cách an toàn. (Cảm ơn Zasurus đã chỉ ra điều này).


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

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

19

Vì bạn không thể quay lại, bạn nên hợp nhất cam kết đó vào đầu mới mà bạn có khi bạn kéo. Nếu bạn không muốn bất kỳ công việc nào bạn đã làm trong đó, bạn có thể dễ dàng thực hiện điều đó bằng mẹo này .

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

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

giữ tất cả các thay đổi trong bản sửa đổi hiện đang được kiểm tra và không có thay đổi nào trong bản sửa đổi không được kiểm tra (bản thay đổi mà bạn đã viết mà bạn không còn muốn nữa).

Đây là một cách tuyệt vời để làm điều đó bởi 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ể xem xét việc thực hiện (không sử dụng nhưng đã lưu) của bạn về cùng một điều và đi, "oh, tôi đã làm đúng". :)


5

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

Trong TortoiseHg, việc hg rollbacknày đượ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".

văn bản thay thế


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 mình là vô hình và muốn hoàn tác nó. Nút Hoàn tác trong TortoiseHg bị vô hiệu hóa trong trường hợp của tôi.
Martin Buberl

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

Trong phiên bản hiện tại của Rùa HG, bạn có thể vào tùy chọn Phục hồi / Hoàn tác từ mục menu Kho lưu trữ.
daveywc

@UpTheCux trích dẫn cần thiết.
Danman

@DanMan - kiểm tra liên kết anh ấy cung cấp.
UpTheCux

3

Trong phiên bản hiện tại của TortoiseHg Workbench 4.4.1 (07.2018), bạn có thể sử dụng Repository- Rollback/undo...:
nhập mô tả hình ảnh ở đây


1

Cách giải quyết của nó.

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


0

sau khi bạn đã kéo và cập nhật không gian làm việc của mình, hãy nhấp chuột phải vào nút 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.

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.