Tôi là một người dùng git bối rối bởi sự phân nhánh của mercurial. Làm thế nào tôi có thể theo dõi những thay đổi nhỏ?


32

Trước đây tôi đã luôn sử dụng git, nhưng tôi muốn đóng góp cho python nên bây giờ tôi phải học cách đồng bóng và tôi thấy nó rất bực bội.

Vì vậy, tôi đã tạo ra một vài bản vá nhỏ và tôi muốn theo dõi chúng như những cam kết trong kho lưu trữ đồng bóng địa phương của mình. Rõ ràng có 4 cách để xử lý phân nhánh trong đồng bóng . 1 và 4 trông hoàn toàn lố bịch đối với tôi, các nhánh được đặt tên dường như rất nặng và tôi cảm thấy rằng tôi không nên sử dụng chúng để sửa lỗi 1 cam kết nhanh chóng, vì vậy tôi đã sử dụng dấu trang.

Bây giờ, bản vá của tôi bị từ chối và tôi muốn xóa một trong các nhánh đánh dấu của mình khỏi kho lưu trữ của tôi. OK, trong git tôi sẽ chỉ xóa chi nhánh của mình và quên nó đi, vì vậy tôi xóa bookmark của mình và bây giờ tôi gặp vấn đề sau:

  • TortoiseHG và hg logvẫn cho thấy rằng cam kết và defaultchi nhánh có 2 đầu. Và nếu tôi hiểu chính xác, bạn không thể xóa các xác nhận trong hg mà không cần bổ sung.

  • Mercurial không chỉ băm, mà còn sửa đổi số. Khi tôi đã thêm một vài cam kết của riêng mình, tất cả các cam kết được thực hiện sau đó có các số sửa đổi khác nhau từ repo trung tâm chính.

  • Tôi làm hg updatesau khi kéo để di chuyển masterdấu trang của mình sang cam kết mới nhất một cách tự động, nhưng tôi không thể tìm ra cách để làm điều đó trong TortoiseHG.

Tôi đang làm gì sai? Đây có phải là bình thường và dự kiến ​​và tôi chỉ nên bỏ qua những vấn đề này? Hoặc làm thế nào tôi phải làm việc với các chi nhánh của tôi?

Câu trả lời:


22

Cá nhân, đối với kịch bản của bạn, tôi thậm chí không bận tâm đến việc tạo một chi nhánh, trừ khi tôi đang thực hiện nhiều thay đổi, mỗi thay đổi sẽ cần được các nhà phát triển cốt lõi chấp nhận.

Chỉ cần sao chép kho lưu trữ của họ và làm việc trong đó, sau đó thực hiện một yêu cầu kéo.

Nếu tôi sử dụng một nhánh thì tôi muốn sử dụng các nhánh có tên. Chúng được thiết kế cho mục đích chính xác này, trong đó dấu trang không. Tôi không thấy lý do tại sao bạn coi nó nặng.

Mercurial có cả một trang trên wiki của họ mô tả các cách khác nhau của " Cắt tỉa các nhánh chết ". Tùy chọn "Sử dụng bản sao" sẽ đáp ứng yêu cầu của bạn.

Để trả lời các vấn đề cụ thể hơn của bạn ...

Nhật ký rùaHG và hg vẫn hiển thị rằng nhánh cam kết và mặc định có 2 đầu. Và nếu tôi hiểu chính xác, bạn không thể xóa các xác nhận trong hg mà không cần bổ sung.

Đây là một lỗi tôi đã mắc phải với Mercurial khi tôi chưa quen với nó. Đừng sợ những plugin bổ sung đó. Một số trong số chúng là các công cụ rất mạnh và thường sau đó chúng bị kéo vào sản phẩm cốt lõi. Đó chỉ là cách Mercurial hoạt động. Nếu bạn cần một cái để thực hiện một nhiệm vụ cụ thể, hãy lấy nó và sử dụng nó.

Lịch sử sửa đổi được coi là một điều tồi tệ trong thế giới Mercurial, vì vậy sản phẩm vanilla không phải lúc nào cũng có mọi thứ mà người dùng Git nghĩ rằng nó nên có, nhưng có rất nhiều plugin cho những người muốn sử dụng ứng dụng nhưng có những ưu tiên khác nhau.

Mercurial không chỉ băm, mà còn sửa đổi số. Khi tôi đã thêm một vài cam kết của riêng mình, tất cả các cam kết được thực hiện sau đó có các số sửa đổi khác nhau từ repo trung tâm chính.

Đừng lo lắng về số sửa đổi. Họ là một vấn đề thuận tiện, không còn nữa. Mã băm là các định danh quan trọng sẽ chuyển từ repo sang repo. Số sửa đổi không nhất quán trên các repositiories. Kiểm tra Hg Ban đầu để có một lời giải thích tốt.

Số sửa đổi chỉ là một phím tắt tiện dụng và dễ nhớ hơn khi làm việc với một repo duy nhất.

Tôi thực hiện cập nhật hg sau khi kéo để di chuyển dấu trang chính của mình sang cam kết mới nhất, nhưng tôi không thể tìm ra cách nào để thực hiện điều đó trong TortoiseHG.

Khi sử dụng TortoiseHG, hãy sử dụng Bàn làm việc thay vì các công cụ khác. Tất cả mọi thứ (gần như) đều ở trong đó. Cập nhật là trong các menu ngữ cảnh sửa đổi. Nó không phải lúc nào cũng trực quan, nhưng có một hướng dẫn tốt ở liên kết ở trên và khi bạn đã quen với nó, cuối cùng bạn sẽ nhấp vào với sự từ bỏ tự tin.


Tôi chắc chắn đã thấy lập luận trước rằng các nhánh có tên thích hợp có nghĩa là lịch sử chỉnh sửa ít cần thiết hơn trong hg
jk.

9

Rõ ràng có 4 cách để xử lý phân nhánh trong đồng bóng. 1 và 4 trông hoàn toàn lố bịch đối với tôi, những nhánh được đặt tên có vẻ nặng

Trong Mercurial, bạn không tạo chi nhánh. Mỗi cam kết thực sự là một nhánh, bất kỳ cam kết nào cũng có thể có nhiều cha mẹ và nhiều con. Vì vậy, đó là bốn cách khác nhau để tổ chức cùng một thực thể.

Bạn có thể đặt cho chúng những cái tên khác nhau, bạn không cần phải có , nhưng đó là một ý tưởng hay. Không có gì nặng nề về các nhánh được đặt tên - đó chỉ là một số siêu dữ liệu bổ sung. Cá nhân tôi thích các chi nhánh được đặt tên hơn bất cứ điều gì khác trong mọi tình huống.

Nhật ký rùaHG và hg vẫn hiển thị rằng nhánh cam kết và mặc định có 2 đầu.

Đó chính xác là lý do để sử dụng các chi nhánh được đặt tên thay vì bỏ mọi thứ vào default.

Và nếu tôi hiểu chính xác, bạn không thể xóa các xác nhận trong hg mà không cần bổ sung.

Bạn thực sự không thể xóa bất cứ thứ gì trong Mercurial và bạn không nên . Bạn có thể sử dụng hg stripnhưng nó không được đăng nhập - về cơ bản, bạn chỉ cần cắt bỏ một phần của repo địa phương. Bạn không thể đẩy nó và nếu bạn lấy từ một repo có nhánh bạn tước tại địa phương, nó sẽ quay trở lại.

Mercurial không chỉ băm, mà còn sửa đổi số. Khi tôi đã thêm một vài cam kết của riêng mình, tất cả các cam kết được thực hiện sau đó có các số sửa đổi khác nhau từ repo trung tâm chính.

Con số không có nghĩa gì cả. Bạn có thể coi thường họ nếu họ làm bạn bối rối.

Tôi thực hiện cập nhật hg sau khi kéo để di chuyển dấu trang chính của mình sang cam kết mới nhất, nhưng tôi không thể tìm ra cách nào để thực hiện điều đó trong TortoiseHG.

Tôi chưa sử dụng TortoiseHG nhưng hg pull -usẽ làm cả hai pullupdate.

Trước đây tôi đã luôn sử dụng git, nhưng tôi muốn đóng góp cho python nên bây giờ tôi phải học cách đồng bóng và tôi thấy nó rất bực bội.

Không sao, nhiều người dùng Mercurial cũng cảm thấy như vậy về Git (bao gồm cả tôi).


6

Ngay cả khi Mercurial và Git giống nhau, chúng có các thiết kế khác nhau, có thể là sự khác biệt quan trọng nhất về thiết kế là trong Mercurial sửa đổi lịch sử không linh hoạt như trong git (vì nó không được khuyến khích).

Câu trả lời ngắn : không thành vấn đề nếu bạn có một lượng thay đổi nhỏ, bạn vẫn có thể sử dụng một chi nhánh. Nếu bạn đang suy nghĩ về việc xóa chi nhánh đó thì hãy sử dụng một dấu trang để bạn có thể xóa nó sau đó và loại bỏ các thay đổi sau đó.

Đầu tiên, cố gắng làm sáng tỏ một số điều bạn đề cập:

  • 1 và 4 được coi là phân nhánh là bởi vì mỗi khi bạn cam kết, bạn đang tạo ra một nhánh không tên một cách hiệu quả (nếu có một cam kết khác cùng lúc tại nguồn / repo may mắn của bạn), về mặt kỹ thuật là một nhánh. Trong phương pháp 4, bạn đang tạo một "đầu" mới trong khi ở phương pháp 1 thì không . Người đứng đầu được cho là sẽ được sáp nhập. Tôi đồng ý rằng phương pháp 1 là loại ngớ ngẩn, nhưng một số dường như thích nó ... cho các dự án nhỏ, tôi đoán.

  • Về phương pháp 2, không phải là các nhánh nặng, mà là chúng là vĩnh viễn . Bạn không thể xóa một nhánh trừ khi bạn sử dụng một cái gì đó như phần mở rộng dải. Một lần nữa, triết lý thiết kế của Mercurial không hướng tới việc sửa đổi lịch sử (nhưng nó đã trở nên tốt hơn ở đó).

  • Về số sửa đổi , chúng chỉ là một tài liệu tham khảo địa phương và dễ đọc hơn cho bạn để sử dụng tất cả các lệnh phải làm với các phiên bản. Nếu bạn thích sử dụng băm, bạn vẫn có thể làm. Số sửa đổi chỉ là một phím tắt và bị Mercurial coi thường cho bất kỳ hoạt động nội bộ nào giữa các kho khác nhau.

Bây giờ, để trả lời các câu hỏi khác của bạn:

  • Bạn có thể kiểm tra những cái đầu bạn có hg heads, nếu bạn thấy 2+ đầu trong một nhánh có tên duy nhất, tốt nhất là chúng được hợp nhất. Đó có lẽ là nơi đánh dấu của bạn .
  • Để loại bỏ một bản sửa đổi bạn vừa thực hiện, bạn có thể làm hg rollback, nhưng tôi đoán đây không phải là trường hợp.
  • Để xóa bookmark chỉ cần làm hg bookmark --delete yourbookmark
  • Bạn sẽ rất vui khi dễ dàng cắt cành trong lịch sử. Nhìn vào phần mở rộng Rebasethao tác Dải .
  • Mercurial đã đi kèm với một số tiện ích mở rộng, nhưng chúng không được kích hoạt theo mặc định . Chỉ cần vào bất kỳ thư mục nào và nhấp chuột phải vào bất kỳ đâu để có menu ngữ cảnh TortoiseHG, đi vào Cài đặt toàn cầu và sau đó là Tiện ích mở rộng: kích hoạt tiện ích mở rộng MQ và tiện ích mở rộng Rebase. Điều này không làm hỏng tính tương thích giữa các kho lưu trữ.
  • Bây giờ bạn đang ở đây, bạn có thể:
    • Dải nơi dấu trang của bạn bắt đầu (điều này có thể khắc phục vấn đề của bạn)
    • Để dễ hình dung hơn, có thể bạn có thể khởi động lại các thay đổi của mình ở phía trước và sau đó loại bỏ chúng sau đó. Tôi chỉ đề cập đến rebase bởi vì nó có thể là một cái gì đó hữu ích cho bạn một thời gian khác.

Ngoài ra, trong git, bạn có thể có "các nhánh cục bộ riêng tư" vì bạn phải đẩy chúng rõ ràng và bạn có thể xóa chúng sau đó. Trong Mercurial, bạn đẩy tất cả những gì bạn có , tuy nhiên, nếu bạn muốn tránh điều này, bạn có thể sử dụng tính năng Phađánh dấu một tập hợp các sửa đổi là bí mật . Sửa đổi bí mật sẽ không được đẩy.

Cuối cùng, bạn không làm gì sai cả , chỉ cần lưu ý rằng chúng chỉ là những công cụ khác nhau được xây dựng với những suy nghĩ hơi khác nhau, điều này khá sôi nổi: sửa đổi lịch sử (git) hoặc không sửa đổi lịch sử (hg). Trong Mercurial, khó hơn là tự bắn vào chân mình để sửa đổi lịch sử (đặc biệt với các Pha) và đó là lý do tại sao một số người thích nó hơn git .


Không có cách nào để đảm bảo rằng tất cả các bản sao thay đổi phi tập trung ghi lại một nhánh có tên đã bị xóa sau khi thực hiện hg strip. Tôi đoán người ta có thể tranh luận tương tự về các bản sao phi tập trung của tên chi nhánh Git, ngoại trừ sự phân biệt các nhánh được đặt tên có một không gian tên toàn cầu và tên nhánh Git thì không. Và nhiều cái đầu tồn tại vì các nhánh tên. Đây là một lỗi thiết kế truyền nhiễm cho một VCS phi tập trung.
Shelby Moore III

1

Tôi tìm thấy với đồng bóng nó dễ nhất không phải lo lắng về các chi nhánh. Tôi chỉ tìm thấy nơi trong lịch sử mà tôi muốn chỉnh sửa và tạo các cam kết theo yêu cầu (còn gọi là các nhánh ẩn danh). Đôi khi dấu trang có thể hữu ích nếu tôi phải nhảy giữa các đầu trong các bối cảnh khác nhau nhưng thường thì tôi không bận tâm đến chúng. Các nhánh được đặt tên là OK cho các nhánh tồn tại lâu (các nhánh sửa lỗi, các nhánh dự án) nhưng đối với các bản sửa lỗi 1- hoặc 2 cam kết, chúng không phải là công cụ phù hợp cho công việc.

Thủ thuật với các nhánh ẩn danh là đặt pha của chúng thành "bí mật" nếu bạn không muốn đẩy chúng tức là nếu bạn muốn giữ chúng cục bộ. Nếu bạn thực sự muốn đẩy chúng, nhưng bạn không muốn có thêm bất kỳ cam kết nào dựa trên chúng, bạn chỉ cần đặt một "- bao vây" trên đầu chúng, điều đó có nghĩa là chúng không còn xuất hiện trong danh sách 'đầu' và đồng bóng sẽ ngừng phàn nàn về nhiều người đứng đầu trên chi nhánh đó.


-1

Tôi nghĩ rằng chúng ta chỉ có thể sử dụng bookmark thay vì chi nhánh; dù sao chúng tôi vẫn sẽ tiếp tục hỗ trợ sản phẩm và việc sáp nhập hai chi nhánh trong một thời gian dài sẽ là vấn đề đau đầu.

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.