Chia tiến trình mã hóa thành các cam kết có ý nghĩa mà không cần quá nhiều chi phí


23

Khi làm việc với một bản sửa lỗi hoặc một tính năng, đôi khi tôi vấp phải các vấn đề nhỏ khác có thể được cải thiện nhanh chóng chỉ trong vài giây. Khi tôi thực hiện chúng ngay lập tức và sau đó cam kết tính năng / sửa lỗi đã hoàn thành, cam kết bao gồm nhiều hơn một điều. Ví dụ "add feature X and code clean up"hay "fix bug X and improved logging". Sẽ là tốt hơn để chia điều này thành hai cam kết. Trong trường hợp hai thay đổi xảy ra trong cùng một tệp, tôi không thể chỉ cần thêm một tệp, cam kết, thêm tệp kia và sau đó xác nhận lại. Vì vậy, tôi thấy ba tùy chọn sau:

  1. Cố tình bỏ qua những thứ không liên quan trong khi làm việc trên một cái gì đó.

  2. Sao chép tệp với hai thay đổi, hoàn nguyên tệp, bao gồm một thay đổi, cam kết, bao gồm thay đổi khác, cam kết lại.

  3. Không thay đổi những thứ nhỏ không liên quan mà thêm chúng vào danh sách việc cần làm và thực hiện chúng sau.

Tôi không thực sự thích tất cả ba tùy chọn, vì những lý do sau:

  1. Chất lượng mã có thể bị ảnh hưởng nếu một người không khắc phục các vấn đề nhỏ. Và tôi cảm thấy tồi tệ nếu tôi cố tình bỏ lỡ một cơ hội để cải thiện một cái gì đó mà không cần nỗ lực nhiều.

  2. Điều này làm tăng công việc thủ công và dễ bị lỗi.

  3. Điều này tốt cho các todos không quá nhỏ, nhưng việc thêm một mục nhỏ vào danh sách việc cần làm và xem lại sau này thường mất nhiều thời gian hơn là chỉ sửa nó ngay lập tức.

Làm thế nào để bạn xử lý các tình huống như vậy?


7
Không git cho phép bạn kiểm tra từng dòng chứ không phải toàn bộ tập tin?
Kilian Foth


Tôi sử dụng git add -prất nhiều cho phép tôi tương tác chọn các phần của tệp tôi muốn cam kết. Nếu việc dọn dẹp đủ tách biệt, điều này rất dễ thực hiện. Nếu việc phân tách khó khăn hơn, tôi cam kết trạng thái trên một nhánh tạm thời, sau đó thêm thủ công các thay đổi vào nhánh thực tế của mình cho đến khi không có khác biệt với nhánh tạm thời. Điều này đòi hỏi nhiều công việc hơn, nhưng cho phép tôi kiểm tra xem mỗi cam kết hoạt động riêng.
amon

1
@gnat: rõ ràng không phải là lừa OP không hỏi về kích thước chính xác của một cam kết - anh ấy muốn thực hiện các cam kết nhỏ. Ông chỉ để tìm kiếm một cách hiệu quả hơn để làm điều này.
Doc Brown

2
@gnat: câu trả lời hàng đầu không nói gì (!) về cách xử lý các thay đổi khác nhau trong một tệp và cách chia chúng thành các cam kết riêng biệt.
Doc Brown

Câu trả lời:


11

Tôi nghĩ rằng bạn phải rất thực dụng khi lập trình. Ngay cả khi có thể xây dựng sơ đồ, quy trình làm việc hoặc triển khai hoàn hảo, đôi khi bạn chỉ cần hoàn thành công việc. Đây là những gì tôi làm:

Tôi sử dụng khả năng của git để tạo giai đoạn / cam kết các đường và khối riêng lẻ, bất cứ khi nào có thể, để tách các thay đổi không liên quan, mặc dù, đôi khi điều này có thể gây ra các vấn đề tạm thời, nếu việc phân tách không được thực hiện đúng. Vì các thay đổi sẽ liền kề nhau, nên thường không phải là vấn đề lớn, trừ khi bạn có chính sách kiểm tra mọi thay đổi riêng lẻ trong đường ống CI của mình.

Khi sự thay đổi không liên quan quá lớn, tôi sẽ đưa nó vào danh sách việc cần làm và thường đưa nó vào ngay sau đó, trong khi nó mới mẻ trong tâm trí tôi. Đôi khi có thể mất một hoặc hai ngày trước khi tôi có thể quay lại với nó, điều này phụ thuộc vào nhiệm vụ hiện tại và quá trình suy nghĩ của tôi. Thỉnh thoảng tôi sẽ chỉ cần đặt một TODO: bên cạnh mã vi phạm, nếu tôi không có sẵn một giải pháp tốt.

Nó xảy ra rằng nó chỉ không thực tế để phân tách mọi thứ và tôi sẽ cam kết điều chỉnh nhỏ cùng với công việc ban đầu.

Kích thước của sự thay đổi thường là yếu tố quyết định khi tôi chọn tuyến đường để đi, nhưng cuối cùng, tôi thà bỏ qua quy tắc công việc, hơn là để lại mùi.


7

Trình chỉnh sửa của tôi có một plugin giúp việc sắp xếp các phần riêng lẻ của một tệp cực kỳ dễ dàng. Tôi tưởng tượng các biên tập viên lập trình khác có thể có các plugin tương tự, mặc dù bạn luôn có thể làm theo cách thủ công git add --patch | -p. Sau đó, tôi sử dụng git stash để lưu các thay đổi khác của mình để kiểm tra cam kết nhỏ của mình một cách cô lập. Sau khi tôi cam kết, tôi chỉ cần làm một git stash popvà tiếp tục nơi tôi rời đi. Đó chính xác là những tính năng được thiết kế cho.


2

Bí quyết là không thực hiện thay đổi trừ khi bạn sẵn sàng nỗ lực hết sức để thay đổi xứng đáng.

Những gì tôi làm có xu hướng làm là thêm vào danh sách việc cần làm (đôi khi bằng cách thêm nhận xét vào mã, đôi khi trong một ghi chú về vé lỗi và đôi khi bằng cách cập nhật mã trong một nhánh riêng biệt, cuối cùng sẽ sửa lỗi được hợp nhất). Nếu không có vé lỗi cho một loạt các vấn đề chất lượng nhỏ, tôi nêu ra một vấn đề cụ thể cho vấn đề này, vì vậy tôi và mọi người khác có thể cho biết lý do của những thay đổi mã đó là khi chi nhánh được hợp nhất. Tôi không bao giờ thực hiện các thay đổi cho niềm vui của nó, mọi thứ đều có thể truy xuất nguồn gốc để các đồng nghiệp của tôi sẽ không quá ngạc nhiên khi mã thay đổi.

Vì vậy, trong ngắn hạn - có, bỏ qua chúng khi mã hóa. Nếu bạn đang thêm một tính năng, đừng cố thêm 2 tính năng, dù nhỏ đến đâu. Nếu ai đó quyết định hoàn nguyên chi nhánh của bạn (vì tính năng của bạn không còn cần thiết nữa, thì bạn cũng sẽ mất tất cả các lỗi nhỏ. Tương tự, bạn không muốn thực hiện một 'sửa chữa' nhỏ trong một số mã quan trọng đang hoạt động chính xác.


1
OP không đề xuất hợp nhất hai thay đổi thành một cam kết, hoàn toàn ngược lại.
Doc Brown

1
@DocBrown anh ấy đề nghị trộn 2 thay đổi thành một nhánh duy nhất, điều đó có thể gây lộn xộn để giải nén sau đó, mặc dù rõ ràng không lộn xộn như 2 thay đổi trong một lần cam kết.
gbjbaanb

Ok, tôi thấy những gì bạn có trong tâm trí với đoạn cuối cùng của bạn.
Doc Brown

2

Một tùy chọn tôi sử dụng khá nhiều là thêm TODObình luận, sau đó thực hiện nhiều cam kết "một phần" thường xuyên, bằng cách sử dụng git add --patchđể chọn các phần có liên quan của tệp. Sau đó sử dụng git rebase --interactiveđể sắp xếp lại và hợp nhất các cam kết một phần vào tính năng cuối cùng và các cam kết sửa lỗi trước khi đẩy chúng.

Điều này giữ cho cam kết chính của bạn sạch sẽ và vẫn cho phép bạn khắc phục các sự cố khác mà bạn tìm thấy ngay lập tức.

Không có gì sai với git rebase bối cảnh này khi bạn chỉ viết lại các cam kết cục bộ.


1

Một lựa chọn khác có thể là "git stash" những thay đổi hiện tại của bạn. Quy trình làm việc sẽ như thế này:

  1. Bắt đầu thực hiện các thay đổi liên quan đến Tính năng A
  2. Khám phá Bug B và quyết định sửa nó ngay lập tức
  3. Từ dòng lệnh trong repo của bạn thực hiện git stash (Sau đó, mã của bạn sẽ trở lại trạng thái trước khi bạn bắt đầu làm việc trên Tính năng A )
  4. Tại thời điểm này, những thay đổi không được cam kết của bạn cho Tính năng A được lưu trữ trong "stash"
  5. Thực hiện các thay đổi mã cần thiết để sửa chữa lỗi B và thực hiện cam kết trở lại repo
  6. Từ dòng lệnh chạy git stash pop
  7. Các thay đổi không được cam kết của bạn cho Tính năng A hiện đã được bật ra khỏi ngăn chứa và được khôi phục về mã tiến trình của bạn cùng với bản sửa lỗi (đã cam kết) cho Bug B

Bạn có thể mở rộng thêm một chút về cách thức hoạt động của công việc này? Trạng thái của kho lưu trữ tại mỗi điểm là gì? Bạn có thể dẫn ai đó đi qua quá trình sử dụng git stash không?

0

Giai đoạn riêng biệt (và cam kết) các thay đổi liên quan đến sửa lỗi. Trong phần mở rộng Git, điều này cực kỳ dễ làm. Từ dòng lệnh, tôi nghĩ bạn cần phải làm git add -p.

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.