Là lịch sử phiên bản thực sự thiêng liêng hay là tốt hơn để nổi loạn?


26

Tôi đã luôn đồng ý với câu thần chú 1 của Mercurial , tuy nhiên, bây giờ Mercurial đi kèm với phần mở rộng rebase và đó là một thực tiễn phổ biến trong git, tôi tự hỏi liệu nó có thực sự được coi là một "thực hành xấu" hay ít nhất là đủ xấu để tránh sử dụng. Trong mọi trường hợp, tôi nhận thức được việc nổi loạn là nguy hiểm sau khi đẩy.

OTOH, tôi thấy quan điểm của việc cố gắng gói 5 lần cam kết trong một lần duy nhất để làm cho nó trông gọn gàng hơn (đặc biệt là trong một chi nhánh sản xuất), tuy nhiên, cá nhân tôi nghĩ rằng sẽ tốt hơn khi có thể thấy một phần cam kết với một tính năng trong đó một số thử nghiệm đã được thực hiện, ngay cả khi nó không tiện lợi, nhưng nhìn thấy một cái gì đó như "Đã thử làm theo cách X nhưng nó không tối ưu như Y sau tất cả, làm Z lấy Y làm cơ sở" thì IMHO có giá trị tốt đối với những người đang nghiên cứu cơ sở mã hóa và theo dõi các nhà phát triển tư tưởng.

Quan điểm rất quan điểm của tôi (như trong câm, nội tạng, thiên vị) là các lập trình viên thích nổi loạn để che giấu sai lầm ... và tôi không nghĩ rằng điều này tốt cho dự án.

Vì vậy, câu hỏi của tôi là: bạn có thực sự thấy có giá trị khi có những "cam kết hữu cơ" như vậy (tức là lịch sử không bị làm phiền) trong thực tế không?, Hoặc ngược lại, bạn có thích chạy vào các cam kết được đóng gói cẩn thận và coi thường quá trình thử nghiệm của các lập trình viên không?; bạn chọn cái nào, tại sao nó lại phù hợp với bạn? (có các thành viên khác trong nhóm để giữ lịch sử, hoặc cách khác, đánh bại nó).


1 cho mỗi phân tích DVCS của Google , trong "Lịch sử là thiêng liêng" của Mercurial.


bạn có thể cung cấp tài liệu tham khảo đến nơi được tuyên bố là "Thần chú của Mercurial" không?
gnat

Bây giờ bạn đã đề cập đến nó, tôi nghĩ rằng nó thực sự xuất phát từ phân tích DVCS của Google code.google.com/p/support/wiki/DVCSAnalysis (nhưng những gì còn lại thực tế)
dukeofgaming

Câu trả lời:


22

Các Lịch sử là thiêng liêng, là hiện tại không phải là. Bạn có thể chia "cây" DVCS của mình thành hai phần:

  • Quá khứ / lịch sử chứa một cái nhìn chính xác về cách bạn đã đạt đến trạng thái hiện tại của mã. Phần này của lịch sử phát triển theo thời gian

  • Hiện tại phần nào bạn đang làm việc để làm cho mã của bạn phát triển. Mẹo này hầu hết các phần của lịch sử luôn có cùng kích thước.

Mỗi mã bạn phát hành hoặc sử dụng bằng cách nào đó là một phần của quá khứ . Quá khứ là thiêng liêng vì bạn cần có khả năng tái tạo một thiết lập hoặc hiểu những gì đã đưa ra hồi quy. Bạn sẽ không bao giờ viết lại quá khứ . Trong git bạn thường không bao giờ viết lại bất cứ điều gì một khi nó là chủ: chủ là phần quá khứ của lịch sử. Trong Mercurial, bạn có khái niệm giai đoạn công khai này theo dõi phần quá khứ của "cây" của bạn và thực thi tính bất biến của nó.

Phần hiện tại của mã là bộ thay đổi mà bạn hiện đang làm việc. Nhánh tính năng mà bạn đang cố gắng để có thể sử dụng được, không có lỗi và được cấu trúc lại đúng cách. Nó là hoàn toàn tốt để viết lại nó thậm chí là một ý tưởng tốt bởi vì nó làm cho phần quá khứ đẹp hơn, đơn giản và có thể sử dụng. Mercurial theo dõi điều này trong giai đoạn dự thảo .

Vì vậy, có, xin vui lòng rebase nếu nó cải thiện lịch sử của bạn. Mercurial sẽ ngăn bạn tự bắn vào chân mình nếu bạn đang nổi loạn những thứ bạn không nên.


Bây giờ, tôi thích câu trả lời của bạn hơn
dukeofgaming

7

Không phải tất cả các lỗi đều thuộc loại mà bạn cần che giấu - ví dụ, tôi đã vô tình phạm một tệp nhị phân vào repo của mình. Việc giả mạo lịch sử chỉ xấu khi lỗi không chỉ thuộc về lịch sử, giống như các tệp đã cam kết không nên có.


1
Vì vậy, bạn sẽ không bao giờ nổi loạn để thực hiện một cam kết "hợp lý" hơn?
dukeofgaming

7

Việc xem xét mã dễ dàng hơn rất nhiều khi có một thay đổi lớn gắn kết trái ngược với rất nhiều thay đổi nhỏ phụ thuộc.

Khi tôi làm việc trên một tính năng mới, tôi muốn thực hiện nhiều thay đổi nhỏ trong chi nhánh của mình. Khi tôi sẵn sàng gửi bản vá, tôi thu gọn các cam kết nhỏ đó thành một cam kết lớn đại diện cho tất cả các mã mới cần thiết cho tính năng đó. Đây là nơi rebase có ích.

Mặt khác, rebase không được khuyến khích nếu các cam kết không liên quan gì đến nhau. Nhiều tính năng bổ sung phải là các cam kết riêng biệt (và lý tưởng nhất là đến từ các nhánh riêng biệt).


4
có rất nhiều công cụ giúp đánh giá mã về nhiều thay đổi liên quan khá tầm thường, vì vậy, riêng tôi, tôi không mua nó như một câu trả lời
jk.

4
Làm thế nào có sự khác biệt giữa việc xem xét sự khác biệt giữa sửa đổi cơ sở và sửa đổi hoàn chỉnh tính năng và xem xét cam kết duy nhất của bộ cam kết dựa trên đó? Nó sẽ trông giống hệt nhau nếu cơ sở lại thực hiện đúng công việc!
Đánh dấu gian hàng

3
Những gì bạn mô tả ở đây đi ngược lại với lời khuyên trong wiki Mercurial . Thay đổi nhỏ "rõ ràng chính xác" được ưa thích để đánh giá. Thu gọn một nhánh tính năng vào một bộ thay đổi không bình thường trong Mercurial - Tôi đã thấy nó được đề xuất thường xuyên hơn trong Git, nơi git rebase -icho phép bạn thực hiện việc này một cách dễ dàng và có chọn lọc. Tương đương Mercurial gần nhất là histedit .
Martin Geisler

9
Tôi hoàn toàn không đồng ý. Vài năm gần đây, chúng tôi đã sử dụng một công cụ để đánh giá mã và không có gì tôi ghét hơn khi nhận được hơn 30 thay đổi tệp lớn được gửi để xem xét. Nó dễ dàng hơn rất nhiều để có được nhiều thay đổi nhỏ. Ví dụ, tôi đã đổi tên lớp này thành xyz vì nó phản ánh tốt hơn trách nhiệm đã sửa đổi. Tôi đã thêm phương thức nn vì tôi sẽ cần nó cho blah. Dễ dàng hơn nhiều để xử lý các đánh giá nhỏ hơn.
Pete

3
Tôi đã nghe ý tưởng này khá nhiều trong cộng đồng git về việc sụp đổ rất nhiều cam kết thành một trước khi bạn chuyển sang repo chính thức, nhưng điều này chưa bao giờ hữu ích với tôi. Tôi muốn có nhiều cam kết nhỏ hơn với các thông điệp có ý nghĩa. Như những người khác đã lưu ý, bạn có thể thực hiện một khác biệt trên nhiều thay đổi.
Chris Sutton

4

Câu hỏi của bạn mô tả lịch sử như một tập hợp các thay đổi mã được đặt hàng và hỏi liệu hữu cơ có cam kết các độc giả tương lai trong quá trình phát triển hay không. Tuy nhiên, là một kỹ sư phát hành / tích hợp, tôi thường không nghĩ về lịch sử như là mã. Tôi mải mê hơn với câu chuyện mà lịch sử của tôi kể, kiến ​​thức về thể chế mà nó vẫn giữ được, và liệu nó có cho phép tôi nhanh chóng gỡ lỗi không.

Tôi không nghĩ rằng các quy trình công việc hữu cơ làm tốt điều này, ngay cả của riêng tôi. Những phẩm chất tôi đánh giá cao về DVCS khi tôi mã hóa - các chi nhánh giá rẻ, cam kết nhanh, tiết kiệm từ xa sớm và thường xuyên - không phải là những gì tôi đánh giá là người quản lý tích hợp của công ty tôi . Tôi vấn đề git rebase, git merge, git diff, và git applyđến nay thường xuyên hơn trong vai trò đó hơn git addhoặc git commit. Các công cụ như rebasecho phép tôi chuyển đổi mã tôi được cung cấp từ thứ gì đó có chức năng thành thứ có thể được duy trì.

Cam kết phi logic hoặc mơ hồ không hữu ích, nhưng chúng rất dễ viết một cách hữu cơ, khi mối quan tâm chính là làm cho mã hoạt động, không phân phối nó cho người khác. Cam kết thích Case 15: Fixed a problem, hoặc Refactored <cranky legacy feature>làm cho bảo trì của tôi tự co rúm, ngay cả khi tôi tác giả chúng. Tuy nhiên, không có gì gây ra cơn thịnh nộ như cam kết "gia tăng". Hãy xem xét chi nhánh chủ đề này một nhà phát triển đưa cho tôi vào một ngày khác:

$ git log production..topic --oneline
f9a1184 incremental update
156d299 incremental commits
e8d50b0 new incremental updates
511c18c incremental updates, refactor
1b46217 incremental upgrade
9e2b3b8 incremental update
fa68a87 incremental update

Những điều này là Ác. Nó giống như DVCS được thiết kế cho Tiến sĩ Faustus. Tôi sẽ cung cấp cho bạn kiểm soát nguồn nhanh chóng và dễ dàng. Bạn cho tôi là linh hồn duy trì mã của bạn. Tất cả các cam kết lười biếng là hành vi ích kỷ. Nhiều người trong chúng ta viết chúng, nhưng chúng ta cũng nợ tương lai của chúng ta một lịch sử logic, có thể nhân rộng, có thể sửa lỗi. Chúng ta không thể làm điều đó mà không có cách nào để rebase.

Đối với các thử nghiệm thất bại, tại sao không mô tả chúng trong các thông điệp cam kết (mới nguyên sơ) của chúng tôi? Một năm kể từ bây giờ tôi không cần một đoạn hoàn thành một nửa. Tôi chỉ muốn một bản ghi về nỗ lực bị hủy bỏ, và có lẽ là một lời giải thích ngắn nếu tôi nghĩ rằng tôi đủ ngu ngốc để thử lại. Có rất nhiều quy trình làm việc thành công trên thế giới, nhưng tôi đang đấu tranh để nghĩ ra bất kỳ lý do nào mà tôi cố tình cam kết mã bị hỏng cho một cơ sở mã sản xuất.


Câu trả lời rất hay, động lực rõ ràng về lý do tại sao phải
nổi loạn

2

Không có gì nên thiêng liêng, nhưng hãy chắc chắn rằng bạn có lý do chính đáng cho những gì bạn đang làm. Rebasing cực kỳ mạnh mẽ khi được sử dụng đúng cách, nhưng như với bất kỳ công cụ mạnh mẽ nào, nó có thể gây nhầm lẫn và gây ra vấn đề nếu sử dụng bất cẩn.

Cá nhân tôi thấy rất hữu ích khi khởi động lại một nhánh tính năng cục bộ dựa vào thân cây (hoặc nhánh phát triển chính) trước khi chạy các thử nghiệm cuối cùng và hợp nhất tính năng này vào nhánh chính. Bằng cách đó tôi có thể đối phó với bất kỳ xung đột hợp nhất, vv trước khi thực sự hợp nhất.


1

IMHO, thí nghiệm thường thuộc về kệ hoặc các nhánh tạm thời, không phải đường cơ sở. Nếu bạn làm theo điều này, sẽ không có vấn đề gì, vì tất cả các cam kết sẽ hợp lý và thêm một số giá trị.


Những gì bạn đang nói là bạn thích các nhánh làm việc hơn là chỉnh sửa một nhánh cơ sở (ví dụ: master / default, sản xuất / phát hành, vX.X, v.v.)?
dukeofgaming
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.