Tại sao git sử dụng băm thay vì số sửa đổi?


80

Tôi luôn tự hỏi tại sao git thích băm hơn số sửa đổi. Số sửa đổi rõ ràng hơn và dễ tham khảo hơn (theo ý kiến ​​của tôi): Có một sự khác biệt giữa việc bảo ai đó hãy xem bản sửa đổi 1200 hoặc cam kết 92ba93e! (Chỉ để đưa ra một ví dụ).

Vì vậy, có bất kỳ lý do cho thiết kế này?


3
Bạn có thể gắn thẻ một cam kết với "v1.0" và sau đó tham khảo cam kết theo thẻ đó. Xem git-scm.com/book/en/v2/Git-Basics-Tagging
Michael Durrant

Câu trả lời:


114

Một số sửa đổi duy nhất, tăng đơn điệu chỉ thực sự có ý nghĩa đối với một hệ thống kiểm soát phiên bản tập trung, trong đó tất cả các sửa đổi chảy đến một nơi duy nhất có thể theo dõi và gán số. Khi bạn vào thế giới DVCS, nơi tồn tại nhiều bản sao của kho lưu trữ và các thay đổi được kéo ra và đẩy chúng vào các quy trình công việc tùy ý, khái niệm này không được áp dụng. (Ví dụ: không có nơi nào để gán số sửa đổi - nếu tôi rẽ nhánh kho lưu trữ của bạn và bạn quyết định một năm sau đó để thay đổi, làm thế nào một hệ thống có thể đảm bảo rằng số sửa đổi của chúng tôi không xung đột?)


11
Bạn có thể muốn xem xét cách Bazaar - một DVCS vẫn duy trì số sửa đổi. Đảm bảo duy nhất là số sửa đổi là duy nhất trong một chi nhánh.
krlmlr

3
@krlmlr Person 1: "Hey, <P2>, what was revision 12345 for?" P2: "Revision 12345 was commited by <P3>." P3: "I don't have a revision 12345..."- Nếu tôi nhớ chính xác, Mercurial có một vấn đề tương tự. Mặt khác, nếu họ đang sử dụng git, tất cả họ đều có các tham chiếu giống hệt nhau cho mỗi lần xác nhận.
Izkata

1
@Izkata: P1: "Do you have revision with the GUID gdlmsnblngoijlafd-35345-fg?"... Bazaar vẫn có
HƯỚNG DẪN

5
@Izkata Mercurial không có vấn đề tương tự. Họ sử dụng băm, giống như git. Họ cũng cung cấp một số vòng quay chỉ cục bộ để dễ gõ.
Hank Gay

1
với git, 5 ký tự đầu tiên của hàm băm thường đủ độc đáo để sử dụng tốc ký cho ID sửa đổi đầy đủ.
mendota

40

Bạn cần băm trong một hệ thống phân tán. Giả sử bạn và một đồng nghiệp đều làm việc trên cùng một kho lưu trữ và cả hai bạn đều cam kết thay đổi cục bộ và sau đó đẩy nó. Ai sẽ là số sửa đổi 1200 và ai là số sửa đổi 1201 cho cả hai bên không có bất kỳ kiến ​​thức nào về nhau? Giải pháp kỹ thuật thực tế duy nhất là tạo ra một hàm băm của các thay đổi bằng phương pháp đã biết và liên kết mọi thứ dựa trên đó.

Thật thú vị HG không hỗ trợ số phiên bản nhưng chúng rõ ràng là một tính năng chỉ cục bộ - kho lưu trữ của bạn có một bộ, repo của đồng nghiệp của bạn sẽ có một bộ khác tùy thuộc vào cách chúng đẩy và kéo. Nó làm cho việc sử dụng dòng lệnh thân thiện hơn một chút so với Git.


34

Toàn vẹn dữ liệu.

Tôi tôn trọng không đồng ý với các câu trả lời hiện tại. Băm không cần thiết cho DVCS, xem cách Bazaar . Bạn có thể làm tốt với bất kỳ loại định danh duy nhất toàn cầu nào khác. Các giá trị băm là một biện pháp để đảm bảo tính toàn vẹn của dữ liệu: Chúng đại diện cho một bản tóm tắt thông tin có trong đối tượng (cam kết, cây, ...) được gọi bằng hàm băm. Việc thay đổi nội dung mà không thay đổi hàm băm (nghĩa là một cuộc tấn công tiền đề hoặc tấn công va chạm ) được cho là khó khăn, mặc dù không phải là không thể. (Nếu bạn thực sự thích nó, hãy xem bài báo năm 2011 của Marc Stevens ).

Do đó, việc tham chiếu đến các đối tượng bằng hàm băm SHA của chúng cho phép kiểm tra xem nội dung có bị giả mạo hay không. Và, do chúng (gần như) được đảm bảo là duy nhất, chúng cũng có thể được sử dụng làm định danh sửa đổi - một cách thuận tiện.

Xem Chương 9 của sách Git để biết thêm chi tiết.


8
Đây không phải là biện pháp bảo mật, vì hàm băm có thể dễ dàng được tính lại cho một cam kết đã sửa đổi. Nó chỉ được sử dụng cho tính toàn vẹn, để xác minh nội dung dựa trên hàm băm được tính toán - xem nhận xét này từ Linus Torvalds về việc sử dụng SHA-1 trong Git.
Lee

@Lee: Nếu kho lưu trữ của Chuck khác với kho lưu trữ của Alice và Bob về các bản băm sửa đổi, thì đảm bảo rằng Chuck cũng có nội dung khác nhau. Mặt khác, Chuck rất khó chế tạo một kho lưu trữ với các nội dung khác nhau trông giống hệt nhau trong các bản băm sửa đổi của chúng.
krlmlr

@Lee: Bỏ lỡ liên kết của bạn. Hãy gọi nó là "tính toàn vẹn dữ liệu" sau đó ...
krlmlr

nên trả lời đúng
SuperUberDuper

8

Theo cách nói của giáo dân:

  • Băm được dự định là gần như duy nhất trên toàn cầu. Điều này KHÔNG được đảm bảo nhưng rất khó có khả năng cùng một SHA được tạo cho các nội dung khác nhau. Trong thuật ngữ thực tế cho một dự án nhất định, bạn có thể coi nó là duy nhất.
  • Với số sửa đổi, bạn sẽ phải sử dụng một không gian tên để giới thiệu cụ thể đến sửa đổi 1200.
  • Git có thể hoạt động cả phân tán và / hoặc tập trung. Vậy làm thế nào để bạn có được số sửa đổi chính xác và duy nhất?
  • Ngoài ra, sử dụng số sửa đổi sẽ tạo ra phổ sai rằng các phiên bản mới hơn sẽ có số cao hơn và điều đó sẽ không đúng vì phân nhánh, hợp nhất, đánh lại, v.v.
  • Bạn luôn có tùy chọn để đặt các thẻ để xác nhận.

32
Không được đảm bảo là duy nhất, chỉ có khả năng là vô cùng độc đáo. :)
dsw88

@ mustang2009cobra Đó là sự thật.
Tulains Córdova

1
Có thể thay đổi của tôi không được chấp nhận vì hàm băm không thay đổi. Nhiều khả năng hai thiên thạch tấn công máy tính của tôi và máy tính với kho lưu trữ cùng một lúc, phá hủy các máy tính và giết chết mọi người liên quan.
gnasher729


1

Hash không phải là giải pháp duy nhất cho VCS phân tán. Nhưng khi đối phó với một hệ thống phân tán, chỉ có thể ghi lại thứ tự từng phần của các sự kiện. (Đối với VCS, sự kiện có thể là một cam kết.) Đó là lý do tại sao việc duy trì số sửa đổi tăng đơn điệu là không thể. Thông thường chúng ta áp dụng một cái gì đó như đồng hồ vector (hoặc dấu thời gian vector) để ghi lại mối quan hệ được sắp xếp một phần như vậy. Đây là giải pháp được sử dụng trong Bazaar .

Nhưng tại sao Git không sử dụng đồng hồ vector mà băm? Tôi nghĩ rằng nguyên nhân gốc rễ là anh đào chọn . Khi chúng tôi thực hiện chọn cherry trên kho lưu trữ, thứ tự cam kết một phần sẽ thay đổi. Đồng hồ vector của một số cam kết phải được gán lại để thể hiện thứ tự từng phần mới. Tuy nhiên, việc gán lại như vậy trong hệ thống phân tán sẽ gây ra đồng hồ vector không nhất quán. Đó là vấn đề thực sự mà băm giải quyết.

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.