Xóa tất cả các tập thay đổi cục bộ và hoàn nguyên về dạng cây


95

Tôi đang sử dụng Mercurial và tôi đã gặp phải một mớ hỗn độn khủng khiếp tại địa phương, với ba cái đầu. Tôi không thể thúc đẩy và tôi chỉ muốn xóa tất cả các thay đổi cục bộ và cam kết của mình và bắt đầu lại với mã hoàn toàn sạch và lịch sử rõ ràng.

Nói cách khác, tôi muốn kết thúc với (a) chính xác cùng một mã cục bộ như tồn tại trong đầu của nhánh từ xa và (b) không có lịch sử của bất kỳ cam kết cục bộ nào.

Tôi biết hg update -Cghi đè bất kỳ thay đổi cục bộ nào. Nhưng làm cách nào để xóa bất kỳ cam kết cục bộ nào?

Nói rõ hơn, tôi không quan tâm đến việc bảo tồn bất kỳ công việc nào tôi đã làm tại địa phương. Tôi chỉ muốn cách đơn giản nhất để hoàn nguyên về thanh toán cục bộ hoàn toàn sạch sẽ.


Câu trả lời:


129

Khi cách đơn giản nhất (mới hg clone) không thực tế, tôi sử dụng hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Lặp lại cho đến khi hg outgoingyên lặng. Lưu ý rằng hg strip $revxóa sạch $revvà tất cả con cháu của nó.

Lưu ý rằng trước tiênstrip bạn có thể phải bật trong cài đặt Mercurial của mình .

Tái bút : một cách tiếp cận thông minh hơn nữa là sử dụng ngôn ngữ revset và thực hiện:

% hg strip 'roots(outgoing())'

1
Cảm ơn bạn! Tôi đã kết thúc trong một tình huống mà điều này đã giải quyết một cách hoàn hảo, không có bất kỳ phiền phức nào.
eswald

1
Điều này đã cứu tôi khỏi các bản sửa lỗi lớn ở trên, rất đơn giản, cảm ơn bạn!
David C

3
Nếu ai đó gặp khó khăn khi hg strip 'roots(outgoing())'đi làm do không nhận ra 'roots(outgoing())'. Tôi đã có thể làm cho nó hoạt động hg strip "roots(outgoing())".
jsea

@SombreErmine vào cmd.exe, vâng.
chỉ ai đó.

21

Bạn sẽ muốn tạo một bản sao cục bộ trong đó bạn chỉ bảo quản các tập thay đổi cũng có trong kho lưu trữ từ xa. Sử dụng TortoiseHg , hg loghoặc tương tự để tìm ra bản sửa đổi nào của bạn là bản sửa đổi cuối cùng mà bạn không thực hiện ( bản sửa đổi trước khi bắt đầu lộn xộn). Việc sử dụng hg outgoingcó thể hữu ích ở đây - nó sẽ liệt kê tất cả các tập thay đổi bạn đã thực hiện - chọn một số sửa đổi sớm hơn bất kỳ số nào trong số đó.

Nếu bản sửa đổi đích được gọi goodvà bản sao của bạn được gọi foo, thì hãy thực hiện:

hg clone -r good foo foo-clean

Đây sẽ là một hoạt động cục bộ, nhanh chóng - không có lý do gì để tải xuống lại mọi thứ . Bản foo-cleansao sẽ chỉ chứa các tập thay đổi cho đến bản sửa đổi good. Bây giờ bạn có thể thay thế foo-clean/.hg/hgrcbằng foo/.hg/hgrcđể bảo toàn cài đặt kho lưu trữ cục bộ của mình, chẳng hạn như đường dẫn đẩy / kéo mặc định.

Khi bạn hài lòng với foo-cleanmọi thứ bạn cần foo, sau đó chỉ cần xóa foovà đổi tên foo-cleanthành foo. Làm một hg pullđể nhận bất kỳ tập thay đổi mới nào từ kho lưu trữ từ xa vào bản sao của bạn và tiếp tục như bình thường.


Nếu chưa có ai đẩy các tập thay đổi mới vào kho lưu trữ từ xa, thì rất đơn giản để xác định bản sửa đổi nào bạn muốn sử dụng như goodtrên: hg id defaultsẽ cho bạn biết ID của mẹo trong kho lưu trữ từ xa.


Tôi đang gặp trường hợp tương tự, nhưng cũng có rất nhiều tệp trong thư mục repo nhưng lại ở trong hgignore. Không thể cài đặt dải hg và muốn loại bỏ các cam kết cục bộ mà không thay thế toàn bộ bản sao. Bất kỳ ý tưởng? -- Ah! Nếu tôi chưa thêm bất kỳ tệp nào, tôi sẽ có thể sao chép bản sao khác vào thư mục cũ của mình !?
Peteter

Tuy nhiên, hãy cẩn thận với phương pháp này nếu bạn có nhiều chi nhánh. Sao chép đến một bản sửa đổi được chỉ định chỉ nhận được các tập thay đổi trên nhánh của bản sửa đổi được chỉ định. Sau đó, bạn có thể phải hg pull -rsửa đổi "tốt" cuối cùng của mỗi nhánh bổ sung.
Yitz

9

Đồng ý. Vì vậy, chỉ cần xóa tất cả nội dung cục bộ, hg initkho lưu trữ cục bộ mới và hg pullmẹo mới nhất mà bạn có. Đừng quên hg updatesau điều này.


Cảm ơn. Khi bạn nói 'xóa tất cả nội dung cục bộ', nghĩa là bạn xóa toàn bộ kho lưu trữ hay chỉ những thay đổi của tôi? Hg init làm gì (có Googled nhưng không thấy giải thích đơn giản) và tôi có cần sử dụng bất kỳ cờ nào với nó không? Nó có xóa những thứ như tùy chọn Mercurial .hgrc của tôi không?
Richard

Cập nhật: nếu tôi xóa mọi thứ trong thư mục gốc của dự án, sau đó nhập 'hg init', tôi nhận được 'abort: repository. đã tồn tại!'. Tôi có cần thiết lập và làm việc từ một thư mục mới không? Tôi không muốn nếu có thể ... chắc chắn phải có một cách đơn giản để giết mọi thứ tôi đã làm tại địa phương ?!
Richard

Có, xóa mọi thứ bao gồm tất cả các thứ trong kho lưu trữ. Bắt đầu từ một thư mục sạch mới. Tùy chọn của bạn, bạn có thể lưu trong tệp sao lưu, sau đó khôi phục chúng vào kho lưu trữ mới mà bạn tạo bằng reponame hg init. Chi tiết về init và các công cụ: hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus

6
alemjerus: hg init+ hg pull= hg cloneSự khác biệt là nó hg clonetạo ra một .hg/hgrctệp đẹp cho bạn và nó hg clonesẽ sử dụng các liên kết cứng để tiết kiệm dung lượng khi sao chép trên cùng một hệ thống tệp.
Martin Geisler

Richard: Đầu ra của hg help initở đây: selenic.com/mercurial/hg.1.html#init Nhưng có lẽ điều đó quá ngắn? Vui lòng gửi thư đến danh sách gửi thư của chúng tôi nếu bạn cần thêm trợ giúp! Hãy xem: merurial.selenic.com/wiki/MailingLists
Martin Geisler

5

Bạn có thể sử dụng

sửa đổi dải hg

để loại bỏ bất kỳ bản sửa đổi nào và cây con của nó trong kho lưu trữ cục bộ của bạn.

https://www.mercurial-scm.org/wiki/Strip

Nhưng đừng cố gắng sử dụng nó cho bất kỳ thứ gì đã được đẩy.


Bạn có thể sử dụng nó trên một bản sửa đổi công khai, nhưng nếu bạn kéo lại, nó sẽ xuất hiện lại. (dải hg chỉ hoạt động với kho lưu trữ cục bộ.)
Mike Rosoft

2

Chỉ cần xóa mọi thứ bạn có trên hệ thống cục bộ và sao chép lại repo từ xa.


2
dải hg `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | cắt -d "" -f 1`

làm thủ thuật cho tôi.

Nó loại bỏ tất cả các bản sửa đổi không được đẩy vào kho lưu trữ mặc định được tạo bằng tên tác giả của bạn.

Bạn cũng có thể sử dụng kiểu này để làm cho nó không kiểm tra với kho lưu trữ mặc định mà với một Kho lưu trữ khác

dải hg `hg out OTHER_REPO_ALIAS --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | cắt -d "" -f 1`

0

Nếu bạn đang sử dụng TortoiseHg, một cách đơn giản để thoát khỏi mớ hỗn độn (nhỏ) là trước tiên hãy cập nhật bản sửa đổi mới nhất, sau đó chọn các tập hợp thay đổi của bạn và bắt đầu "hợp nhất với cục bộ". Khi hộp thoại hợp nhất xuất hiện, chỉ cần nhấp vào biểu tượng nhỏ '+' để hiển thị một số tùy chọn bổ sung, một trong số đó là "hủy các tập hợp thay đổi khỏi bản sửa đổi mục tiêu hợp nhất (khác)". Làm điều này có nghĩa là các tập thay đổi của bạn sẽ vẫn ở trong repo và được đẩy, nhưng sẽ không có tác dụng, vì chúng sẽ bị loại bỏ trong hợp nhất. Nếu bạn có nhiều tập thay đổi bao gồm nhiều đầu, bạn có thể không muốn làm ô nhiễm repo theo cách này, nhưng đó là một cách khắc phục đơn giản và đáng xem xét nếu các tập thay đổi bạn đang loại bỏ chứa dữ liệu mà sau này bạn có thể muốn tham khảo.

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.