Git được thiết kế như thế nào?


9

Nơi làm việc của tôi gần đây đã chuyển sang Git và tôi đã yêu (và ghét!) Nó. Tôi thực sự thích nó, và nó cực kỳ mạnh mẽ. Phần duy nhất tôi ghét là đôi khi nó quá mạnh mẽ (và có thể hơi khó hiểu / khó hiểu).

Câu hỏi của tôi là ... Git được thiết kế như thế nào? Chỉ cần sử dụng nó trong một khoảng thời gian ngắn, bạn sẽ có cảm giác rằng nó có thể xử lý nhiều quy trình công việc tối nghĩa mà các hệ thống kiểm soát phiên bản khác không thể làm được. Nhưng nó cũng cảm thấy thanh lịch bên dưới. Va nhanh nhẹn!

Điều này không nghi ngờ gì một phần với tài năng của Linus. Nhưng tôi tự hỏi, là thiết kế tổng thể của git dựa trên một cái gì đó? Tôi đã đọc về BitKeeper nhưng các tài khoản rất ít về các chi tiết kỹ thuật. Việc nén, vẽ đồ thị, loại bỏ các số sửa đổi, nhấn mạnh vào việc phân nhánh, sắp xếp, từ xa ... Tất cả bắt nguồn từ đâu?

Linus thực sự đã đánh bật cái này ra khỏi công viên và trong lần thử đầu tiên! Nó khá tốt để sử dụng một khi bạn đã qua giai đoạn học tập.


có lẽ bạn có thể nhận được một số trợ giúp trên kênh IRC git (#git trên freenode)
yati sagade


2
you get the feel that it can handle many obscure workflows that other version control systems could not: Đó có lẽ là do nó được thiết kế để xử lý kernel linux, một đoạn mã nổi tiếng, phức tạp và lớn.
yannis

1
Vào dịp kỷ niệm lần thứ 10 của Git, đây là một bài báo từ một cuộc phỏng vấn với Torvalds: linux.com/news/featured-blogs/185-jennifer-cloer/...
Sridhar Sarnobat

Câu trả lời:


17

Git không được thiết kế nhiều như đã phát triển .

Hãy xem một mình. Sao chép kho git chính thức , mở nó trong gitk(hoặc trình xem nhật ký git đồ họa yêu thích của bạn) và xem xét các bản sửa đổi sớm nhất của nó.

Bạn sẽ thấy nó ban đầu chỉ có chức năng rất cốt lõi (cơ sở dữ liệu đối tượng và chỉ mục). Mọi thứ khác đều được thực hiện bằng tay . Tuy nhiên, lõi nhỏ này được thiết kế để dễ dàng tự động thông qua kịch bản shell. Những người dùng đầu tiên của git đã viết các kịch bản shell của riêng họ để tự động hóa các tác vụ phổ biến; Dần dần, các tập lệnh này đã được tích hợp vào phân phối git (xem ví dụ đầu 839a7a0 ). Mỗi khi có nhu cầu mới, các kịch bản đều được điều chỉnh để cho phép. Rất lâu sau, một vài trong số các kịch bản này sẽ được viết lại trong C.

Sự kết hợp giữa lõi sạch, trực giao (mà bạn vẫn có thể sử dụng trực tiếp nếu bạn có nhu cầu), với lớp trên phát triển hữu cơ trên nó, là thứ mang lại sức mạnh cho nó. Tất nhiên, nó cũng là thứ mang lại cho nó một lượng lớn các lệnh và tùy chọn có tên kỳ quặc.


Việc nén, vẽ đồ thị, loại bỏ các số sửa đổi, nhấn mạnh vào việc phân nhánh, sắp xếp, từ xa ... Tất cả bắt nguồn từ đâu?

Rất nhiều thứ không có ở đầu.

Mặc dù mỗi đối tượng được nén riêng lẻ và tránh trùng lặp bằng cách đặt tên của chúng, các tệp "pack" chịu trách nhiệm nén cao mà chúng ta thường thấy trong git đã không tồn tại. Triết lý ban đầu là "không gian đĩa là rẻ".

Nếu theo "đồ thị", bạn có nghĩa là người xem đồ họa thích gitk, thì chúng xuất hiện sau (AFAIK, cái đầu tiên là gitk). AFAIK, BitKeeper cũng có trình xem lịch sử đồ họa.

Loại bỏ các số phiên bản, trên thực tế, khái niệm cốt lõi của git là sử dụng hệ thống tệp có địa chỉ nội dung để lưu trữ các đối tượng, chủ yếu đến từ đơn điệu . Vào thời điểm đó, đơn điệu là chậm; Nếu đây không phải là trường hợp, có thể Linus đã sử dụng nó thay vì tạo git.

Việc phân nhánh nhấn mạnh là điều không thể tránh khỏi trên một hệ thống kiểm soát phiên bản phân tán, vì mỗi bản sao hoạt động như một nhánh riêng biệt.

Stashing ( git stash) là, IIRC, khá gần đây. Các reflog, mà nó sử dụng, đã không có ở đầu.

Ngay cả điều khiển từ xa cũng không có ở đó. Ban đầu, bạn sao chép các đối tượng bằng tay bằng cách sử dụng rsync.

Từng người một, từng tính năng được thêm vào bởi một người nào đó. Không phải tất cả trong số họ - có lẽ thậm chí không phải hầu hết trong số họ - được viết bởi Linus. Mỗi khi bất cứ ai cảm thấy một nhu cầu mà git không đáp ứng, người ta có thể tạo ra một tính năng mới trên lớp "ống nước" cốt lõi của git và đề xuất nó để đưa vào. Nếu nó tốt, có lẽ nó sẽ được chấp nhận, tăng cường tiện ích của git (và độ phức tạp của dòng lệnh) hơn nữa.


"AFAIK, BitKeeper cũng có trình xem lịch sử đồ họa." Vâng, nó làm. Nó không chính xác đẹp, nhưng nó rất chức năng. Xem bitkeeper.com/Test.Using.Looking.html , mặc dù đó là một công việc kém trong việc hiển thị cách nó hiển thị các nhánh.
Bryan Oakley

1
Cũng là một bài đọc thú vị, một vài email được chọn từ đầu git, cho thấy một chút về sự tiến hóa ban đầu của nó: kerneltrap.org/node/4982
CesarB

Có phải các lập trình viên đã sử dụng để mô phỏng một số chức năng của git với cvs + rsync + httpd? Tôi rất muốn nghe những giải pháp tự chế nào có thể.
Sridhar Sarnobat

7

Tôi nghĩ rằng điểm chính đơn giản là git được thiết kế bởi người duy nhất có trình độ nhất trên hành tinh để làm điều đó. Và tôi không nói về tài năng, tôi đang nói về kinh nghiệm: Tôi nghi ngờ có ai khác chịu trách nhiệm về một cơ sở mã với sự kết hợp tương đương giữa kích thước và số lượng người đóng góp như hạt nhân Linux và vẫn thực sự xử lý hầu hết sự tích hợp tự làm việc

Vì vậy, Linus biết các yêu cầu và trường hợp sử dụng cho một hệ thống kiểm soát phiên bản phân tán tốt hơn bất kỳ ai khác. Và tất nhiên nó đã giúp phần lớn tiền mã hóa mà anh ta giao dịch là bằng C, và phần lớn hiệu năng của nó rất quan trọng.

Về cơ bản, đây là ví dụ cuối cùng về việc gãi ngứa của chính mình.


6
"Độc thân có trình độ nhất"? Tôi không nghĩ vậy. Có nhiều người thông minh có đủ điều kiện để viết kiểm soát nguồn phân tán. Những kẻ tại BitMover (công ty đứng sau BitKeeper) thực sự biết họ đang làm gì. Linus thậm chí còn cung cấp tín dụng cho Larry McVoy vì đã cho anh ta thấy cách kiểm soát mã nguồn nên hoạt động. Không có Larry thì sẽ không có git.
Bryan Oakley

1
@BryanOakley, tôi nghĩ rằng chúng ta có thể tránh bị đánh đập khi ai đó bổ sung cho ai đó những điều tốt đẹp. Cao bên trong tất cả mọi người biết rằng yêu cầu làm cho một nhà phát triển tuyệt vời. Vì vậy, nếu ngày mai, bạn gặp phải một vấn đề lớn, chúng tôi có thể nhớ đến bạn, như chúng tôi làm Dennis Ritchie. Không ai tốt hơn người khác, chỉ là họ đã bắt gặp một yêu cầu trên toàn thế giới thừa nhận và đưa ra giải pháp trước tiên.
Pankaj Upadhyay

2
@Bryan: Tôi chắc chắn rằng kinh nghiệm sử dụng BitKeeper cũng đã dạy Linus rất nhiều, và tôi nên đã đề cập đến điều đó. Và chắc chắn, có rất nhiều người thông minh, có trình độ khác biết họ đang làm gì. Nhưng tôi vẫn khẳng định rằng kinh nghiệm Linus' trong việc duy trì hạt nhân khiến ông hầu hết có trình độ, kinh nghiệm khôn ngoan. Tôi có thể sai, nhưng bạn có thể chỉ ra một dự án lớn như vậy, với càng nhiều người đóng góp, và nơi mà người chịu trách nhiệm cho tất cả vẫn tham gia sâu sắc vào việc lấy mã thực tế của tất cả những người đóng góp đó để làm việc cùng nhau?
Michael Borgwardt

@Pankaj Upadhyay: Tôi không làm phiền ai cả, tôi chỉ đơn giản là giải thích lý do tại sao tôi đánh giá thấp câu trả lời. Bạn đã nói điều gì đó về "cung cấp giải pháp trước" mà tôi nghĩ có nghĩa là bạn nghĩ git bằng cách nào đó "đầu tiên" trong một số vấn đề. Bạn nghĩ gì về nó lần đầu tiên? Nó chắc chắn không phải là công cụ scm phân tán đầu tiên bởi một cú sút xa.
Bryan Oakley

1
@DeadMG: Phần quan trọng hơn của tuyên bố đó xuất hiện sau đó "... và phần lớn hiệu suất của nó rất quan trọng". Tôi nghi ngờ bạn sẽ thấy nhiều người sẽ cho rằng C không phù hợp lắm để triển khai mã hiệu suất cao có chi phí thấp nếu bạn biết rõ về nó.
Michael Borgwardt

6

Nó được thiết kế khá chính xác như được mô tả trong The Git Parable .

Hãy tưởng tượng rằng bạn có một máy tính không có gì ngoài máy soạn thảo văn bản và một vài lệnh hệ thống tệp. Bây giờ hãy tưởng tượng rằng bạn đã quyết định viết một chương trình phần mềm lớn trên hệ thống này. Vì bạn là nhà phát triển phần mềm có trách nhiệm, bạn quyết định rằng bạn cần phát minh ra một số phương pháp để theo dõi các phiên bản phần mềm của mình để bạn có thể truy xuất mã mà bạn đã thay đổi hoặc xóa trước đó. Phần tiếp theo là câu chuyện về cách bạn có thể thiết kế một hệ thống kiểm soát phiên bản (VCS) như vậy và lý do đằng sau những lựa chọn thiết kế đó.

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.