2010-03-29 32 views
231

Tôi đang sử dụng Mercurial tại địa phương cho một dự án (đó là repo duy nhất không có đẩy/kéo đến/từ bất cứ nơi nào khác).Mercurial - quay trở lại phiên bản cũ và tiếp tục từ đó

Cho đến nay, lịch sử tuyến tính có lịch sử tuyến tính. Tuy nhiên, hiện tại tôi đang làm việc trên bây giờ tôi nhận ra là một cách tiếp cận khủng khiếp và tôi muốn quay lại phiên bản trước khi tôi bắt đầu nó và thực hiện nó theo một cách khác.

Tôi hơi bối rối với các lệnh branch/revert/update -C trong Mercurial. Về cơ bản tôi muốn trở lại phiên bản 38 (hiện tại trên 45) và có cam kết tiếp theo của tôi có 38 là một phụ huynh và tiếp tục từ đó. Tôi không quan tâm nếu sửa đổi 39-45 bị mất bao giờ hoặc kết thúc trong một chi nhánh chết của riêng mình.

Tôi cần lệnh/tập lệnh nào?

+6

Đối với bất kỳ ai quan tâm, điều này đã xuất hiện trên thanh bên có liên quan là giải thích tuyệt vời về hoàn nguyên và cập nhật: http://stackoverflow.com/questions/2506803/difference-between-revert-and-update-in-mercurial – Paolo

Trả lời

141
hg update [-r REV] 

Nếu sau này bạn cam kết, bạn sẽ tạo một nhánh mới hiệu quả. Sau đó, bạn có thể tiếp tục chỉ làm việc trên nhánh này hoặc cuối cùng hợp nhất nhánh hiện tại vào nhánh đó.

+0

cảm ơn, và các cam kết tiếp theo được thực hiện từ REV có? – Paolo

+6

cam kết tiếp theo sẽ tạo một chi nhánh mới. Nếu bạn không chắc chắn, chỉ cần sao lưu kho lưu trữ của bạn (với bản sao làm việc), hãy thử nó - không thích kết quả -> bắt đầu từ đầu miễn phí – van

+0

Đây là câu trả lời không rõ ràng vì nó kết hợp các thay đổi hiện tại của bạn với cũ sửa đổi mà có lẽ là những gì bạn không muốn làm. Câu trả lời đúng nên được hg trở lại. –

376

Đây là bản tóm tắt về các lệnh:

  • hg update thay đổi phiên bản cha mẹ bản sao làm việc của bạn và cũng làm thay đổi nội dung tập tin để phù hợp với phiên bản cha mẹ mới này. Điều này có nghĩa là các cam kết mới sẽ tiếp tục từ bản sửa đổi bạn cập nhật.

  • hg revert chỉ thay đổi nội dung tệp và để riêng bản sửa đổi của bản sao làm việc. Bạn thường sử dụng hg revert khi bạn quyết định rằng bạn không muốn giữ các thay đổi không được thực hiện đối với một tệp trong bản sao làm việc của mình.

  • hg branch bắt đầu chi nhánh có tên mới. Hãy suy nghĩ về một chi nhánh được đặt tên như một nhãn bạn gán cho các changesets. Vì vậy, nếu bạn làm hg branch red, thì các thay đổi sau sẽ được đánh dấu là thuộc về nhánh "màu đỏ". Đây có thể là một cách hay để tổ chức các thay đổi, đặc biệt khi những người khác nhau làm việc trên các nhánh khác nhau và sau đó bạn muốn xem nơi một changeset có nguồn gốc từ đâu. Nhưng bạn không muốn sử dụng nó trong tình huống của bạn.

Nếu bạn sử dụng hg update --rev 38, khi đó thay đổi 39–45 sẽ bị bỏ lại như một đầu cụt - một đầu lơ lửng như chúng tôi gọi. Bạn sẽ nhận được cảnh báo khi bạn đẩy vì bạn sẽ tạo "nhiều đầu" trong kho lưu trữ mà bạn đẩy tới. Cảnh báo là có vì nó là loại bất lịch sự để lại những người đứng đầu xung quanh kể từ khi họ cho rằng ai đó cần phải làm một hợp nhất. Nhưng trong trường hợp của bạn, bạn có thể chỉ cần đi trước và hg push --force vì bạn thực sự muốn để nó treo.

Nếu bạn chưa đẩy bản sửa đổi 39-45 ở nơi khác, thì bạn có thể giữ riêng tư. Nó rất đơn giản: với hg clone --rev 38 foo foo-38 bạn sẽ nhận được bản sao cục bộ mới chỉ chứa đến bản sửa đổi 38. Bạn có thể tiếp tục làm việc theo số foo-38 và đẩy các thay đổi mới (tốt) mà bạn tạo. Bạn vẫn sẽ có bản sửa đổi cũ (xấu) trong bản sao foo của mình. (Bạn được tự do đổi tên các bản sao mặc dù bạn muốn, ví dụ: foo đến foo-badfoo-38 đến foo.)

Cuối cùng, bạn cũng có thể sử dụng hg revert --all --rev 38 và sau đó cam kết. Điều này sẽ tạo ra một sửa đổi 46 mà trông giống hệt với phiên bản 38. Bạn sẽ tiếp tục làm việc từ sửa đổi 46. Điều này sẽ không tạo ra một ngã ba trong lịch sử theo cách rõ ràng như hg update đã làm, nhưng mặt khác bạn sẽ không nhận được than phiền về có nhiều đầu. Tôi sẽ sử dụng hg revert nếu tôi cộng tác với những người khác đã thực hiện công việc của riêng họ dựa trên sửa đổi 45. Nếu không, hg update rõ ràng hơn.

+1

Câu trả lời tuyệt vời. Tôi sử dụng hg revert --all --rev ## và nó lưu ass của tôi: D –

+6

Và hg clone --rev 38 foo foo-38 vừa lưu của tôi. Cảm ơn!!! –

+6

+1 cho hg hoàn nguyên --all --rev X WOW. Đẹp. –

27

Tôi vừa gặp phải trường hợp cần hoàn nguyên chỉ một tệp để sửa đổi trước đó, ngay sau khi tôi đã thực hiện cam kết và đẩy. cú pháp tốc ký để xác định những sửa đổi không được bao phủ bởi những câu trả lời khác, vì vậy đây là lệnh để làm điều đó

hg revert path/to/file -r-2 

Đó -2 sẽ trở lại phiên bản trước khi cam kết cuối cùng, sử dụng -1 sẽ chỉ trở lại thay đổi không bị giam hiện nay.

+0

Tôi thấy điều này cực kỳ hữu ích. Tất nhiên với tùy chọn -r, bạn có thể chỉ cần cung cấp số sửa đổi – Alex

6

Sau khi sử dụng hg update -r REV, không rõ câu trả lời về cách cam kết thay đổi đó để bạn có thể đẩy.

Nếu bạn chỉ cố gắng cam kết sau khi cập nhật, Mercurial không nghĩ có bất kỳ thay đổi nào.

Trước tiên tôi phải thực hiện thay đổi đối với bất kỳ tệp nào (nói trong README) nên Mercurial nhận ra rằng tôi đã thực hiện một thay đổi mới, sau đó tôi có thể cam kết điều đó.

Điều này sau đó tạo hai đầu như đã đề cập.

Để loại bỏ đầu kia trước khi đẩy, sau đó tôi thực hiện theo bước No-Op Merges để khắc phục tình huống đó.

Sau đó tôi có thể đẩy.

+0

bạn có thể thực hiện 'commit --close-branch' trên nhánh cũ. Bạn cũng có thể "đẩy -f' để đẩy đầu mới, nhưng điều này có thể gây nhầm lẫn như nó hiện tại. –

7

IMHO, hg strip -r 39 phù hợp với trường hợp này tốt hơn.

Yêu cầu bật mở rộng mq và có cùng giới hạn như "phương pháp repo nhân bản" được đề xuất bởi Martin Geisler: Nếu changeset được xuất bản bằng cách nào đó, nó sẽ (có thể) quay lại repo của bạn tại một số thời điểm thời gian bởi vì bạn chỉ thay đổi repo địa phương của bạn.

+0

Không biết về điều này. Dễ dàng hơn và sạch hơn xóa và tái nhân bản repo. Cảm ơn. – iamnotmaynard

3

Các câu trả lời ở trên hữu ích nhất và tôi đã học được rất nhiều. Tuy nhiên, đối với nhu cầu của tôi câu trả lời ngắn gọn là:

hg revert --all --rev ${1} 

hg commit -m "Restoring branch ${1} as default" 

nơi ${1} là số sửa đổi hoặc tên của các chi nhánh. Hai dòng này thực sự là một phần của tập lệnh bash, nhưng chúng hoạt động tốt nếu chúng muốn thực hiện thủ công. Điều này rất hữu ích nếu bạn cần thêm bản sửa lỗi nóng vào nhánh phát hành, nhưng cần phải xây dựng từ mặc định (cho đến khi chúng tôi có được công cụ CI đúng và có thể xây dựng từ các nhánh và sau đó cũng được gỡ bỏ với nhánh phát hành). .

1

Tôi muốn cài đặt Tortoise Hg (GUI miễn phí cho Mercurial) và sử dụng nó. Sau đó, bạn có thể chỉ cần nhấp chuột phải vào bản sửa đổi mà bạn có thể muốn quay lại - với tất cả thông báo cam kết ở trước mắt bạn - và 'Hoàn nguyên tất cả các tệp'. Làm cho nó trực quan và dễ dàng để cuộn lùi và chuyển tiếp giữa các phiên bản của một tập tin, có thể thực sự hữu ích nếu bạn đang tìm kiếm để thiết lập khi một vấn đề đầu tiên xuất hiện.

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