Tôi nên sử dụng thì quá khứ hay hiện tại trong tin nhắn cam kết git? [đóng cửa]


531

Tôi đã đọc một lần rằng các thông điệp cam kết git phải ở thì hiện tại bắt buộc, ví dụ: "Thêm bài kiểm tra cho x". Mặc dù vậy, tôi luôn thấy mình sử dụng thì quá khứ, ví dụ: "Đã thêm các bài kiểm tra cho x", điều này cảm thấy tự nhiên hơn rất nhiều đối với tôi.

Đây là một cam kết John Resig gần đây hiển thị hai trong một tin nhắn:

Tinh chỉnh một số kết quả thiết lập jQuery khác trong các thử nghiệm thao tác. Cũng cố định thứ tự của kết quả kiểm tra dự kiến.

Có vấn đề gì không? Tôi nên sử dụng cái nào?


12
Câu hỏi này vì vậy cần phải được đóng lại như chủ yếu dựa trên ý kiến . Chỉ cần nhìn vào sự khác biệt về quan điểm giữa thì bắt buộcthì quá khứ rồi! Điều đó đang được nói, tôi bỏ phiếu cho căng thẳng bắt buộc, bởi vì nó thực sự giúp làm rõ những gì bạn đang làm khi viết lại lịch sử của bạn, chọn anh đào, áp dụng các bản vá, vv!




3
@Eonil nếu nó bị đóng vì ý kiến ​​dựa trên đây thì nó cũng sẽ bị đóng vì ý kiến ​​cũng ở đó.
ratchet freak

Câu trả lời:


601

Sở thích cho các thông điệp cam kết theo kiểu hiện tại, bắt buộc xuất phát từ chính Git. Từ Tài liệu / Gửi đệ trình trong repo Git:

Mô tả những thay đổi của bạn trong tâm trạng bắt buộc, ví dụ: "make xyzzy do frotz" thay vì "[Bản vá này] làm cho xyzzy do frotz" hoặc "[I] đã thay đổi xyzzy thành frotz", như thể bạn đang ra lệnh cho codebase thay đổi hành vi.

Vì vậy, bạn sẽ thấy rất nhiều thông điệp cam kết Git được viết theo phong cách đó. Nếu bạn đang làm việc trong một nhóm hoặc trên phần mềm nguồn mở, sẽ rất hữu ích nếu mọi người đều tuân theo phong cách đó để thống nhất. Ngay cả khi bạn đang làm việc trong một dự án tư nhân và bạn là người duy nhất từng thấy lịch sử git của bạn, thì vẫn hữu ích khi sử dụng tâm trạng bắt buộc vì nó thiết lập những thói quen tốt sẽ được đánh giá cao khi bạn làm việc với người khác.


90
Tôi nghĩ rằng đây là một sự lựa chọn tuyệt vời. Hãy suy nghĩ về một cam kết là gì, ở dạng khác: một bộ hướng dẫn về cách đi từ trạng thái trước sang trạng thái mới. Giống như diff nói "thêm dòng này vào đây, xóa dòng này ở đây", thông báo cam kết nói theo thuật ngữ định tính "thực hiện thay đổi này". (Vâng, git không lưu trữ cam kết đơn giản dưới dạng cây với siêu dữ liệu, nhưng với con người, phần quan trọng của cam kết là khác biệt)
Cascabel

124
Bạn có thể thấy một cam kết là một bộ hướng dẫn về cách đi từ trạng thái trước sang trạng thái mới; nhưng tôi thấy nó nhiều hơn như một điểm kiểm tra trong quá trình phát triển của mã. Đối với tôi, thông báo cam kết là nhật ký của những gì đã được thực hiện đối với mã kể từ lần xác nhận trước đó; và đối với một bản ghi, thì quá khứ có ý nghĩa hơn rất nhiều. Nếu bạn thực sự nghĩ rằng thông điệp cam kết nên là một bộ hướng dẫn, thì thì bắt buộc là cách để đi. Tôi thực sự không nghĩ về nó theo cách đó.
karadoc

10
@oschrenk: Các phiên bản sau của tệp đã đưa ra lý do: "Mô tả những thay đổi của bạn trong tâm trạng bắt buộc, ví dụ: 'make xyzzy do frotz' thay vì '[Bản vá này] làm cho xyzzy do frotz' hoặc '[I] thay đổi xyzzy ', như thể bạn đang ra lệnh cho cơ sở mã để thay đổi hành vi của nó. "
mipadi

44
Thông điệp cam kết nên bắt buộc, thì hiện tại bởi vì với git bạn hoặc ai đó cuối cùng có thể thực hiện rebasehoặc cherry-picktrong trường hợp đó, cam kết có thể được sử dụng bên ngoài bối cảnh ban đầu của nó. Do đó, thông điệp cam kết phải được viết độc lập mà không mong người đọc xem bất kỳ thông điệp cam kết nào xung quanh. Khi bạn chọn các bản vá lỗi, bạn nên áp dụng "Khắc phục thuật toán quicksort" hoặc "Sắp xếp: Cải thiện hiệu suất" thay vì "Đã sửa lỗi # 124" hoặc "Sắp xếp sửa đổi để cải thiện hiệu suất".
Mikko Rantalainen

5
Cách tôi nghĩ về điều này là thông báo sẽ cho tôi biết điều gì sẽ thay đổi nếu tôi chọn áp dụng cam kết này cho chi nhánh của mình. Tôi không nghĩ đó là nhật ký nhưng là trạng thái mà tôi có thể chuyển đến và tôi cần biết điều gì sẽ xảy ra khi tôi chọn một trạng thái cụ thể.
steinybot

357

Dự án của bạn hầu như luôn luôn sử dụng thì quá khứ . Trong mọi trường hợp, dự án phải luôn luôn sử dụng cùng một mức độ cho sự thống nhất và rõ ràng.

Tôi hiểu một số đối số khác lập luận để sử dụng thì hiện tại, nhưng chúng thường không áp dụng. Các gạch đầu dòng sau đây là các đối số phổ biến để viết ở thì hiện tại và phản ứng của tôi.

  • Viết ở thì hiện tại cho ai đó biết việc áp dụng cam kết sẽ làm gì hơn là những gì bạn đã làm.

Đây là lý do chính xác nhất mà người ta muốn sử dụng thì hiện tại, nhưng chỉ với phong cách dự án phù hợp. Cách suy nghĩ này coi tất cả các cam kết là các cải tiến hoặc tính năng tùy chọn và bạn có thể tự do quyết định những cam kết nào sẽ giữ và từ chối trong kho lưu trữ cụ thể của bạn.

Đối số này hoạt động nếu bạn đang làm việc với một dự án phân tán thực sự. Nếu bạn đang làm việc với một dự án phân tán, có lẽ bạn đang làm việc với một dự án nguồn mở. Và nó có lẽ là một dự án rất lớn nếu nó thực sự được phân phối. Trên thực tế, nó có thể là nhân Linux hoặc Git. Vì Linux có khả năng là nguyên nhân khiến Git lan rộng và phổ biến, nên thật dễ hiểu tại sao mọi người lại coi phong cách của nó là uy quyền. Vâng, phong cách có ý nghĩa với hai dự án. Hoặc, nói chung, nó hoạt động với các dự án phân tán, nguồn mở lớn.

Điều đó đang được nói, hầu hết các dự án trong kiểm soát nguồn không hoạt động như thế này. Nó thường không chính xác cho hầu hết các kho lưu trữ. Đó là một cách suy nghĩ hiện đại về một cam kết: Subversion (SVN) và kho CVS hầu như không thể hỗ trợ kiểu đăng ký kho lưu trữ này. Thông thường, một nhánh tích hợp đã xử lý lọc các đăng ký xấu, nhưng những thứ đó thường không được coi là "tùy chọn" hoặc "tính năng dễ có".

Trong hầu hết các kịch bản, khi bạn thực hiện cam kết với kho lưu trữ nguồn, bạn đang viết một mục nhật ký mô tả những gì đã thay đổi với bản cập nhật này, để giúp những người khác trong tương lai dễ hiểu hơn tại sao thay đổi được thực hiện. Nó thường không phải là một thay đổi tùy chọn - những người khác trong dự án được yêu cầu hợp nhất hoặc phản ứng lại với nó. Bạn không viết một mục nhật ký như "Nhật ký thân mến, hôm nay tôi gặp một cậu bé và cậu ấy nói xin chào với tôi.", Nhưng thay vào đó bạn viết "Tôi đã gặp một cậu bé và cậu ấy nói xin chào với tôi."

Cuối cùng, đối với các dự án không được phân phối như vậy, 99,99% thời gian một người sẽ đọc một thông điệp cam kết là để đọc lịch sử - lịch sử được đọc ở thì quá khứ. 0,01% thời gian sẽ quyết định liệu họ có nên áp dụng cam kết này hay tích hợp nó vào chi nhánh / kho lưu trữ của họ hay không.

  • Tính nhất quán. Đó là cách nó được thực hiện trong nhiều dự án (bao gồm cả chính git). Ngoài ra các công cụ git tạo ra các xác nhận (như git merge hoặc git Revert) làm điều đó.

Không, tôi đảm bảo với bạn rằng phần lớn các dự án đã từng đăng nhập vào hệ thống kiểm soát phiên bản đã có lịch sử của chúng trong thì quá khứ (tôi không có tài liệu tham khảo, nhưng có lẽ đúng, vì đối số thì hiện tại là mới kể từ Git). Tin nhắn "Sửa đổi" hoặc tin nhắn cam kết ở thì hiện tại chỉ bắt đầu có ý nghĩa trong các dự án phân tán thực sự - xem điểm đầu tiên ở trên.

  • Mọi người không chỉ đọc lịch sử để biết "điều gì đã xảy ra với cơ sở mã này", mà còn để trả lời các câu hỏi như "điều gì xảy ra khi tôi chọn cam kết này" hoặc "những điều mới nào sẽ xảy ra với cơ sở mã của tôi vì những cam kết này Tôi có thể hoặc không thể hợp nhất trong tương lai ".

Xem điểm đầu tiên. 99,99% thời gian một người sẽ đọc một thông điệp cam kết là để đọc lịch sử - lịch sử được đọc ở thì quá khứ. 0,01% thời gian sẽ quyết định liệu họ có nên áp dụng cam kết này hay tích hợp nó vào chi nhánh / kho lưu trữ của họ hay không. 99,99% nhịp 0,01%.

  • Nó thường ngắn hơn

Tôi chưa bao giờ thấy một cuộc tranh luận tốt nói rằng sử dụng thì không đúng ngữ pháp / ngữ pháp vì nó ngắn hơn. Có lẽ bạn sẽ chỉ lưu trung bình 3 ký tự cho một tin nhắn tiêu chuẩn 50 ký tự. Điều đó đang được nói, thì hiện tại trung bình có thể sẽ ngắn hơn một vài ký tự.

  • Bạn có thể đặt tên cho các cam kết phù hợp hơn với các tiêu đề vé trong trình theo dõi vấn đề / tính năng của bạn (không sử dụng thì quá khứ, mặc dù đôi khi trong tương lai)

Vé được viết dưới dạng một cái gì đó đang xảy ra (ví dụ: ứng dụng đang hiển thị hành vi sai khi tôi nhấp vào nút này) hoặc một cái gì đó cần phải được thực hiện trong tương lai (ví dụ: văn bản sẽ cần người chỉnh sửa xem xét).

Lịch sử (tức là thông điệp cam kết) được viết như một điều đã được thực hiện trong quá khứ (ví dụ: sự cố đã được khắc phục).


79
Hôm nay tôi mới nghe về sự ưu tiên được cho là cho các cam kết theo phong cách bắt buộc. Đối với tôi, nó nghe có vẻ không tự nhiên và kỳ quái đến nỗi tôi quyết định tìm kiếm thêm một số ý kiến. Tôi rất vui khi thấy tôi không phải là người duy nhất nghĩ rằng thì quá khứ tự nhiên hơn đối với các thông điệp cam kết. :)
karadoc

57
Các thông điệp cam kết hợp nhất và rebase được tạo tự động của git là bắt buộc và hiện tại ("Hợp nhất", không phải "Đã hợp nhất"; "Rebase", không phải "Rebase"), vì vậy bạn có thể muốn khớp thông điệp này trong các thông điệp cam kết của riêng bạn.
mjs

13
Có vẻ như sự khác biệt là giữa việc tập trung vào thay đổi phần mềm - "Đã sửa lỗi X bằng cách thực hiện Y" - hoặc kho lưu trữ - "Do Y để sửa X." +1 cho một cuộc tranh luận tốt, nhưng tôi nghĩ rằng repo thường nên tập trung vào chính nó hơn là phần mềm kết quả.
l0b0

28
Vấn đề là, sử dụng các công việc hiện tại bắt buộc cho các dự án lớn (ví dụ Linux) để nó rõ ràng có quy mô. Ngoài ra, nó đòi hỏi khá nhiều nỗ lực bằng không sử dụng thì quá khứ. Kết quả là, tôi thấy không có lý do nào (ngoài "người già được sử dụng để viết thông điệp cam kết trong thì quá khứ") để sử dụng bất cứ điều gì khác ngoài thì hiện tại, thì hiện tại. Nếu bạn có thể học tập lệnh git, bạn có thể học viết ở thì bắt buộc, thì hiện tại.
Mikko Rantalainen

35
Bắt buộc không phải là "mới kể từ git". ChangeLog tồn tại rất lâu trước khi git và việc sử dụng mệnh lệnh luôn là kiểu được đề xuất trong Dự án GNU. gnu.org/prep/stiterias/html_node/Style-of-Change-Logs.html
adl

81

Tôi đã viết một mô tả đầy đủ hơn trên 365git .

Việc sử dụng thì hiện tại bắt buộc phải làm quen một chút. Khi tôi bắt đầu đề cập đến nó, nó đã gặp phải sự kháng cự. Thông thường dọc theo dòng của Thông điệp cam kết ghi lại những gì tôi đã thực hiện. Nhưng, Git là một hệ thống kiểm soát phiên bản phân tán, nơi có khả năng có nhiều nơi để thay đổi. Thay vì viết tin nhắn cho biết những gì bạn đã làm; xem xét các thông báo này như hướng dẫn cho việc áp dụng cam kết sẽ làm gì. Thay vì có một cam kết với tiêu đề:

Renamed the iVars and removed the common prefix.

Có một cái như thế này:

Rename the iVars to remove the common prefix

Điều này cho ai đó biết việc áp dụng cam kết sẽ làm gì hơn là những gì bạn đã làm. Ngoài ra, nếu bạn nhìn vào lịch sử kho lưu trữ của mình, bạn sẽ thấy rằng các tin nhắn được tạo bởi Git cũng được viết bằng thì - Mer Merge không phải là Merged,, Rebase, không phải Reb Reb, vì vậy việc viết trong cùng một thì giữ cho mọi thứ đều ổn định. Nó cảm thấy kỳ lạ lúc đầu nhưng nó có ý nghĩa (lời chứng thực có sẵn khi áp dụng) và cuối cùng trở nên tự nhiên.

Đã nói tất cả - đó là mã của bạn, kho lưu trữ của bạn: vì vậy hãy thiết lập các nguyên tắc của riêng bạn và tuân theo chúng.

Tuy nhiên, nếu bạn quyết định đi theo con đường này thì git rebase -ivới tùy chọn tua lại sẽ là một điều tốt để xem xét.


7
Chà, bạn đã trộn lẫn hai hướng dẫn khác nhau: dự án nguồn mở Git và sử dụng Git thường xuyên. Các liên kết được cung cấp không đề cập đến căng thẳng ở tất cả . Tài liệu Git chính thức chỉ đề cập đến giới hạn 50 char. Git là một VCS phân tán, nơi có nhiều nơi để nhận các thay đổi từ ... hãy xem các thông báo này là hướng dẫn cho việc áp dụng cam kết sẽ làm gì. Điều này chỉ áp dụng cho một vài dự án thực sự là các dự án phân phối. 99,999% cam kết Git sẽ không bao giờ được áp dụng theo cách thủ công như vậy. Trong hầu hết các dự án, lịch sử là một bản ghi thay đổi, nên ở thì quá khứ.
Matt Quigley

4
"và nên bỏ qua điểm dừng hoàn toàn"
takeshin 16/07/13

30

Gắn bó với thì hiện tại bắt buộc vì

  • thật tốt khi có một tiêu chuẩn
  • nó phù hợp với vé trong trình theo dõi lỗi tự nhiên có dạng "thực hiện một cái gì đó", "sửa một cái gì đó" hoặc "thử nghiệm cái gì đó".

16

Bạn đang viết tin nhắn cho ai? Và người đọc đó thường đọc tin nhắn trước hay sau khi sở hữu bản cam kết?

Tôi nghĩ rằng những câu trả lời tốt ở đây đã được đưa ra từ cả hai khía cạnh, có lẽ tôi chỉ thiếu sót khi cho rằng có một câu trả lời tốt nhất cho mọi dự án. Việc bỏ phiếu có thể gợi ý càng nhiều.

tức là tóm tắt:

  • Có phải thông điệp chủ yếu dành cho người khác, thường là đọc vào một thời điểm nào đó trước khi họ thực hiện thay đổi: Một đề xuất về việc thực hiện thay đổi sẽ làm gì với mã hiện tại của họ.

  • Có phải thông điệp chủ yếu là một tạp chí / bản ghi cho chính bạn (hoặc cho nhóm của bạn), nhưng thường đọc từ góc độ đã giả định thay đổi và tìm kiếm lại để khám phá những gì đã xảy ra.

Có lẽ điều này sẽ dẫn dắt động lực cho nhóm / dự án của bạn, dù bằng cách nào.


10

có vấn đề gì không mọi người thường đủ thông minh để diễn giải các thông điệp một cách chính xác, nếu họ không có lẽ bạn không nên để họ truy cập vào kho lưu trữ của bạn!


27
Đối với một số người , những thứ như thế khá quan trọng.
Wesley Murch

2
@mog liên kết không đưa ra bất kỳ tuyên bố nào về hiện tại và quá khứ.
ceving

2
Nếu dự án mở rộng thời gian, những người thực hiện đánh giá mã và tìm lỗi sẽ thấy rất nhiều cam kết rằng họ cần tất cả sự giúp đỡ mà bạn và tôi có thể cung cấp. Không có điểm nào tiết kiệm một vài giây bây giờ để gây ra đau đầu lớn trong tương lai vì không viết một thông điệp cam kết thích hợp.
Mikko Rantalainen

Tôi không nói đừng viết một tin nhắn cam kết tốt. Tôi đang nói nó không thành vấn đề nếu bạn sử dụng thì quá khứ hay hiện tại.
Michael Baldry

1
Làm thế nào bạn biết rằng người không thể giải thích thông điệp cam kết của bạn là nguyên nhân khiến người đó không đủ khả năng hoặc bạn không đủ khả năng viết một thông điệp cam kết tốt?
Haris

7

Điều đó phụ thuộc vào bạn. Chỉ cần sử dụng thông điệp cam kết như bạn muốn. Nhưng sẽ dễ dàng hơn nếu bạn không chuyển đổi giữa thời gian và ngôn ngữ.

Và nếu bạn phát triển trong một nhóm - nó sẽ được thảo luận và đặt cố định.

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.