Làm thế nào thường xuyên để cam kết thay đổi để kiểm soát nguồn? [đóng cửa]


204

Bao lâu tôi nên cam kết thay đổi để kiểm soát nguồn? Sau mỗi tính năng nhỏ, hay chỉ cho các tính năng lớn?

Tôi đang làm việc trên một dự án và có một tính năng dài hạn để thực hiện. Hiện tại, tôi đang cam kết sau mỗi khối công việc, tức là mọi tính năng phụ được triển khai và sửa lỗi. Tôi thậm chí còn cam kết sau khi tôi đã thêm một đoạn thử nghiệm mới cho một số tính năng sau khi phát hiện ra lỗi.

Tuy nhiên, tôi lo ngại về mô hình này. Trong một ngày làm việc hiệu quả, tôi có thể thực hiện 10 lần cam kết. Vì tôi đang sử dụng Subversion, những cam kết này ảnh hưởng đến toàn bộ kho lưu trữ, vì vậy tôi tự hỏi liệu thực sự có nên thực hiện nhiều thứ không?


1
Man, câu hỏi này không dựa trên ý kiến, và là một câu hỏi hoàn toàn hợp lệ với câu trả lời thích hợp. Cam kết là một số kỹ năng quan trọng, ý tưởng là bạn phải cam kết một tính năng / tính năng / hotFix hoạt động ổn định và ổn định mà bạn đã thêm trong cơ sở mã của mình bao gồm các thông báo cam kết mô tả. nếu cuối ngày và bạn muốn rời đi, bạn không thể phạm một mã bị hỏng và nói rằng bạn sẽ sửa nó vào ngày mai, bởi vì tốt hơn là sử dụng rebase cùng với việc hợp nhất để giữ các cam kết và tin nhắn quan trọng và xóa sạch những thứ không cần thiết, nếu bạn chỉ muốn giữ trạng thái tạm thời, bạn phải sử dụng git stash
Eric

Để tránh sự mơ hồ, nếu trong một số tình huống cụ thể bạn cần phải cam kết và đẩy mã chưa hoàn thành, sau khi bạn quay lại và muốn tiếp tục chi nhánh đó một lần nữa, khi bạn hoàn thành điều bạn phải sửa đổi cam kết chưa hoàn thành trước đó và sau đó đẩy nó. Điều này hoàn toàn phụ thuộc vào bạn làm thế nào để giữ cho cây làm việc của bạn sạch sẽ và hữu ích cho việc hồi tưởng nhưng tin hay không khi tìm và khắc phục các lỗi rất ẩn hoặc tinh vi hoặc các chức năng kém là một trợ giúp rất lớn nếu bạn có cây làm việc chuyên nghiệp và sạch sẽ khi bạn muốn sử dụng các công cụ gỡ lỗi git như - git blame hoặc git bisect
Eric

Câu trả lời:


196

Bất cứ khi nào tôi hoàn thành một "suy nghĩ đầy đủ" về mã biên dịch và chạy tôi đăng ký. Điều này thường kết thúc ở bất cứ đâu trong khoảng 15-60 phút. Đôi khi nó có thể dài hơn, nhưng tôi luôn cố gắng kiểm tra nếu tôi có nhiều thay đổi mã mà tôi không muốn viết lại trong trường hợp thất bại. Tôi cũng thường đảm bảo mã của tôi biên dịch và tôi đăng ký vào cuối ngày làm việc trước khi về nhà.

Tôi sẽ không lo lắng về việc thực hiện "quá nhiều" cam kết / đăng ký. Nó thực sự hấp dẫn khi bạn phải viết lại một cái gì đó, và thật tuyệt khi có thể quay ngược lại theo từng bước nhỏ trong trường hợp.


3
Xác suất phá vỡ công trình với cách tiếp cận như vậy tăng lên đáng kể. Coi chừng, nếu bạn không có các bài kiểm tra tự động xác thực đăng ký của bạn - mọi người sẽ gõ cửa nhà bạn vì bạn đã chặn chúng.
Alex Weinstein

57
Xác suất phá vỡ bản dựng với cách tiếp cận như vậy sẽ không tăng nếu bạn sử dụng hệ thống kiểm soát phiên bản phân tán.
Skiphoppy

24
Mặc dù số lần phá vỡ bản dựng tăng lên với các lần xác nhận thường xuyên hơn, lượng thời gian để sửa lỗi bị thu hẹp lại và do đó thời gian bị mất từ ​​các lần xác nhận hoàn tác. Cam kết thường xuyên cũng dẫn đến nhiều lợi ích khác. Nếu tôi phá vỡ bản dựng, tôi hy vọng sẽ phá vỡ nó sớm và với một cam kết nhỏ để tôi có thể khắc phục nhanh chóng.
jyoungdev

26
Và nếu bạn đang thực hiện công việc có giá trị trong 2 tuần, bạn không muốn đi sâu vào một cam kết lớn để xem bit nào đã phá vỡ bản dựng. Cam kết thường xuyên cho phép bạn cách ly các vấn đề với một cơ sở mã nhỏ hơn nhiều vì bạn chỉ biết một chút mã đã thay đổi.
Steven Spneum

1
@MikeJ Tất cả phụ thuộc vào cách bạn đang sử dụng Kiểm soát nguồn. Ngoài ra, nếu bạn đang sử dụng một cái gì đó như Git và làm việc trong Chi nhánh của riêng bạn, thì bạn sẽ không ảnh hưởng đến Bản dựng cho các thành viên khác trong nhóm hoặc thậm chí là đường ống CI / CD.
Chris Pietschmann

82

Khi bạn nói rằng bạn lo ngại rằng "các cam kết của bạn ảnh hưởng đến toàn bộ kho lưu trữ" --- bạn có đang đề cập đến thực tế là toàn bộ số sửa đổi của kho lưu trữ tăng không? Tôi không biết Subversion sử dụng bao nhiêu bit để lưu trữ nó, nhưng tôi khá chắc chắn rằng bạn sẽ không hết số sửa đổi! Nhiều cam kết không phải là một vấn đề. Bạn có thể cam kết gấp mười lần so với anh chàng bên cạnh và bạn sẽ không tăng lượng khí thải carbon của mình.

Một chức năng hoặc phương thức duy nhất nên được đặt tên cho những gì nó làm, và nếu tên quá dài, nó đang làm quá nhiều. Tôi cố gắng áp dụng quy tắc tương tự cho đăng ký: nhận xét đăng ký sẽ mô tả chính xác những gì thay đổi thực hiện và nếu nhận xét quá dài, có lẽ tôi sẽ thay đổi quá nhiều cùng một lúc.


1
Tôi thích tuyên bố của bạn. Nếu bạn cam kết mười lần như thường lệ, sẽ không có vấn đề gì cả (nhưng có khả năng sẽ xảy ra nếu bạn cam kết 1/10 số lần bạn làm).
Camilo Martin


24

Cá nhân tôi cam kết mọi nhóm mã hợp lý đã hoàn thành / ổn định / biên dịch và cố gắng không rời khỏi ngày mà không cam kết những gì tôi đã làm ngày hôm đó.


20

Nếu bạn đang thực hiện các thay đổi lớn và lo ngại về việc ảnh hưởng đến những người khác làm việc với mã, bạn có thể tạo một nhánh mới và sau đó hợp nhất trở lại vào thân cây sau khi các thay đổi của bạn hoàn tất.


12

Tôi cam kết mọi lúc tôi hoàn thành một nhiệm vụ. Điều đó thường mất 30 phút đến 1 giờ.


12

Nếu nhận xét kiểm soát phiên bản của bạn dài hơn một hoặc hai câu, có lẽ bạn không cam kết thường xuyên đủ.


7
Và nếu nó ít hơn, có lẽ bạn không bình luận đúng.
JD Isaacks

11

Tôi làm theo câu thần chú nguồn mở (diễn giải) - cam kết sớm, cam kết thường xuyên.

Về cơ bản bất cứ khi nào tôi nghĩ rằng tôi đã thêm chức năng hữu ích (tuy nhỏ) mà không gây ra sự cố cho các thành viên khác trong nhóm.

Chiến lược cam kết thường này đặc biệt hữu ích trong các môi trường tích hợp liên tục vì nó cho phép thử nghiệm tích hợp chống lại các nỗ lực phát triển khác, giúp phát hiện sớm các vấn đề.


10

Đừng cam kết mã không thực sự hoạt động. Đừng sử dụng kho lưu trữ của bạn như một giải pháp sao lưu.

Thay vào đó, hãy sao lưu mã không đầy đủ của bạn cục bộ theo cách tự động. Time Machine chăm sóc tôi và có rất nhiều chương trình miễn phí cho các nền tảng khác.


25
Hoặc tạo một nhánh. Đó là những gì họ đang ở đó.
Brian Carlton

2
Kiểm soát phiên bản nhằm ngăn chặn dữ liệu bị mất hoặc sao lưu. Nhưng nó cũng không có ý định là thùng rác. Chỉ mã được biên dịch nên được cam kết, nhưng tính năng không nhất thiết phải được hoàn thành để thực hiện cam kết.
jmort253

8

Quy tắc ngón tay cái mà tôi sử dụng là đăng ký khi nhóm tệp được đăng ký có thể được bao phủ bởi một nhận xét đăng ký duy nhất.

Điều này thường để đảm bảo rằng các đăng ký là nguyên tử và các ý kiến ​​có thể dễ dàng được tiêu hóa bởi các nhà phát triển khác.

Điều này đặc biệt đúng khi các thay đổi của bạn ảnh hưởng đến tệp cấu hình (chẳng hạn như tệp ngữ cảnh mùa xuân hoặc tệp cấu hình struts) có phạm vi rộng ứng dụng. Nếu bạn thực hiện một số 'nhóm' thay đổi trước khi đăng nhập, tác động của chúng sẽ chồng lấp trong tệp cấu hình, khiến 2 nhóm trở nên hợp nhất với nhau.


7

Tôi không nghĩ bạn nên lo lắng quá nhiều về mức độ thường xuyên. Điều quan trọng ở đây là cái gì, khi nào và tại sao. Nói rằng bạn phải cam kết cứ sau 3 giờ hoặc cứ sau 24 giờ thực sự vô nghĩa. Cam kết khi bạn có một cái gì đó để cam kết, đừng nếu bạn không.

Đây là một trích xuất từ ​​các thực tiễn tốt nhất được đề nghị của tôi để kiểm soát phiên bản :

[...] Nếu bạn đang thực hiện nhiều thay đổi cho một dự án cùng một lúc, hãy chia chúng thành các phần hợp lý và cam kết chúng trong nhiều phiên. Điều này giúp việc theo dõi lịch sử thay đổi cá nhân dễ dàng hơn nhiều, điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian khi cố gắng tìm và sửa lỗi sau này. Ví dụ: nếu bạn đang triển khai tính năng A, B và C và sửa lỗi 1, 2 và 3, điều đó sẽ dẫn đến tổng cộng ít nhất sáu lần xác nhận, một cho mỗi tính năng và một cho mỗi lỗi. Nếu bạn đang làm việc trên một tính năng lớn hoặc thực hiện tái cấu trúc mở rộng, hãy xem xét chia công việc của bạn thành các phần nhỏ hơn và thực hiện cam kết sau khi hoàn thành mỗi phần. Ngoài ra, khi thực hiện các thay đổi độc lập cho nhiều mô-đun logic, hãy cam kết thay đổi riêng từng mô-đun, ngay cả khi chúng là một phần của thay đổi lớn hơn.

Tốt nhất, bạn không bao giờ nên rời khỏi văn phòng của mình với những thay đổi không được cam kết trên ổ cứng. Nếu bạn đang làm việc trên các dự án mà các thay đổi sẽ ảnh hưởng đến người khác, hãy xem xét sử dụng một nhánh để thực hiện các thay đổi của bạn và hợp nhất chúng trở lại vào thân cây khi bạn hoàn thành. Khi thực hiện các thay đổi đối với các thư viện hoặc dự án mà các dự án khác, và do đó, những người khác khác phụ thuộc vào, hãy đảm bảo bạn không phá vỡ các bản dựng của họ bằng cách cam kết mã không được biên dịch. Tuy nhiên, có mã không biên dịch không phải là lý do để tránh cam kết. Sử dụng các chi nhánh thay thế. [...]


6

Mô hình hiện tại của bạn có ý nghĩa. Hãy ghi nhớ cách bạn sử dụng kiểm soát nguồn này: nếu bạn phải quay lại hoặc nếu bạn muốn làm khác? Các đoạn mà bạn mô tả có vẻ giống hệt như sự khác biệt chính xác trong các trường hợp đó: diff sẽ cho bạn thấy chính xác những gì đã thay đổi trong việc thực hiện lỗi # (được chỉ định trong nhật ký đăng nhập) hoặc chính xác mã mới là gì để triển khai một tính năng. Tương tự, tương tự, sẽ chỉ chạm vào một điều tại một thời điểm.


6

Tôi cũng muốn cam kết sau khi tôi hoàn thành một khối công việc, thường là nhiều lần trong ngày. Tôi nghĩ rằng sẽ dễ dàng hơn để thấy những gì xảy ra trong các cam kết nhỏ hơn so với những gì lớn. Nếu bạn lo lắng về quá nhiều cam kết, bạn có thể xem xét việc tạo một nhánh và hợp nhất nó trở lại thân cây khi toàn bộ tính năng kết thúc.

Đây là một bài đăng trên blog có liên quan: Mã hóa kinh dị: Đăng ký sớm, thường xuyên đăng ký


+1 trên quan điểm của bạn về các cam kết nhỏ hơn giúp dễ theo dõi hơn. Không có gì tệ hơn một đoạn văn dài trong một cam kết CVS. Nó làm tổn thương mắt và đầu của bạn.
jmort253

4

Như những người khác đã tuyên bố, hãy cố gắng thực hiện một đoạn logic "đủ" để nó không đi theo cách của các nhà phát triển khác (ví dụ: nó xây dựng và vượt qua các bài kiểm tra tự động).

Mỗi nhóm / công ty phát triển phải xác định thế nào là "đủ hoàn thành" cho mỗi chi nhánh. Ví dụ: bạn có thể có các nhánh tính năng chỉ yêu cầu mã để xây dựng, một Trunk cũng yêu cầu mã để vượt qua các kiểm tra tự động và các nhãn chỉ ra điều gì đó đã vượt qua kiểm tra QA ... hoặc đại loại như thế.

Tôi không nói rằng đây là một mô hình tốt để làm theo; Tôi chỉ chỉ ra rằng việc "hoàn thành" như thế nào tùy thuộc vào chính sách của nhóm / công ty của bạn.


3

Khoảnh khắc bạn nghĩ về nó.

(miễn là những gì bạn đăng ký là an toàn)


3

Phụ thuộc vào hệ thống mã nguồn của bạn và những gì bạn có tại chỗ. Nếu bạn đang sử dụng Git, thì hãy cam kết bất cứ khi nào bạn hoàn thành một bước. Tôi sử dụng SVN và tôi muốn cam kết khi tôi hoàn thành toàn bộ tính năng, cứ sau một đến năm giờ. Nếu tôi đang sử dụng CVS, tôi cũng sẽ làm như vậy.


3

Tôi đồng ý với một số câu trả lời: không kiểm tra mã sẽ không biên dịch; sử dụng một nhánh hoặc kho lưu trữ cá nhân nếu mối quan tâm của bạn đang có một "bản sao lưu" của mã hoặc các thay đổi của nó; kiểm tra khi các đơn vị logic hoàn thành.

Một điều khác mà tôi muốn thêm là tùy thuộc vào môi trường của bạn, tỷ lệ đăng ký có thể thay đổi theo thời gian. Ví dụ, sớm trong một dự án kiểm tra sau khi từng phần chức năng của một thành phần hoàn thành có ý nghĩa cho cả sự an toàn và có lịch sử sửa đổi (tôi nghĩ về các trường hợp các bit trước đó được tái cấu trúc khi các phần sau được phát triển). Về sau, trong dự án, mặt khác, chức năng hoàn chỉnh trở nên quan trọng hơn, đặc biệt là trong quá trình phát triển / thử nghiệm tích hợp. Một nửa tích hợp hoặc nửa sửa chữa không giúp được ai.

Đối với việc kiểm tra sau mỗi lần sửa lỗi: trừ khi sửa lỗi là không đáng kể, hoàn toàn! Không có gì là đau đớn hơn là phát hiện ra rằng một kiểm tra có ba bản sửa lỗi và một trong số chúng cần được khôi phục. Thường xuyên hơn có vẻ như trong tình huống đó, nhà phát triển đã sửa ba lỗi trong một khu vực và giải quyết thay đổi nào đi đến sửa lỗi nào là một cơn ác mộng.


3

Tôi cũng thích kiểm tra thường xuyên. Đó là mỗi khi tôi hoàn thành một bước tiến tới mục tiêu của mình.

Điều này thường là cứ sau vài giờ .

Khó khăn của tôi là tìm một người sẵn sàng và có thể thực hiện rất nhiều đánh giá mã .

Chính sách công ty của chúng tôi là chúng tôi cần phải có đánh giá mã trước khi chúng tôi có thể kiểm tra mọi thứ, điều này có ý nghĩa, nhưng không phải lúc nào cũng có người trong bộ phận có thời gian thực hiện đánh giá mã ngay lập tức. Phương pháp khả thi:

  1. Thêm công việc mỗi lần kiểm tra; ít đăng ký == ít đánh giá.
  2. Thay đổi chính sách đăng ký của công ty. Nếu tôi vừa thực hiện một số phép tái cấu trúc và các bài kiểm tra đơn vị đều chạy màu xanh lá cây, có lẽ tôi có thể nới lỏng quy tắc?
  3. Thay đổi giá trị cho đến khi ai đó có thể thực hiện đánh giá và tiếp tục làm việc. Điều này có thể có vấn đề nếu người đánh giá không thích mã của bạn và bạn phải thiết kế lại. Tung hứng các giai đoạn khác nhau của một nhiệm vụ bằng cách 'thay đổi' các thay đổi có thể trở nên lộn xộn.

8
Chính sách của công ty về việc xem xét các đăng ký là khôn ngoan, nhưng không tương thích với các đăng ký sao lưu nhanh. Với mục đích này, tôi nghĩ sẽ hợp lý khi làm việc trong một chi nhánh và đăng ký ở đó mà không phải xem xét và chỉ thực hiện đăng ký chính thức bằng cách hợp nhất với trung kế, với đánh giá mã
Eli Bendersky

@ Eli- Tôi đồng ý, sử dụng một chi nhánh có vẻ như là ý tưởng tốt nhất. Chúng tôi đã từng làm điều này trong công ty của chúng tôi nhưng sau đó chúng tôi dừng lại. Tôi không thể nhớ chính xác vấn đề là gì - nhưng tôi nghĩ nó đã trở nên quá phức tạp và chứng tỏ quá phức tạp đối với người xử lý các quy trình phát hành và triển khai.
GarethOwen

Ditto Eli. Một lựa chọn khác là xem xét trước khi phát hành, hoặc một số mốc quan trọng khác. Xem lại mọi đăng ký / cam kết kiểm soát phiên bản là khủng khiếp . Thật tệ khi tôi sẽ thiết lập một kho lưu trữ cục bộ chỉ để cam kết ở đâu đó trong thời gian đó cho đến khi tôi có thể cam kết với kho lưu trữ "chính". (Tôi đã làm điều này trước đây khi máy chủ CVCS không khả dụng.)
jyoungdev

2

Tôi muốn cam kết thay đổi cứ sau 30-60 phút, miễn là nó biên dịch sạch sẽ và không có hồi quy trong các bài kiểm tra đơn vị.


2

Chà, bạn có thể có chi nhánh của riêng mình mà bạn có thể cam kết bao nhiêu lần tùy thích và khi bạn hoàn thành tính năng của mình, bạn có thể hợp nhất nó vào trung kế chính.

Về tần suất của các Cam kết, tôi nghĩ về nó theo cách này, sẽ đau đến mức nào nếu đĩa cứng của tôi bị hỏng và tôi đã không thực hiện điều gì đó - lượng tử của điều này đối với tôi là khoảng 2 giờ làm việc.

Tất nhiên, tôi không bao giờ cam kết một cái gì đó không biên dịch.


Sau đó, nó sẽ chỉ là 2 giờ đau .. phải không? tại sao điều đó rất tệ
Kevin Conner


2

Tôi không có giới hạn thời gian cụ thể cho mỗi lần cam kết, tôi có xu hướng cam kết sau khi thử nghiệm đã qua và tôi hài lòng với mã. Tôi sẽ không cam kết mã không biên dịch hoặc ở trạng thái mà tôi không cảm thấy tốt về việc hoàn nguyên trong trường hợp thất bại


2

Bạn phải cân bằng sự thỏa hiệp giữa an toàn và khả năng phục hồi một mặt và mặt khác dễ dàng quản lý thay đổi cho toàn bộ dự án.

Lược đồ tốt nhất mà tôi đã sử dụng đã có hai câu trả lời cho câu hỏi đó.

Chúng tôi đã sử dụng 2 kho lưu trữ hoàn toàn riêng biệt: một là kho lưu trữ rộng của dự án và hai là kho lưu trữ cá nhân của riêng chúng tôi (chúng tôi đang sử dụng rcs tại thời điểm đó).

Chúng tôi sẽ kiểm tra kho lưu trữ cá nhân của chúng tôi rất thường xuyên, khá nhiều mỗi khi bạn lưu các tệp đang mở. Như vậy, kho lưu trữ cá nhân về cơ bản là một bộ đệm lớn, dài, hoàn tác.

Khi chúng tôi có một đoạn mã sẽ biên dịch, đã kiểm tra ok và được chấp nhận là đã sẵn sàng để sử dụng chung, nó đã được kiểm tra vào kho lưu trữ của dự án.

Thật không may, hệ thống này dựa vào việc sử dụng các công nghệ VCS khác nhau để có thể hoạt động. Tôi đã không tìm thấy bất kỳ phương pháp thỏa đáng nào để đạt được kết quả tương tự trong khi sử dụng hai VCS cùng loại (ví dụ: hai kho lưu trữ lật đổ)

Tuy nhiên, tôi đã có kết quả chấp nhận được bằng cách tạo các nhánh phát triển "cá nhân" trong kho lưu trữ lật đổ - kiểm tra thường xuyên vào chi nhánh và sau đó hợp nhất vào thân cây sau khi hoàn thành.


2

Nếu bạn đang làm việc trên một chi nhánh sẽ không được phát hành, một cam kết luôn an toàn.

Tuy nhiên, nếu bạn đang chia sẻ nó với các nhà phát triển khác, việc cam kết mã không hoạt động có thể sẽ gây ra một chút phiền toái (đặc biệt nếu đó là ở một nơi quan trọng). Thông thường tôi chỉ cam kết mã "hoạt động" hiệu quả - không phải là nó đã được kiểm tra đầy đủ, nhưng tôi đã xác nhận rằng nó thực sự biên dịch và không bị lỗi ngay lập tức.

Nếu bạn đang sử dụng trình theo dõi lỗi tích hợp, có thể hữu ích để thực hiện các cam kết riêng nếu bạn đã sửa hai lỗi, để nhật ký cam kết có thể đi ngược lại các lỗi đúng. Nhưng một lần nữa, đôi khi một thay đổi mã sửa hai lỗi, vì vậy bạn chỉ cần chọn một lỗi để khắc phục (trừ khi hệ thống của bạn cho phép một cam kết được liên kết với nhiều lỗi)


2

Tôi vẫn tin vào cụm từ 'cam kết thường xuyên, cam kết sớm'. Tôi thích các VCS phi tập trung như Mercurial và không có vấn đề gì để cam kết một số điều và đẩy nó ngược dòng sau này.

Đây thực sự là một câu hỏi phổ biến, nhưng câu hỏi thực sự là: Bạn có thể cam kết mã chưa hoàn thành?


1
Tôi tin rằng mã chưa hoàn thành có thể được cam kết miễn là nó được kiến ​​trúc đúng để nó có thể được tách ra khỏi phần còn lại của hệ thống. Chẳng hạn, nếu bạn đang triển khai một tính năng bỏ phiếu như trong Stack Overflow, sẽ không ai biết nó ở đó nếu UI chưa được xây dựng.
jmort253

2

Bất cứ khi nào bạn hoàn thành một số mã hoạt động và sẽ không làm phiền bất kỳ ai khác nếu họ nhận được nó trong một bản cập nhật.

Và hãy chắc chắn rằng bạn nhận xét đúng.

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.