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.