Mercurial: Tôi có thể đổi tên một chi nhánh không?


204

Bây giờ chúng ta có một nhánh "kỳ thị", trong đó "dàn dựng" dường như là một sự phù hợp ngữ nghĩa tốt hơn nhiều. Một chiến lược tốt để xử lý này là gì?

Câu trả lời:


223

Cập nhật lên stigingnhánh và tạo một nhánh mới của nó. Sau đó đóng cành cũ.

Tóm tắt:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

1
Đây là cách tốt nhất để làm điều này mà tôi đã tìm thấy. Đóng chi nhánh sẽ ngăn người khác vô tình sử dụng nó vì nó không hiển thị trong đầu ra của "các nhánh hg". Nó vẫn cho phép bạn truy cập nó sau nếu bạn biết tên.
Đồ dùng

2
Mercurial sẽ cho phép sử dụng lại tên của chi nhánh đã đóng? Tức là, nếu bạn có một nhánh v3, bạn có thể sử dụng kỹ thuật trên để đổi tên nó thành v4 và sau đó tách ra một nhánh v3 mới mặc dù đã để lại một v3 đóng?
Joshua Goldberg

4
@JoshuaGoldberg, 3noch là sai. Mercurial sẽ cho phép bạn sử dụng lại tên của chi nhánh đã đóng nếu bạn sử dụng --force. Ví dụ : hg branch --force v3. Điều này sẽ dẫn đến việc hg update v3cập nhật lên v3chi nhánh mới , như bạn muốn.
Gili

2
đã xác nhận bình luận của @ Gili với chi nhánh trợ giúp của hg: "- buộc đặt tên chi nhánh ngay cả khi nó phủ bóng một nhánh hiện có"
Joshua Goldberg

7
Nếu bạn đóng stigingtrước khi phân nhánh, bạn sẽ không nhận được "kết thúc lỏng lẻo"
max.mustermann

60

Đối với độc giả tương lai: Với rebasetiện ích mở rộng, bạn có thể tạo một nhánh mới có cùng cha mẹ stigingvà chuyển toàn bộ lịch sử chi nhánh sang nhánh đó, như sau:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

Điều này giả định rằng stigingchỉ có một cha mẹ. Tất nhiên bạn chỉ có thể sử dụng số sửa đổi rõ ràng thay thế.

Lưu ý 1: Nếu chi nhánh stigingbao gồm hòa trộn với các ngành khác, tôi nghĩ rằng điều này sẽ bảo vệ họ, chừng nào stagingstigingcó cùng một mẹ. Nhưng tôi chắc chắn sẽ kiểm tra lại.

Lưu ý 2: Vì điều này chỉnh sửa lịch sử, chi nhánh cũ sẽ không biến mất khỏi kho lưu trữ nhân bản (xem rebasetài liệu). Trừ khi tất cả mọi người có thể nhân bản một lần nữa, nó có thể không phải là một giải pháp rất thiết thực cho một nhóm lớn.

Lưu ý3 / Chỉnh sửa (lịch sự của @JasonRCoombs): Bây giờ các giai đoạn là tiêu chuẩn trong đồng bóng, rebasesẽ từ chối sửa đổi các thay đổi đã được đẩy. Hoặc đánh lừa nó bằng cách thay đổi pha trở lại bản nháp (với hg phases) hoặc để nhánh cũ giữ nguyên vị trí của nó và chỉ tạo một bản sao được đặt tên đúng (ví dụ: với 'hg rebase --keep').


+1 cho các nhóm nhỏ nơi bạn có thể buộc người dùng sao chép đây là một ý tưởng hay - hoặc sử dụng hg convertthay thế.
hochl

5
Với các phiên bản muộn của Mercurial, lệnh rebase sẽ thất bại với "không thể rebase thay đổi bất biến" nếu các thay đổi được di chuyển là "công khai". Hoặc buộc chúng phải là bản nháp (với các pha hg) hoặc chuyển --keepsang lệnh rebase, nó sẽ sao chép thay vì di chuyển các thay đổi.
Jason R. Coombs

Ở bước 4 : abort: can't rebase immutable changeset 11b1e2b7dc4f. Lưu ý rằng tôi đã ghép các thay đổi từ nhánh khác vào nhánh này. Bên cạnh đó, nó được phân chia và hợp nhất miễn phí.
Mark Jeronimus

@Mark, hãy xem Note 3 ở trên.
alexis

6
Thay vì thực hiện một thay đổi trên nhánh mới và sau đó khởi động lại trên đỉnh của nó, bạn có thể bỏ qua nó và sử dụng .cho --destgiá trị của bạn và rebase sẽ tự động lấy tên nhánh mới.
weberc2

16

Nếu bạn có các thay đổi trên đó, thì bạn sẽ phải sử dụng tiện ích mở rộng chuyển đổi với sơ đồ nhánh để đổi tên nó. Mọi người sau đó sẽ phải nhân bản repo mới hoặc tước bỏ nhánh cũ.


1
Đây là một giải pháp thú vị, bạn có thể giải thích thêm một chút không?
DrM

15

Tạo một nhánh mới gọi là "dàn dựng" và quên đi ...


+1 đó là những gì tôi sẽ làm. Những thay đổi cũ sẽ vẫn có tên nhánh cũ, nhưng những cái mới sẽ có tên nhánh mới.
barjak

6

Điều này sửa đổi lịch sử và chỉ dành cho người dùng Mercurial nâng cao. Đừng làm điều này nếu bạn không biết điều đó có nghĩa là gì.

Nếu stiging chỉ là cục bộ, bạn có thể thay đổi nó thành dàn với sự kết hợp của ghépdải . Bắt đầu bằng cách cập nhật lên bộ thay đổi tổ tiên nơi mà sự kỳ thị đã chuyển hướng. Tạo nhánh dàn và ghép từng cam kết từ stiging đến staging. Dàn dựng bây giờ nên là một bản sao của stiging. Cuối cùng, tiêu diệt stiging bằng cách tước cam kết đầu tiên của nó.

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch

1
Đối với bước 3, bạn có thể sử dụnghg graft {first changeset in stiging}..{stiging head}
KCD
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.