Git (phần mềm)

Git () là một hệ thống phần mềm quản lý phiên bản phân tán, có khả năng quản lý các phiên bản của mã nguồn hoặc dữ liệu. Nó thường được các lập trình viên sử dụng để quản lý mã nguồn khi phát triển phần mềm theo nhóm.

Các mục tiêu thiết kế của Git bao gồm: tốc độ, tính toàn vẹn dữ liệu và hỗ trợ các quy trình làm việc phân tán, phi tuyến tính với hàng nghìn nhánh song song chạy trên nhiều máy tính khác nhau.

Giống như hầu hết các hệ thống quản lý phiên bản phân tán khác, và khác với đa số hệ thống theo mô hình khách – chủ (client–server), Git lưu trữ một bản sao cục bộ của toàn bộ kho lưu trữ (repository, thường gọi tắt là “repo”), bao gồm cả lịch sử và khả năng theo dõi phiên bản, độc lập với kết nối mạng hay máy chủ trung tâm. Mỗi kho lưu trữ được lưu trên máy tính trong một thư mục chuẩn với các tệp ẩn bổ sung để cung cấp khả năng quản lý phiên bản. Git cung cấp các tính năng để đồng bộ thay đổi giữa các kho lưu trữ có chung lịch sử; đối với cộng tác bất đồng bộ, điều này mở rộng tới các kho trên những máy từ xa. Mặc dù tất cả các kho lưu trữ (có cùng lịch sử) về mặt lý thuyết là ngang hàng, các lập trình viên thường sử dụng một máy chủ trung tâm để lưu một bản tích hợp.

Git là phần mềm miễn phí mã nguồn mở được phân phối theo giấy phép GPL-2.0-only.

Git ban đầu được Linus Torvalds tạo ra để quản lý phiên bản trong quá trình phát triển Linux kernel. Nhãn hiệu “Git” được đăng ký bởi Software Freedom Conservancy.

Ngày nay, Git là hệ thống quản lý phiên bản được sử dụng phổ biến nhất bởi các lập trình viên. Đây là hệ thống quản lý phiên bản phân tán phổ biến nhất, với gần 95% lập trình viên cho biết đây là hệ thống quản lý phiên bản chính mà họ sử dụng tính đến năm 2022. Git là công cụ quản lý mã nguồn được dùng rộng rãi nhất trong giới lập trình viên chuyên nghiệp. Nhiều dịch vụ kho Git được cung cấp, bao gồm GitHub, SourceForge, Bitbucket và GitLab.

==Lịch sử==
Torvalds bắt đầu phát triển Git vào tháng 4 năm 2005 sau khi giấy phép miễn phí của hệ thống quản lý mã nguồn (SCM) độc quyền được dùng cho phát triển nhân Linux từ năm 2002 là BitKeeper bị thu hồi đối với dự án Linux. Chủ sở hữu bản quyền BitKeeper, Larry McVoy, cho rằng Andrew Tridgell đã tạo ra SourcePuller bằng cách đảo ngược các giao thức của BitKeeper. Sự kiện này cũng thúc đẩy sự ra đời của Mercurial, một hệ thống quản lý phiên bản khác.

Torvalds muốn có một hệ thống phân tán có thể sử dụng theo cách giống BitKeeper, nhưng không hệ thống miễn phí nào hiện có đáp ứng được nhu cầu của ông. Ông dẫn ví dụ một hệ thống quản lý mã nguồn cần tới 30 giây để áp dụng một bản vá và cập nhật toàn bộ siêu dữ liệu liên quan, và nhận xét rằng điều này không thể mở rộng cho nhu cầu phát triển nhân Linux, nơi việc đồng bộ với các người bảo trì khác có thể đòi hỏi thực hiện 250 thao tác như vậy cùng lúc. Về tiêu chí thiết kế, ông đặt yêu cầu việc áp dụng một bản vá không được mất quá ba giây, và bổ sung ba mục tiêu nữa:
- Lấy Concurrent Versions System (CVS) làm ví dụ "không nên" làm theo; nếu phân vân, hãy đưa ra quyết định ngược lại hoàn toàn.
- Hỗ trợ một quy trình làm việc phân tán, giống BitKeeper.
- Bao gồm các cơ chế bảo vệ rất mạnh chống lại sự hỏng hóc dữ liệu, dù là vô ý hay cố ý.

Những tiêu chí này đã loại bỏ mọi hệ thống quản lý phiên bản đang được dùng vào thời điểm đó, nên ngay sau khi nhân Linux 2.6.12-rc2 được phát hành, Torvalds bắt tay viết hệ thống riêng của mình.

Việc phát triển Git bắt đầu vào ngày 3 tháng 4 năm 2005. Torvalds công bố dự án ngày 6 tháng 4 và ngày hôm sau đã dùng chính Git để quản lý và lưu trữ mã nguồn của chính nó. Lần gộp ("merge") nhiều nhánh đầu tiên diễn ra ngày 18 tháng 4. Torvalds đã đạt được các mục tiêu về hiệu năng; ngày 29 tháng 4, phiên bản Git còn sơ khai được benchmark với tốc độ ghi các bản vá vào cây mã nguồn nhân Linux là 6,7 bản vá mỗi giây. Ngày 16 tháng 6, Git đã quản lý được bản phát hành nhân 2.6.12.

Torvalds chuyển việc bảo trì dự án ngày 26 tháng 7 năm 2005 cho Junio Hamano, một trong những người đóng góp chính. Hamano chịu trách nhiệm phát hành phiên bản 1.0 vào ngày 21 tháng 12 năm 2005.

===Tên gọi===
Torvalds từng nói đùa một cách châm biếm về cái tên "git" (tiếng lóng Anh–Anh, chỉ một người khó ưa hoặc ngớ ngẩn): “I'm an egotistical bastard, and I name all my projects after myself. First ‘Linux’, now ‘git’.” (“Tôi là một thằng tự cao tự đại, và tôi đặt tên mọi dự án của mình theo tên tôi. Trước là ‘Linux’, giờ là ‘git’.") Trang hướng dẫn của chính Git mô tả Git là “trình theo dõi nội dung ngu ngốc” (“the stupid content tracker”).

Tệp read-me trong mã nguồn giải thích thêm:

Trong mã nguồn của Git, chương trình còn được gọi là “the information manager from hell” (trình quản lý thông tin đến từ địa ngục).

==Khái niệm cơ bản trong Git==
- Repository

Trong Repo có 2 cấu trúc dữ liệu chính là Object Store và Index. Tất cả dữ liệu của Repo đều được chứa trong thư mục bạn đang làm việc dưới dạng folder ẩn có tên là.git (không có phần tên trước dấu chấm).

- Object store

- Index

Index không chứa nội dung file mà chỉ dùng để truy tìm (track) những thứ mà bạn muốn commit.

==Các bản triển khai==
Git (bản triển khai chính viết bằng C) chủ yếu được phát triển trên Linux, mặc dù nó cũng hỗ trợ hầu hết các hệ điều hành lớn khác, bao gồm các hệ điều hành BDS (DragonFly BSD, FreeBSD, NetBSD, và OpenBSD), Solaris, macOS, và Windows.

Bản port đầu tên của Git lên Windows chủ yếu dựa trên một framework] mô phỏng Linux, dùng để chạy bản Git dành cho Linux. Khi cài Git trên Windows, hệ thống sẽ tạo một thư mục trong Program Files với tên gần giống, chứa bản port Mingw-w64 của GNU Compiler Collection, Perl 5, MSYS2 (bản fork của Cygwin – một môi trường mô phỏng kiểu Unix trên Windows) và nhiều bản port hoặc lớp mô phỏng khác của các tiện ích và thư viện Linux cho Windows. Hiện nay, các bản dựng Git “native” cho Windows được phân phối dưới dạng bộ cài 32-bit và 64-bit. Trang web chính thức của Git hiện vẫn duy trì một bản Git dành cho Windows, tiếp tục sử dụng môi trường MSYS2.

"JGit" là một bản triển khai Git dưới dạng thư viện phần mềm thuần Java, được thiết kế để nhúng vào bất kỳ ứng dụng Java nào. JGit được sử dụng trong công cụ review mã Gerrit, và trong EGit – một client Git dành cho môi trường phát triển Eclipse.

"Go-git" là một bản triển khai Git mã nguồn mở, viết hoàn toàn bằng Go. Hiện nó đang được dùng làm nền cho các dự án như cung cấp giao diện SQL cho các kho mã Git và cung cấp khả năng mã hóa cho Git.

"Dulwich" là một bản triển khai Git viết hoàn toàn bằng Python, hỗ trợ CPython 3.6 trở lên và PyPy.

"Llibgit2" là một bản triển khai Git dưới dạng thư viện phần mềm ANSI C không có phụ thuộc nào khác, có thể biên dịch trên nhiều nền tảng, bao gồm Windows, Linux, macOS và BSD. Thư viện này có binding cho nhiều ngôn ngữ lập trình, bao gồm Ruby, Python, và Haskell.

"JS-Git" là một bản triển khai JavaScript của một tập con chức năng của Git.

"Game of Trees" là một bản triển khai Git mã nguồn mở dành cho dự án OpenBSD.

git9 là một bản triển khai Git độc lập cho hệ điều hành Plan 9, sử dụng các lớp trừu tượng gốc của hệ thống này.

==Phần mềm hỗ trợ==
Có nhiều website và phần mềm cho phép lưu trữ (miễn phí và có phí) Git.

- BerliOS
- GitHub
- GitLab
- Gitorious
- Sourceforge
- GNU Savannah
- GitEnterprise

== Liên kết ngoài ==
- Git Magic – một quyển sách hay về Git đã được dịch ra tiếng Việt.
- Git Community Book – nơi có thể tìm thấy các tài liệu hướng dẫn