Có cách nào để xóa các xác nhận cục bộ trong Mercurial không?


209

Vì vậy, tôi tiếp tục phạm một lỗi ngớ ngẩn trong Mercurial. Thông thường, tôi sẽ bắt đầu công việc mà không thực hiện "hg pull" và "hg update". Khi tôi cố gắng thay đổi, tôi gặp lỗi.

Có cách nào để xóa các cam kết cục bộ của tôi để tôi có thể tránh tạo nhiều đầu, các nhánh, v.v. không? Tôi chỉ muốn xóa các cam kết cục bộ của mình, hợp nhất các thay đổi của tôi với mẹo và sau đó cam kết lại. Nghe có vẻ đơn giản phải không? Tôi dường như không thể tìm thấy bất kỳ cách nào để dễ dàng xóa các xác nhận cục bộ để tôi có thể kết hợp hoàn hảo với mẹo.

Một lần nữa, tôi chỉ cố gắng xóa các xác nhận cục bộ được thực hiện bằng "hg ci". Tôi không muốn sửa đổi tập tin, hoàn nguyên, v.v.



12
Đó không phải là một sai lầm ngớ ngẩn, đó là quy trình làm việc bình thường khi một số người đang làm việc với cùng một kho lưu trữ.
Juozas Kontvainis

Câu trả lời:


247

Kích hoạt phần mở rộng " dải " và gõ như sau:

hg strip #changeset# --keep

Trong trường hợp #changeset#là băm cho changeset bạn muốn loại bỏ. Điều này sẽ loại bỏ các thay đổi đã nói bao gồm các thay đổi xuất phát từ nó và sẽ khiến thư mục làm việc của bạn không bị ảnh hưởng . Nếu bạn cũng muốn hoàn nguyên các thay đổi mã đã cam kết của mình, hãy xóa --keeptùy chọn.

Để biết thêm thông tin, kiểm tra phần Mở rộng Dải .

Nếu bạn nhận được "lệnh unkown 'dải'", bạn có thể cần phải bật nó. Để làm như vậy, tìm tập tin .hgrchoặc Mercurial.inithêm vào đây:

[extensions]
strip =

Lưu ý rằng (như Juozas đã đề cập trong bình luận của mình) có nhiều đầu là quy trình làm việc bình thường trong Mercurial. Bạn không nên sử dụng lệnh dải để chiến đấu với điều đó. Thay vào đó, bạn nên hợp nhất đầu của bạn với đầu đến, giải quyết mọi xung đột, kiểm tra và sau đó đẩy.

Các striplệnh rất hữu ích khi bạn thực sự muốn thoát khỏi changesets làm ô nhiễm chi nhánh. Trên thực tế, nếu bạn đang ở trong tình huống của câu hỏi này và bạn muốn xóa hoàn toàn tất cả các bộ thay đổi "bản nháp" , hãy xem câu trả lời hàng đầu , về cơ bản là gợi ý thực hiện:

hg strip 'roots(outgoing())'

8
@Bharath: Bạn cần kích hoạt tiện ích mở rộng
Samaursa

1
Vì mercurial 2.8, dải là một phần mở rộng độc lập, vì vậy chỉ cần strip = là tốt. WhatsNew cho Mercurial 2.8
Chih-Hsuan Yen

104

Nếu bạn đang sử dụng Hg Rùa, chỉ cần kích hoạt " dải " tiện ích mở rộng trong:

  1. Tệp / Cài đặt / Tiện ích mở rộng /
  2. Chọn dải

Sau đó chọn bản sửa đổi dưới cùng từ nơi bạn muốn bắt đầu phân loại, bằng cách thực hiện right clickvà chọn:

  1. Sửa đổi lịch sử
  2. Dải

Chỉ như thế này:

nhập mô tả hình ảnh ở đây

Trong ví dụ này, nó sẽ xóa từ lần sửa đổi thứ 19 đến lần sửa đổi cuối cùng (22).


2
File/Settings/Extensions/Tôi ước tôi có thể thêm nhiều phiếu hơn. Cảm ơn rât nhiều!
dyatchenko

Argh! Tôi đã thử điều này nhưng dường như bỏ tất cả các thay đổi của tôi mặc dù không kiểm tra "không sao lưu" hoặc "loại bỏ các thay đổi cục bộ". Tôi muốn giữ những thay đổi đó, chỉ cần không cam kết chúng! Có cách nào để phục hồi chúng bây giờ ??
Tim Tonomall

2
Tôi dường như không thể tìm ra cách để làm điều đó đúng, nhưng có vẻ như giữ nội dung bạn cần vượt qua --keepvà TortoiseHg không cung cấp tùy chọn đó. Vì vậy, ... bạn cần phải làm điều đó tại dòng lệnh với hg strip -r . --keep.
Tim Tonomall

3
từ trợ giúp dải: 'Mọi thay đổi bị tước được lưu trữ trong ".hg / sao lưu dải" dưới dạng một gói (xem "gói trợ giúp hg" và "hg trợ giúp giải quyết"). Chúng có thể được khôi phục bằng cách chạy "hg unbundle .hg / dải-backup / BUNDLE", trong đó BUNDLE là tệp bó được tạo bởi dải. '
Tim Tonomall

Trong SourceTree, nó cũng hữu ích. Cảm ơn!
Ponomarenko Oleh

22

Câu trả lời hiện đại (chỉ liên quan sau Mercurial 2.1):

Sử dụng các Pha và đánh dấu (các) bản sửa đổi mà bạn không muốn chia sẻ dưới dạng bí mật (riêng tư). Theo cách đó khi bạn đẩy họ sẽ không được gửi.

Trong TortoiseHG, bạn có thể nhấp chuột phải vào một cam kết để thay đổi pha của nó.

Ngoài ra: Bạn cũng có thể sử dụng tiện ích mở rộng "rebase" để di chuyển các xác nhận cục bộ của mình sang phần đầu của kho lưu trữ được chia sẻ sau khi bạn kéo.


Riêng tư == bí mật ngay bây giờ
Dmitry Osinovskiy

15

Như mọi người khác đang chỉ ra, có lẽ bạn chỉ nên kéo và sau đó hợp nhất các đầu, nhưng nếu bạn thực sự muốn loại bỏ các cam kết của mình mà không cần bất kỳ công cụ EditingHistory nào thì bạn chỉ có thể hg clone -rrepo để nhận tất cả trừ những thay đổi đó.

Điều này không xóa chúng khỏi kho lưu trữ ban đầu, nhưng nó tạo ra một bản sao mới không có chúng. Sau đó, bạn có thể xóa repo bạn đã sửa đổi (nếu bạn muốn).


"Hg clone -r" có xóa các thay đổi cục bộ không? Tôi chỉ muốn xóa các cam kết cục bộ để giữ cho mọi thứ đơn giản.
dùng191535

4
Nó không xóa chúng khỏi kho lưu trữ nhân bản, nhưng nó tạo ra một bản sao mới không có chúng. Sau đó, bạn có thể xóa repo bạn đã sửa đổi nếu bạn muốn.
Ry4an Brase

9

Tôi đã gặp vấn đề này quá. Tôi đã thực hiện 2 commitvà muốn khôi phục và xóa cả hai cam kết.

$ hg rollback

Nhưng hg rollback chỉ cần quay trở lại cam kết cuối cùng, không phải là 2 cam kết. Lúc đó tôi không nhận ra điều này và tôi đã thay đổi mã.

Khi tôi tìm thấy hg rollbackvừa quay trở lại một cam kết, tôi thấy tôi có thể sử dụng hg strip #changeset#. Vì vậy, tôi đã sử dụng hg log -l 10để tìm 10 cam kết mới nhất và nhận được các thay đổi phù hợp mà tôi muốn strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

abort: local changes foundnghĩa là gì? Điều đó có nghĩa là đã hgtìm thấy các thay đổi đối với mã chưa được cam kết. Vì vậy, để giải quyết điều này, bạn nên hg difflưu mã bạn đã thay đổi hg reverthg strip #changeset#. Chỉ như thế này:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

Sau khi bạn đã thực hiện ở trên, bạn có thể patchgửi tệp diff và mã của bạn có thể được thêm lại vào dự án của bạn.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

Bạn có thể giải quyết vấn đề này thậm chí dễ dàng hơn với tiện ích mở rộng Rebase , chỉ cần sử dụng hg pull --rebasevà các cam kết của bạn sẽ tự động được gửi lại vào bản sửa đổi đã kéo, tránh vấn đề phân nhánh.


1
Với chi phí có một lịch sử không chính xác và có thể tham nhũng nếu bạn làm sai.
Ry4an Brase

5

Nếu bạn quen thuộc với git, bạn sẽ rất vui khi sử dụng histedit hoạt động như thế nào git rebase -i.


4

hg striplà những gì bạn đang tìm kiếm. Nó tương tự git resetnếu bạn quen thuộc với git.

Sử dụng bảng điều khiển:

  1. Bạn cần biết số sửa đổi. hg log -l 10. Lệnh này hiển thị 10 lần xác nhận cuối cùng. Tìm cam kết bạn đang tìm kiếm. Bạn cần số có 4 chữ số từ dòng thay đổichangeset: 5888:ba6205914681

  2. Sau đó hg strip -r 5888 --keep. Điều này loại bỏ bản ghi của cam kết nhưng giữ cho tất cả các tệp được sửa đổi và sau đó bạn có thể đề xuất chúng. (nếu bạn muốn xóa các tập tin chỉ cần xóa --keephg strip -r 5888


1

[Hg Rùa 4.6.1] Nếu đó là hành động gần đây, bạn có thể sử dụng hành động "Quay lại / Hoàn tác" (Ctrl + U).

Hình ảnh rùa HG


Kiểm tra kỹ sự bao gồm của một hình ảnh.
Bill Keller

0

Ngoài câu trả lời xuất sắc của Samaursa, bạn có thể sử dụng evolvetiện ích mở rộng prunenhư một phiên bản an toàn và có thể phục hồi củastrip sẽ cho phép bạn quay lại trong trường hợp bạn làm bất cứ điều gì sai.

Tôi có những bí danh trên .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

Lưu ý rằng prunecũng có --keep, giống như strip, để giữ cho thư mục làm việc nguyên vẹn cho phép bạn giới thiệu các tệp.

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.