2010-09-21 22 views
37

Tôi đã tạo ra một số lượng lớn và có thể sử dụng một số trợ giúp để hoàn tác nó.Hoàn tác một cú hg đẩy (backout?)

Chúng tôi có hai kho - một kho lưu trữ khá ổn định và kho lưu trữ chúng tôi đang thực hiện các thay đổi. Tôi vừa sửa lỗi trong kho lưu trữ ổn định và di chuyển đến kho lưu trữ đang hoạt động. Tôi kéo từ kho lưu trữ ổn định, sáp nhập, sau đó vô tình bị đẩy vào kho lưu trữ ổn định.

Các kho ổn định bây giờ trông như thế này:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

nơi một là cam kết rằng sẽ là đỉnh của kho ổn định, b là tất cả những gì mà chúng tôi đã thực hiện trong kho lưu trữ phát triển, và c là điểm chúng tôi phân nhánh kho lưu trữ phát triển.

Làm thế nào để đi về làm cho nó trở lại:

*a 
| 
*c 

(Tôi biết tôi có thể không thực sự làm thay đổi đi xa, tôi chỉ tìm kiếm một cấu trúc chức năng ...)

Tôi đã đọc một số điều khiến tôi nghĩ rằng hg backout là lệnh tôi cần, nhưng tôi không chắc chắn chính xác nó làm gì.

Trả lời

45

hg rollback hoàn nguyên giao dịch cuối cùng, vì vậy, bạn sẽ bị hủy hợp nhất chưa hoàn tất mà bạn phải sử dụng hg update -C để thoát.

Nếu bạn không muốn * b (bạn có nó trong bản sao khác), sau đó bật phần mở rộng MQ dựng sẵn và chạy hg strip -r <*b>. Nó sẽ loại bỏ * b và * hợp nhất. Theo mặc định, nó sẽ lưu một bản sao lưu trong trường hợp bạn đổi ý lần nữa.


UPDATE (mỗi @ bình luận Rudi của: xin lỗi tôi bỏ lỡ "đã đẩy" phần)

Kể từ khi hợp nhất đã được đẩy ra ngoài, NEVER EVER làm những gì tôi đề xuất trước đó. Ghét email từ các nhà phát triển đồng nghiệp sẽ là kết quả tốt nhất.

Làm điều này thay vì:

hg up -r<*merge> 
hg revert -r<*a> -a 
hg ci -m "undo unintended merge" 

Hoặc bạn có thể là kosher hơn:

hg up -r<*merge> 
hg backout -r<*merge> --parent<*a> 
+1

Vì hợp nhất đã được đẩy, nên không thể cuộn lại cam kết hợp nhất (đẩy và kéo cũng là giao dịch). Ngoài ra hoạt động này wold được cần thiết để được thực hiện trong mỗi bản sao làm việc mà kéo cam kết này từ kho lưu trữ ổn định. – Rudi

+0

Sự khác biệt giữa việc sử dụng phát lại và hoàn nguyên là gì? Tôi đã kết thúc bằng cách sử dụng backout, nhưng tôi muốn biết các lựa chọn của mình (mặc dù tôi hy vọng nó sẽ không bao giờ xảy ra nữa!) – Neil

+2

'backout' cam kết một changeset mới trên đầu trang của các thay đổi hiện có của bạn để đảo ngược các thay đổi một cách hiệu quả. 'hoàn nguyên' thay đổi bản sao làm việc của bạn và không cam kết. –

0

hg rollback sẽ hoàn nguyên cam kết cuối cùng, xóa bất kỳ lịch sử nào nếu không được thực hiện.

Vì vậy, nếu bạn bắt đầu với điều này:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

hg rollback sẽ cung cấp cho:

*a *b 
|/
*c 

lưu ý rằng bạn chỉ có thể làm hg rollback chỉ một lần.

Bạn nên tạo bản sao lưu hoàn chỉnh của kho lưu trữ trước khi thực hiện khôi phục. Để làm điều này, chỉ cần hg clone toàn bộ kho lưu trữ.

+1

Tôi nghĩ bạn có nghĩa là rollback, không backout. :) –

+0

Tôi vừa mới cập nhật bài đăng này để không cần OK :) –

2

Tôi nghĩ rằng nó đến muộn để làm hg rollback kể từ khi bạn đã đẩy những thay đổi của bạn.

Bạn có thể thử với các phần mở rộng MQ nhưng điều này cũng hoạt động cục bộ. hg strip sẽ chỉ sửa đổi repo địa phương của bạn. Bạn có thể cố gắng sửa đổi repo máy chủ của bạn trực tiếp trên máy chủ nhưng nếu ai đó kéo nó quá muộn.

Một lựa chọn khác được mô tả trong chapter 9 của hgbook trong phần Sao lưu ra một merge. Nó liên quan đến lệnh hg backout nhưng có thể là quá mức cần thiết cho bạn ...

Tôi đề nghị hg update -C để * sửa đổi, hợp nhất bằng mẹo và bỏ qua tất cả thay đổi từ * hợp nhất? kho của bạn sẽ trông nhiều hơn hoặc ít hơn như thế này:

*second merge 
| \ 
| \ 
| \  
|  \ 
*merge | 
| \ | 
| \ | 
| *b | 
*a |/
|// 
*c--- 

lệnh cho điều này là

  • $ hg --config ui.merge=internal:local merge #keep my files
  • $ hg --config ui.merge=internal:other merge #keep their files

Thông tin chi tiết có thể được tìm thấy here.

0

Bạn tất cả đều có ít giải pháp phức tạp cho vấn đề này, có thể xảy ra với bất kỳ ai trong chúng ta.

Những gì tôi đã làm, tôi đã đăng nhập trên máy tính từ xa vào kho lưu trữ trung tâm của mình và tại đó có mq mở rộng thay đổi trạng thái sửa đổi thành "nháp" và "quy định".

Nhược điểm duy nhất của nó là, nếu ai đó có bản sao của repo với sửa đổi tước và sẽ đẩy, họ sẽ xuất hiện trở lại. Vì vậy, nếu bạn có thể, yêu cầu người khác a) làm tương tự (dự thảo, dải) b) xóa kho địa phương của họ và resync với biến đổi một

Tất cả có thể đạt được một cách dễ dàng với TortoiseHg.

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