2012-10-28 34 views
38

những gì sẽ là một lệnh tương đương lanh lợi (hoặc công việc) choMercurial (hg) tương đương với reset git (--mixed hoặc --soft)

git reset --mixed HEAD^ 

hoặc

git reset --soft HEAD^ 

tức là tôi muốn rời khỏi cây làm việc còn nguyên vẹn nhưng lấy lại kho lưu trữ về trạng thái trước lần commit cuối cùng. Đáng ngạc nhiên là tôi không tìm thấy bất cứ điều gì hữu ích trên stackoverflow hoặc với google.

Lưu ý rằng tôi không thể sử dụng

hg rollback 

như tôi đã thực hiện một số lịch sử viết lại sử dụng HistEdit sau khi cam kết cuối cùng.

gia tăng để làm rõ: Sau một rebasing và lịch sử chỉnh sửa tôi đã kết thúc với A < --B < --C. Sau đó, tôi sử dụng HistEdit để squash B và C với nhau, có được A < --C '. Bây giờ tôi muốn chia nhỏ cam kết C '(Tôi đã cam kết các tệp sai trong B). Tôi đã tìm ra cách dễ nhất để làm điều này là lấy kho lưu trữ về trạng thái A (về mặt kỹ thuật chưa từng tồn tại trong kho lưu trữ vì tất cả việc chỉnh sửa lại và chỉnh sửa lịch sử trước bàn tay) và cây làm việc ở trạng thái C 'và sau đó thực hiện hai cam kết.

Trả lời

55

Cách đúng để tái tạo git reset --soft HEAD^ (undo cam kết nhưng giữ các thay đổi hiện tại trong bản sao làm việc) là:

hg strip --keep -r . 

-1 sẽ chỉ làm việc nếu cam kết mà bạn muốn tước là cuối cùng cam kết rằng vào kho lưu trữ. . đề cập đến cam kết hiện đã được kiểm tra, đó là Mercurial gần nhất tương đương với Git's HEAD.

Lưu ý rằng nếu . có hậu duệ, những người đó cũng sẽ bị tước đi. Nếu bạn muốn giữ cam kết xung quanh, sau đó khi bạn có ID cam kết, bạn có thể thay thế:

hg update .^ 
hg revert --all -r <commit id> 

Điều này sẽ cập nhật cha mẹ của cam kết và sau đó thay thế tệp trong bản sao làm việc bằng các phiên bản cam kết đó.

+0

Lưu ý: điều này cần phần mở rộng MQ của hg. –

+2

Mercurial 2.8 và sau đó đi kèm với một [dải mở rộng] chuyên dụng (https://www.mercurial-scm.org/wiki/StripExtension). – fhd

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