Sửa lỗi trong khi làm việc trên một phần khác của cơ sở mã


19

Điều này đã xảy ra ít nhất một lần với tôi. Tôi đang làm việc trên một số phần của cơ sở mã và tìm thấy một lỗi nhỏ ở một phần khác và lỗi này ngăn tôi hoàn thành những gì tôi hiện đang cố gắng thực hiện. Sửa lỗi có thể đơn giản như thay đổi một câu lệnh.

Bạn làm gì trong tình huống đó?

  1. Sửa lỗi và cam kết cùng với công việc hiện tại của bạn
  2. Lưu công việc hiện tại của bạn ở nơi khác, sửa lỗi trong một cam kết riêng, sau đó tiếp tục công việc của bạn [1]
  3. Tiếp tục những gì bạn phải làm, cam kết mã (ngay cả khi nó phá vỡ công trình thất bại một số thử nghiệm), sau đó sửa lỗi (và tòa nhà làm cho các bài kiểm tra vượt qua) trong một cam kết riêng

[1] Trong thực tế, điều này có nghĩa là: sao chép kho lưu trữ ban đầu ở nơi khác, sửa lỗi, cam kết / đẩy các thay đổi, kéo cam kết vào kho lưu trữ mà bạn đang làm việc, hợp nhất các thay đổi và tiếp tục công việc của bạn.

Chỉnh sửa: Tôi đã thay đổi số ba để phản ánh những gì tôi thực sự có nghĩa.


2
Tại sao không cam kết cả sửa lỗi và thay đổi của bạn trong một giao dịch? Nó khá phổ biến và sạch sẽ. Bạn phải đặt bình luận thích hợp trong cam kết của bạn tất nhiên.

@Pierre, đó là số 1. Tôi nghĩ rằng tôi có thể chọn một từ tốt hơn silently.
imgx64

Tôi thường đặt nhiều bản sửa lỗi trong cùng một cam kết. Tôi tham chiếu chúng bằng ID nhiệm vụ và thậm chí tôi còn có Trac để tự động đính kèm các cam kết của mình với một hook đặc biệt mà tôi đã cài đặt

2
@Pierre 303 Ôi trời, thật là một thực tế tồi tệ! Chia nhỏ cam kết của bạn để chi tiết.
thay thế

@mathepic: khi một thay đổi chỉ ảnh hưởng đến một nhiệm vụ, nhưng khi nó ảnh hưởng đến nhiều nhiệm vụ, thì không thể phá vỡ bản dựng

Câu trả lời:


15

Tôi đã thực hiện 1 và 2 và cuối cùng, tôi nghĩ tôi thích # 2 hơn. Nó cho phép hiển thị nhiều hơn cho sửa lỗi, có thể quan trọng đối với QA / ghi chú phát hành / nhà phát triển khác.

Tôi cũng đã gặp một tình huống mà tôi nghĩ là một lỗi thực sự không xảy ra (không nói rằng đây là trường hợp ở đây) và "sửa" nó trong một cam kết riêng cho phép một nhà phát triển khác liên hệ với tôi và giải thích điều gì là thay vì "sửa chữa" chỉ bị mất trong đăng ký bình thường của tôi.


11

Tôi thường đi cho # 2. Nó làm cho kho lưu trữ sạch hơn, và làm cho các bản ghi dễ hiểu hơn. Tôi ghét nó khi các nhà phát triển khác tôi làm việc với cam kết 15 sửa lỗi, tính năng và tái cấu trúc khác nhau trong cùng một cam kết.

Ngoài ra, tùy thuộc vào cách nhóm của bạn thực hiện theo dõi lỗi, bạn có thể cần tìm kiếm repo khiếm khuyết để đảm bảo rằng nếu lỗi bạn đang sửa chữa ở đó, bạn đánh dấu mục hoàn thành. Hoặc, bạn có thể cần tạo một mục mới và đánh dấu nó hoàn thành để hệ thống lỗi và repo mã khớp với nhau.


7

Tôi làm # 2. Sử dụng các công cụ như git làm cho việc chia nó thành nhiều cam kết không quan trọng. Nếu bạn không thể thuyết phục nhóm của mình chuyển sang các công cụ hiện đại hơn, git-svn sẽ cung cấp cho bạn một phần kha khá những gì bạn sử dụng để giải quyết vấn đề này. Bài đăng trên blog này cung cấp một cái nhìn tổng quan về quy trình làm việc mà bạn đang cố gắng giải quyết: Điều quan trọng về Git


Cảm ơn, bài đăng trên blog đó rất hữu ích và có thể áp dụng trong trường hợp của tôi (tôi sử dụng Mercurial, ít nhiều có các tính năng tương tự như git). Tôi nghĩ rằng tôi nên đọc cuốn sách một ngày nào đó.
imgx64

@ imgx64: Tôi không biết liệu nó có tương đương với chỉ mục hay không. Đó là tính năng sát thủ của git IMO
Daenyth

Đọc các bình luận trong bài đăng trên blog đó, Mercurial có các phần mở rộng tương đương. Phần shelvemở rộng làm những gì tôi cần.
imgx64

@ imgx64 Kệ có thể hữu ích, vâng. Nhưng phần mở rộng Record thích hợp hơn tôi nghĩ. Tôi chỉ sử dụng nó thông qua GUI TortoiseHg (bạn có thể nhấp đúp vào một diff để loại bỏ / thêm nó vào cam kết).
barjak

3

Tôi chọn tùy chọn không được ghi (4): Chia dự án của bạn thành các tập hợp / thư viện chuyên dụng cao, để các lỗi không liên quan sẽ luôn ở một vị trí khác trong cây điều khiển phiên bản.

Tôi xin lỗi nếu những điều trên nghe có vẻ lén lút, nhưng ý tôi là nó chân thành. Tôi co rúm mỗi khi nhìn thấy một dự án nguyên khối với hàng trăm hình thức và không gian tên không liên quan gì đến nhau. Tôi đã từng phải đối mặt với tình trạng khó xử tương tự này thường xuyên, tự hỏi liệu tôi có nên chia tay các cam kết đang xử lý các khu vực chức năng khác nhau hay không; Mãi đến sau này tôi mới nhận ra rằng có tất cả các khu vực chức năng khác nhau này trong một dự án có thể thực hiện được, bản thân nó là một lỗ hổng thiết kế lớn.

Tôi vẫn thường xuyên tìm thấy các lỗi hoàn toàn không liên quan trong khi tôi đang làm việc trên một tính năng cụ thể. Tôi có thể đang làm việc trên UI và tìm thấy một lỗi trong một số logic nghiệp vụ và phải sửa nó trước khi tôi có thể tiếp tục. Sự khác biệt là logic nghiệp vụ luôn nằm trong một tổ hợp / dự án khác với UI, vì vậy tất cả những gì tôi phải làm là thực hiện một thay đổi rất nhỏ đối với BL và tiến hành một cam kết rất nhỏ, sau đó tiếp tục làm việc.

Có một tổ chức dự án thực sự tốt không chỉ có thể, mà còn dễ dàng xử lý các vấn đề này mà không chôn vùi thay đổi, phá vỡ công trình hoặc bị sa lầy trong một chi nhánh / hợp nhất khó chịu (ngay cả khi bạn đang sử dụng DVCS, điều đó không hoàn toàn không gây đau đớn ).

Nếu bạn thiếu tùy chọn này - tức là bạn là một nhà phát triển cơ sở không có tiếng nói trong tổ chức dự án - thì tôi chỉ cần đi với số 1 và ghi chú thích hợp vào nhật ký để người khác biết tại sao bạn làm những gì bạn đã làm. Nếu bạn đã thực hiện một thay đổi lớn thì cũng sẽ báo cáo lỗi trong hệ thống theo dõi vấn đề của bạn để hiển thị những gì bạn đã sửa và tại sao.


2
Trong khi tôi đồng ý, điều đó không hoạt động trong mọi tình huống. 'Lỗi trong một phần khác của mã' có thể nằm trong lớp cha hoặc thậm chí trong một phương thức khác trong cùng một lớp. Bạn không thể tách chúng trong các thư viện khác nhau.
imgx64

@img: Chắc chắn, nhưng nếu "phần khác" của cơ sở mã gần với những gì bạn đang làm, thì có lẽ nó thậm chí không biện minh cho sự chú ý này nhiều - chỉ cần sửa nó! : P
Aaronaught

1

Tôi cố gắng làm # 2. Nếu nó thực sự là một vấn đề riêng biệt, rất có thể nó nằm trong một tệp khác với những gì bạn đang làm việc. Bạn sẽ có thể kiểm tra tệp dưới dạng một cam kết riêng, ngay cả khi nó được tạo trong cùng một kho lưu trữ mà bạn đang làm việc. Đối với tất cả các lý do đã nêu, thật hợp lý khi có các cam kết độc lập nhất có thể, để theo dõi và hoàn nguyên thay đổi nếu nó sai.


3
Với Git, bạn có thể phân chia nhiều thay đổi trong cùng một tệp qua một số cam kết - Tôi thường bỏ lỡ việc không có điều này khi làm việc trên các dự án dựa trên SVN.
Peter Boughton

1

Tôi thường chỉ sửa lỗi, và sau đó tiếp tục những gì tôi đang làm việc. Khi đến lúc phải cam kết, giả sử sửa lỗi nằm trong một tệp riêng biệt, tôi thực hiện hai lần cam kết đồng thời - lần đầu tiên là cam kết một phần chỉ chứa sửa lỗi và lần thứ hai là mọi thứ khác.


1

Câu trả lời ngắn: # 2. Bạn thực sự muốn lỗi đó (với ghi chú của nó trong trình theo dõi của bạn!) Được gắn thẻ trong lịch sử phiên bản của bạn dưới dạng một thực thể riêng biệt.

Câu trả lời dài hơn:

  • Tình cờ gặp lỗi
  • Viết một bài kiểm tra hoặc nhiều hơn chứng minh lỗi
  • Làm bài kiểm tra
  • Cam kết chỉ sự thay đổi đó và kiểm tra của nó ( git add --interactivehay darcs record -ihay tuy nhiên VCS của bạn hiện nó) (*)
  • Quay trở lại với những gì tôi đã làm.

(*) Trong CVS (không, thực sự) đôi khi tôi có một cây sạch được kiểm tra cũng như một bản sao mà tôi làm việc. Sau đó, tôi sử dụng hợp nhất - winmerge, trong trường hợp của tôi - để chỉ sửa lỗi vào cây sạch để tôi có thể cam kết riêng. (Tùy chọn khác là đổi tên các tệp đã thay đổi của bạn cvs updatevà hợp nhất. Khi bạn đã cam kết thay đổi, hãy xóa tệp và đổi tên các tệp đã di chuyển của bạn trở lại tên ban đầu của chúng.)

Mặc dù vậy, một điều cần lưu ý là tôi thường chỉ tìm thấy các lỗi có liên quan đến những gì tôi đang làm việc hoặc ở gần nhau về mặt từ vựng. Tôi sẽ ngạc nhiên nếu mọi người thấy lỗi trong các phần không liên quan của codebase là bình thường - tại sao bạn lại đọc mã không liên quan khi sửa lỗi? (Vâng, điều này hoàn toàn ngược lại với những gì Aaronnaught nói!)


1

Tôi sửa lỗi và tôi thực hiện các cam kết riêng biệt , một cam kết cho mỗi sửa lỗi / tính năng.

Hầu hết thời gian, các thay đổi không nằm trong cùng một tệp, vì vậy thật dễ dàng để phân tách các cam kết. Nếu các thay đổi trong cùng một tệp, tôi sử dụng TortoiseHg (giao diện người dùng GUI cơ bản) để chọn chính xác các khác biệt tôi muốn cam kết (Tôi nghĩ có thể thực hiện việc này trên dòng lệnh với tiện ích mở rộng Bản ghi , nhưng nó không thuận tiện ).

Một số người sử dụng Hàng đợi Mercurial để cách ly các bản sửa lỗi nhỏ trong khi làm việc trên một tính năng. Các bản sửa lỗi nhỏ được xếp chồng lên nhau trong MQ và khi tính năng kết thúc và được cam kết, nội dung của hàng đợi cũng được cam kết (một thay đổi cho mỗi mục trong hàng đợi).


0

Tôi thường làm # 2. Lưu công việc hiện tại của tôi ở nơi khác: điều này thường hoạt động tốt bằng cách tạo ra một bản vá. Ngoài ra, một số IDE (IntelliJ) cho phép thực hiện các thay đổi chính xác là: lưu công việc hiện tại ở nơi khác.


0

Những gì tôi làm phụ thuộc vào việc lỗi thực sự nằm ở một phần khác. Nếu có, thì việc kiểm tra nó độc lập với một nửa thay đổi đã thực hiện của tôi. Tôi thực hiện thay đổi, xây dựng phần khác biệt đó để chắc chắn rằng tôi đã không mắc phải một số lỗi nhỏ, kiểm tra nó (có lẽ bằng cách làm bất cứ điều gì khiến tôi không làm) và kiểm tra xem điều gì đang xảy ra. Thường thì tôi sẽ tạo một mục công việc cho nó và sau khi đăng ký / giải quyết, gán WI cho người kiểm tra. Sau đó, tôi trở lại với những gì tôi đang làm.

Nếu tất cả được kết hợp với các tệp tôi đã thay đổi một nửa, tôi không thể xây dựng và kiểm tra phần đó một cách độc lập. Trong trường hợp đó, tôi tạo một WI khác cho nó và khi tôi kiểm tra các thay đổi của mình, tôi giải quyết cả hai WI với cùng một đăng ký, điều này thường trái với nguyên tắc của tôi, nhưng áp dụng tốt trong trường hợp này.

Trong cả hai trường hợp, lỗi đã được tôi kiểm tra, kiểm tra bằng một số loại dấu vết để mọi người hiểu tại sao tôi thay đổi ngẫu nhiên mã đó vào ngày hôm đó và WI được gán cho người khác để xác nhận ngay bây giờ.


0

Chúng tôi làm # 1. # 2 nghe có vẻ hay, nhưng tôi không thể nói rằng chúng tôi đã gặp vấn đề với # 1 mà # 2 sẽ khắc phục.

Một yếu tố bổ sung trong công ty của tôi là chúng tôi xây dựng các ứng dụng web và thử nghiệm của chúng tôi gần như hoàn toàn thông qua giao diện web - đại khái, cái mà mọi người gọi là thử nghiệm chức năng thay vì thử nghiệm đơn vị. Chúng tôi có tất cả các bài kiểm tra vượt qua trước khi đăng nhập. Việc chia các cam kết thành các bit nhỏ hơn có nghĩa là chạy các bài kiểm tra một lần cho mỗi bit và điều đó sẽ tốn nhiều thời gian hơn. Tôi rất thích có một bộ thử nghiệm nhanh hơn nhiều, cho phép chúng tôi thực hiện các cam kết nhỏ hơn, nhưng chúng tôi không có nó.

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.