2009-05-28 28 views
12

Bazaar có lệnh tuyệt vời uncommit, lệnh này chỉ đơn giản là hủy bỏ cam kết cuối cùng. Có bất kỳ tương đương trong Mercurial?"bzr uncommit" tương đương trong Mercurial?

Chỉnh sửa: lệnh bỏ lệnh của Bazaar không sửa đổi tệp - nó loại bỏ cam kết cuối cùng và dữ liệu liên quan (hữu ích, ví dụ, khi bạn nhận thấy quá muộn có lỗi đánh máy hoặc một tệp không thêm rằng nên có được).

Ví dụ:

$ bzr ci -m "Fixed a proooblem" <-- problem is misspelt 
$ bzr uncommit 
... 
$ bzr ci -m "Fixed a problem" <-- Exactly as if the first commit was correct. 

Trả lời

8

Có thể hg backout tip? Tôi khuyên bạn nên http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html để biết tất cả chi tiết về hg backout, cách nó khác với hg revert và nhiều chủ đề liên quan, nhưng nếu tôi từ chối những gì uncommit, điều đó có vẻ chính xác tương đương với hg backout tip.

Chỉnh sửa: trong nhận xét bạn hiện đã làm rõ bạn muốn "xóa lịch sử" - điều đó thật khó (trừ khi bạn đang rất nhanh chóng vẽ, có thể; -) ... trên cuốn sách đậu đỏ một lần nữa :

Vì Mercurial coi lịch sử là tích lũy — mọi thay đổi đều dựa trên mọi thay đổi trước đó — bạn thường không thể thay đổi thảm họa biến mất. Một ngoại lệ là khi bạn vừa mới thực hiện một thay đổi và nó không bị đẩy hoặc bị kéo vào một kho lưu trữ khác. Đó là khi bạn có thể sử dụng một cách an toàn các lệnh hg rollback

Vì vậy, nếu bạn chỉ muốn cố gắng "làm cho nó biến mất" (và bạn đủ may mắn là nó chưa được đẩy hoặc kéo các nơi khác) , sau đó hg rollback có thể là một cách tiếp cận tốt hơn!

+0

Đóng, nhưng không hoàn toàn. 'bzr revert' sẽ để lại tất cả các tệp tại chỗ, sẵn sàng để được cam kết lại. –

+0

bạn có nghĩa là "bzr uncommit" không? –

+0

err, vâng, đúng vậy ... Cảm ơn. –

0

Không "hg Hoàn nguyên" làm điều đó?

+0

Bạn là chính xác. hg revert là lệnh tương đương. –

+0

Nó sẽ hoàn nguyên các tập tin, nhưng tôi muốn toàn bộ cam kết (tin nhắn và tất cả) bị ảnh hưởng từ lịch sử. –

+0

Hoặc có thể không có điều gì đó 'hg giúp hoàn nguyên' không hiển thị cho tôi ...? –

0

Từ đọc nhận xét, có vẻ như bạn muốn một cách đơn giản là xóa bỏ bản ghi cam kết mà không hoàn tác các thay đổi đối với tệp. Trong Mercurial, không có cách tự động để làm điều này. hg revert gần như bạn sắp nhận được.

Tuy nhiên, bạn có thể thực hiện việc này bằng một vài bước thủ công. Khi bạn gọi hg revert, hành vi mặc định của nó là lấy các tệp trong changeset bạn đang hoàn nguyên và đổi tên chúng thành filename.ext.orig, trong đó ext là phần mở rộng ban đầu của tệp. Các phiên bản hoàn nguyên sau đó sẽ lấy tên tệp gốc. Vì vậy, những gì bạn có thể làm là chạy hg revert, xóa các tệp có tên gốc và xóa .orig khỏi tên tệp sao lưu. Sau đó, cam kết lại với thông điệp tường trình đã sửa của bạn. Chỉ cần không làm điều này với bất kỳ sửa đổi nào khác ngoài mẹo vì bạn có thể sẽ nhận được rất nhiều tệp đã thay đổi và quên những tệp nào thuộc về changeset.

Tôi cũng sẽ không khuyên bạn nên làm điều này nếu bạn đã đẩy các thay đổi của mình ra một kho lưu trữ từ xa. Chỉ làm điều này nếu mọi thứ vẫn chỉ là cục bộ.

Hãy cho tôi biết nếu bạn cần giải thích thêm. Tôi đã phải làm điều này nhân dịp, vì vậy tôi quen thuộc với quá trình này.

+0

Cảm ơn nhận xét, nhưng tôi nghĩ 'hg rollback' là những gì tôi đang tìm kiếm. –

+0

Từ trợ giúp dòng lệnh hg trên rollback, "Nó cũng sẽ khôi phục lại các dirstate tại thời điểm giao dịch cuối cùng." Đây không phải là những gì bạn đang cố gắng để tránh? –

+0

@Marc: không, anh ấy cũng muốn quay trở lại. Đó là những gì theo dõi các tập tin được thêm vào, ví dụ. Vì vậy, "hg thêm foo.c; hg commit; hg rollback" sẽ để lại foo.c được thêm vào theo "trạng thái hg". –

23

Bạn muốn có lệnh hg rollback, nhưng xem bên dưới nếu bạn đang sử dụng Mercurial 2.2 hoặc mới hơn.

Lệnh quay lại sẽ xóa giao dịch cuối cùng từ kho lưu trữ của bạn. Một cam kết là một giao dịch, vì vậy bạn có thể sử dụng điều này như

% hg commit -m 'My elaburate bugfix.' foo.c foo.h 
% hg rollback 
% hg commit -m 'My elaborate bugfix.' foo.c foo.h 

Sau khi rollback các tập tin một lần nữa sẽ được xem như biến đổi, và điều này có nghĩa là thứ hai cam kết sẽ lưu trữ những thay đổi tương tự như người đầu tiên, nhưng với một thông điệp cam kết tốt hơn.

Hãy coi chừng:hg rollback là mạnh hơn một chức năng "uncommit" đơn giản và bạn có thể sử dụng nó để vứt bỏ công việc nếu bạn không cẩn thận. Để vứt bỏ một cam kết làm

$ hg commit -m 'My big and very difficult bugfix' 
$ hg pull --update 
$ hg rollback 

Bây giờ bạn đã mất cam kết cuối cùng bạn thực hiện và kể từ khi bạn cập nhật bản sao làm việc với một số sửa đổi khác, những thay đổi trong đó cam kết là đi. Vì vậy, bạn chỉ nên sử dụng hg rollback để hoàn tác một cam kết nếu bạn chắc chắn rằng hg commit thực sự là lệnh cuối cùng hoạt động trên bản sao làm việc.

Ngoài ra, nếu bạn chưa đưa ra thông báo cam kết trên dòng lệnh, thì bạn không thể chỉ cần nhấn mũi tên lên hai lần để làm lại cam kết sau khi quay trở lại. Tuy nhiên, Mercurial 1.5 và sau đó sẽ lưu thông điệp cam kết cuối cùng của bạn trong .hg/last-message.txt để bạn luôn có thể tìm thấy nó sau khi quay trở lại.

Mercurial 2.2 có một mới --amend cờ cho hg commit. Điều này cho phép bạn sửa đổi cam kết cuối cùng với những thay đổi mới. Nó chỉ đơn giản là kết hợp các thay đổi được liệt kê bởi hg status vào cam kết gốc, như thể bạn đã quay trở lại và cam kết một lần nữa.

0

Ngoài ra còn có lệnh "hg strip" từ tiện ích mở rộng "mq". Nó gần như chính xác tương đương với "bzr uncommit". Hãy cẩn thận, mặc dù khi bạn đẩy sai phạm của bạn cam kết trước đó đến một kho lưu trữ, nó sẽ được tái tạo với kéo gần nhất từ ​​nó.

+0

Xin lỗi, điều này là không chính xác - 'hg strip' sẽ xóa changesets khỏi kho lưu trữ trong khi' bzr uncommit' sẽ thiết lập kho lưu trữ và cây hoạt động trở về trạng thái ngay trước commit. –

+0

Vâng, đó là lý do tại sao tôi sử dụng từ 'gần như' - sự khác biệt duy nhất có vẻ là trạng thái của thư mục làm việc. Tôi chỉ nghĩ rằng nó đáng nói, vì đây là Mercurial tương đương với 'bzr uncommit' (và thật đáng buồn, một cái không rõ ràng, nên khó tìm), có khả năng loại bỏ nhiều thay đổi KHÔNG ngay sau khi commit. Theo tài liệu Bazaar, bzr uncommit có thể làm điều đó. Nếu bạn biết một lệnh Mercurial lịch sử giả mạo khác có khả năng loại bỏ nhiều thay đổi (ví dụ như 'bzr uncommit -r 1'), thì hãy cho tôi biết. Tôi rất sẵn lòng tìm hiểu về nó. –