Có ổn không khi có các cam kết trung gian bị phá vỡ, miễn là cam kết cuối cùng trong bất kỳ hoạt động đẩy nào?


13

Liên quan: Có nên mỗi cam kết git rời khỏi dự án trong trạng thái làm việc?

Giả sử tôi thực hiện các cam kết sau tại địa phương:

  • Sửa đổi lược đồ cơ sở dữ liệu, phá vỡ ứng dụng.

  • Cập nhật ứng dụng để nó tương thích với lược đồ cơ sở dữ liệu một lần nữa.

Miễn là tôi đẩy cả hai cam kết, mastervẫn ở trạng thái làm việc. Tuy nhiên, một phiên bản lịch sử bị phá vỡ.

Tôi biết rằng tôi có thể sử dụng git rebase -iđể kết hợp các cam kết với nhau. Tuy nhiên, cam kết kết quả sẽ lớn và ít mô tả. Nếu tôi cần tìm kiếm lịch sử cam kết để tìm hiểu lý do tại sao tôi thay đổi điều gì đó, tôi muốn tìm cam kết ban đầu cho thấy những gì tôi đã làm và tại sao.

Câu hỏi của tôi là:

  • Có ai gặp khó khăn do các cam kết lịch sử bị phá vỡ trong chủ?

  • Nếu vậy, có một cách đơn giản để tránh những khó khăn như vậy, mà không loại bỏ các thông điệp cam kết cá nhân và thay đổi?


1
Tại sao bạn không thể cam kết cả hai thay đổi trong một bước? Bạn không có nghĩa vụ phải thực hiện những khối công việc có ý nghĩa?
Giorgio

Câu trả lời:


9

Phần lớn phụ thuộc vào chiến lược phân nhánh trang phục của bạn, nhưng tôi nghĩ rằng việc phá vỡ các cam kết trên các nhánh phát triển nói chung có ý nghĩa rất lớn - "chiến thắng" lớn trong việc sử dụng kiểm soát nguồn là có thể đẩy lùi các thay đổi nhỏ và đôi khi bạn tạo ra một loạt chúng và bạn phải đập trứng để tạo ra trứng.

Cách đơn giản để giữ cho các cam kết cá nhân mà không gây ô nhiễm chính là sử dụng các nhánh. Bạn có thể đặt các công cụ thử nghiệm / phá vỡ vào đó để bạn có thể có một lịch sử chi tiết mà không làm ô nhiễm lịch sử của nhánh chính.


3
Có, nhưng khi tôi hợp nhất một tính năng thành chủ và nó nhanh chóng chuyển tiếp, chủ hiện có tất cả các cam kết đó. Nếu đó là rất nhiều cam kết, tôi có nên cân nhắc sử dụng --no-fftùy chọn git-merge để buộc nó thực hiện một cam kết hợp nhất không?
Joey Adams

Tôi tin rằng đó là một mục tiêu hợp lý khi mọi cam kết vào nhánh chính tạo ra một phiên bản phần mềm hoạt động. Nếu cuộn chúng thành một cái lớn không có ý nghĩa, các bình luận cam kết sẽ mô tả rõ ràng bất kỳ sự phụ thuộc nào với các cam kết khác.
mattnz

Ý kiến ​​của tôi là những "cam kết bị hỏng" là tốt. Nếu bạn có một số lỗi mà bạn không thấy trong quá trình triển khai của mình, những "cam kết bị hỏng" này có thể cung cấp cho bạn một bộ nhớ rất cụ thể về những gì bạn đã thay đổi. Đôi khi, đó chỉ là gợi ý bạn cần.
RobotHumans

3
Đến bữa tiệc muộn một chút nhưng nếu bạn thực sự không thích những cam kết bị hỏng đó, hãy bắt đầu lại trước khi bạn hợp nhất chi nhánh của mình thành chủ nhân.
Dan Pantry

3

Cam kết bị phá vỡ là một cái gì đó "chỉ xảy ra", không có nghĩa là ngày tận thế. Tôi có một giọng nói khó chịu ở phía sau đầu nói với tôi rằng tôi không nên cố ý kiểm tra mã bị hỏng, theo nguyên tắc và do đó bao gồm cả các phiên bản lịch sử, tuy nhiên đó không phải là điều tôi sẽ gây chiến.

Mô hình phân nhánh được khen ngợi của Git làm cho việc giữ các cam kết bị hỏng khỏi các nhánh cụ thể là khả thi, ví dụ: nếu nhóm của bạn áp dụng gitflow hoặc phiên bản đơn giản hóa của nó. Bất cứ điều gì với một chính sách "chủ sạch". Trong trường hợp này, bạn có thể kiểm tra phiên bản hoạt động cuối cùng dưới dạng một cam kết hợp nhất, trong đó các phiên bản lịch sử (bị hỏng) có sẵn trong kho lưu trữ nhưng ngoài dòng chính.

Nếu nhóm của bạn không áp dụng mô hình phân nhánh như vậy, thì bạn có một lý do hợp lệ để chỉ đẩy toàn bộ lô thành chủ và được thực hiện với nó.


3

Không, nó không ổn.

Nếu bạn đã từng làm một git bisect(và ai không thích tính năng sát thủ đó), bạn sẽ biết giá trị của một lịch sử nơi mọi cam kết được xây dựng.

Nếu bạn có nhiều cam kết trong quá trình bisectkhông xây dựng, bạn sẽ có rất nhiều git bisect skipcam kết gây khó khăn cho việc tìm kiếm cam kết tốt cuối cùng.

Nếu bạn hoàn thành một nhánh tính năng và hợp nhất nó thành chủ, hãy dọn sạch nhánh đó trước khi hợp nhất để lịch sử của bạn rõ ràng và xây dựng.


3

Có ai gặp khó khăn do các cam kết lịch sử bị phá vỡ trong chủ?

Đúng. Backports, Reverts và bisects là khó khăn hơn. Vậy là đọc lịch sử (xem bên dưới).

Nếu vậy, có một cách đơn giản để tránh những khó khăn như vậy, mà không loại bỏ các thông điệp cam kết và thay đổi cá nhân?

Không phải tôi biết, mặc dù các chi nhánh là một giải pháp tốt.

Tuy nhiên, tôi nghĩ rằng việc vứt bỏ (hay đúng hơn là đè bẹp) cá nhân cam kết là điều nên làm.

Trong quá trình phát triển, đặc biệt là khi làm TDD, cam kết sớm và thường xuyên là tốt. Bạn muốn theo dõi đầy đủ những gì bạn đang làm để bạn có thể quay lại hoặc tìm ra chính xác khi nào mọi thứ bắt đầu sai (hoặc có thể bạn đã tự mình tái cấu trúc lớn hơn mức bạn có thể nhai). Cam kết đi.

Tuy nhiên, một khi tính năng / thay đổi đã sẵn sàng được đẩy, một cam kết là một thay đổi được đóng gói - lý tưởng là nguyên tử để nó có thể được [xem xét, đánh lại, sáp nhập, chọn anh đào, hoàn nguyên, xem trong chú thích] một cách độc lập với các thay đổi khác nhất có thể .

Nhìn vào lịch sử của một dự án, một sự thay đổi phần mềm nên được tự đánh giá. Nó xây dựng? Nó đi kèm với các bài kiểm tra? Nó có hoạt động không? Nó làm gì? Những tập tin cần phải được thay đổi để cung cấp tính năng đó?

Phải lắp ráp các cam kết, trong khi có thể (và được trợ giúp bằng cách hợp nhất), làm cho điều đó trở nên khó khăn hơn. Do đó, tôi nghĩ rằng làm sạch lịch sử của bạn trước khi đẩy là phù hợp, ngay cả khi điều đó có nghĩa là mất dấu vết về cách bạn đến nơi bạn đang ở.


1

Trả lời ngắn gọn: Có

Kiểm tra:

Phát triển theo hướng kiểm tra có nghĩa là bạn viết các bài kiểm tra bị hỏng (tức là hiển thị không thành công).
Sau đó, bạn viết mã để làm cho các bài kiểm tra hoạt động.

Phát triển:

Cam kết nhỏ, Cam kết thường xuyên.
Mỗi cam kết là một điểm rollback. Nếu bạn nhận ra mình đang đi sai đường, bạn có thể quay trở lại điểm trước tương đối dễ dàng. Nếu bạn cam kết đủ hạt mịn, bạn có thể quay lại điểm chính xác.

Hãy cẩn thận:

Điều này không có nghĩa

1) Bạn kiểm tra mã bị hỏng thành chủ.
2) Bạn cần đẩy tất cả các cam kết vi mô để mọi người xem xét.

Sử dụng các chi nhánh để làm công việc của bạn. Có khả năng nén các cam kết vi mô cho các quy trình đánh giá để chúng ở các đơn vị logic riêng biệt với các nhận xét phù hợp. Nếu bạn đang sử dụng git, bạn sẽ không mất bộ cam kết ban đầu, bạn chỉ có thể tạo một bộ cam kết mới hợp lý hơn cho các quy trình đánh giá sẽ được hợp nhất thành chủ.


0

Tôi nghĩ miễn là các cam kết là cục bộ và không bị đẩy sang người khác, điều đó không chỉ ổn, đó thực sự là một cách tốt để làm việc. Đừng đẩy mã bị hỏng cho người khác.

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.