Git (/ɡɪt/ Tập âm thanh "en-uk-git.ogg" không có sẵn[7]) là một hệ thống phần mềm quản lý phiên bản phân tán,[8] 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.

Git
Tác giả gốcLinus Torvalds[1]
Nhà phát triểnJunio Hamano và những người khác[2]
Phát hành lần đầu7 tháng 4 năm 2005; 21 năm trước (2005-04-07)
Kho mã nguồn
  • {{URL|example.com|văn bản hiển thị tùy chọn}}Lỗi Lua trong Mô_đun:EditAtWikidata tại dòng 29: attempt to index field 'wikibase' (a nil value).
Viết bằngChủ yếu là C, với GUIscipt được vuiết bằng Shell, Perl, TclPython[3][4]
Engine
    Lỗi Lua trong Mô_đun:EditAtWikidata tại dòng 29: attempt to index field 'wikibase' (a nil value).
    Hệ điều hànhPOSIX (Linux, macOS, Solaris, AIX) Windows
    Nền tảngPOSIX
    Thể loạiHệ thống quản lý phiên bản
    Giấy phépGNU GPL v2[5][6]

    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.[9][10][11]

    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.[12] 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 tự do 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.[13] 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,[14][15] 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.[16] 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, BitbucketGitLab.[17][18][19][20][21]

    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 BitKeeper – 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 – bị thu hồi đối với dự án Linux.[22][23] Chủ sở hữu bản quyền BitKeeper là 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.[24] 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:[9]

    • 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.[11]
    • Hỗ trợ một quy trình làm việc phân tán, giống BitKeeper.[11]
    • 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ố ý.[10]

    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 vào việc viết hệ thống riêng của mình.[11]

    Việc phát triển Git bắt đầu vào ngày 3 tháng 4 năm 2005.[25] 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ó.[25][26] Lần gộp (merge) nhiều nhánh đầu tiên diễn ra ngày 18 tháng 4.[27] 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.[28] Vào ngày 16 tháng 6, Git đã quản lý được bản phát hành nhân 2.6.12.[29]

    Ngày 26 tháng 7 năm 2005, Torvalds chuyển việc bảo trì dự án cho Junio Hamano, một trong những người đóng góp chính.[30] 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.[31]

    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’.")[32][33] Trang hướng dẫn của chính Git mô tả đây là "trình theo dõi nội dung ngu ngốc" ("the stupid content tracker").[34]

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

    "git" có thể có nghĩa là bất cứ thứ gì, tùy vào tâm trạng của bạn.

    • Một tổ hợp ba chữ cái ngẫu nhiên, phát âm được, và không được dùng bởi bất kỳ lệnh UNIX phổ biến nào. Việc nó là cách phát âm sai của "get" có thể có, hoặc không liên quan.
    • Ngu ngốc. Đáng khinh bỉ và tệ hại. Đơn giản. Bạn có thể chọn bất cứ nghĩa nào trong từ điển tiếng lóng.
    • "Global information tracker" (trình theo dõi thông tin toàn cục): khi bạn đang vui, và nó thực sự hoạt động đúng ý bạn. Thiên thần cất tiếng hát, và căn phòng bỗng tràn ngập ánh sáng.
    • "Goddamn idiotic truckload of sh*t" (cả một đống rác ngu xuẩn chết tiệt): dùng để chỉ nó khi mọi thứ hỏng bét.

    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).[36][37]

    Đặc trưng

    Thiết kế

    Thiết kế của Git là một sự tổng hợp giữa kinh nghiệm của Torvalds với Linux trong việc duy trì một dự án phát triển phân tán lớn, hiểu biết sâu sắc của ông về hiệu năng hệ thống tệp thu được từ chính dự án đó, và nhu cầu cấp bách phải tạo ra một hệ thống hoạt động được trong thời gian ngắn. Những yếu tố này dẫn tới các lựa chọn cài đặt sau:[13]

    Hỗ trợ mạnh cho phát triển phi tuyến tính
    Git hỗ trợ việc tạo nhánh (branching) và gộp nhánh (merging) rất nhanh, và cung cấp các công cụ riêng để trực quan hóa và điều hướng lịch sử phát triển phi tuyến. Trong Git, một giả định cốt lõi là một thay đổi sẽ được gộp (merge) nhiều lần hơn là được viết ra, khi nó được chuyển qua lại giữa nhiều người đánh giá khác nhau. Trong Git, nhánh rất nhẹ: một nhánh chỉ là một tham chiếu (reference) trỏ tới một commit.
    Phát triển phân tán
    Cũng giống như Darcs, BitKeeper, Mercurial, Bazaar, và Monotone, Git cung cấp cho mỗi lập trình viên một bản sao cục bộ của toàn bộ lịch sử phát triển; các thay đổi được sao chép từ kho này sang kho khác. Những thay đổi này được nhập vào như các nhánh phát triển bổ sung và có thể được gộp lại theo cách giống như một nhánh được phát triển cục bộ.[38]
    Tương thích với các hệ thống và giao thức hiện có
    Các kho Git có thể được công bố qua Hypertext Transfer Protocol Secure (HTTPS), Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP), hoặc giao thức Git chạy trên socket thuần hoặc trên Secure Shell (ssh). Git cũng có một chế độ giả lập máy chủ CVS, cho phép sử dụng các client CVS và plugin môi trường phát triển hiện có để truy cập các kho Git. Các kho Subversion có thể được sử dụng trực tiếp thông qua git-svn.[39]
    Xử lý hiệu quả các dự án lớn
    orvalds mô tả Git là "rất nhanh và có khả năng mở rộng tốt",[40] và các bài kiểm tra hiệu năng do Mozilla thực hiện[41] cho thấy Git nhanh hơn khoảng một bậc độ lớn so với Mercurial và GNU Bazaar trong việc phân biệt các kho lớn; việc nạp lịch sử phiên bản từ một kho lưu trữ cục bộ có thể nhanh hơn tới một trăm lần so với lấy từ máy chủ từ xa.[42]
    Xác thực lịch sử bằng mật mã
    Lịch sử trong Git được lưu trữ theo cách mà ID của một phiên bản cụ thể (một commit theo thuật ngữ Git) phụ thuộc vào toàn bộ lịch sử phát triển dẫn tới commit đó. Khi đã được công bố, không thể thay đổi các phiên bản cũ mà không bị phát hiện. Cấu trúc này tương tự như một cây Merkle, nhưng có thêm dữ liệu tại các nút và lá.[43] (Mercurial và Monotone cũng có đặc điểm này.)
    Thiết kế dựa trên bộ công cụ
    Git được thiết kế như một tập hợp các chương trình viết bằng C cùng với một số shell script đóng vai trò "wrapper" bao quanh các chương trình đó.[44] Mặc dù phần lớn các script này sau đó đã được viết lại bằng C để tăng tốc độ và khả năng di chuyển, thiết kế theo kiểu bộ công cụ vẫn được giữ lại, và việc xâu chuỗi các thành phần lại với nhau rất dễ dàng[45]
    Chiến lược gộp có thể thay thế
    Là một phần của thiết kế dạng toolkit, Git có một mô hình được định nghĩa rõ ràng cho một trạng thái gộp chưa hoàn tất, và có nhiều thuật toán khác nhau để hoàn tất việc gộp đó, cuối cùng nếu không xử lý tự động được sẽ thông báo cho người dùng rằng cần chỉnh sửa thủ công.[46]
    Rác tích tụ cho đến khi được gom dọn
    Việc hủy bỏ thao tác hoặc quay lại các thay đổi sẽ để lại những đối tượng "bị treo" (dangling objects) không còn hữu ích trong cơ sở dữ liệu. Về tổng thể, chúng chỉ chiếm một phần nhỏ trong lịch sử ngày càng lớn của các đối tượng cần giữ lại. Git sẽ tự động thực hiện các các bãi rác khi đủ nhiều đối tượng "rời rạc" (loose objects) được tạo ra trong kho. Người dùng cũng có thể gọi việc thu gom rác một cách tường minh bằng lệnh git gc.[47][48]
    Đóng gói đối tượng định kỳ
    Git lưu mỗi đối tượng mới được tạo như một tệp riêng. Mặc dù mỗi tệp được nén riêng lẻ, điều này vẫn chiếm nhiều không gian và không hiệu quả. Vấn đề được giải quyết bằng cách sử dụng các pack – gom rất nhiều đối tượng lại, nén delta lẫn nhau trong một tệp (hoặc một luồng byte trên mạng) gọi là packfile. Các pack được nén dựa trên heuristics rằng những tệp cùng tên thường giống nhau, nhưng không phụ thuộc vào điều này để đảm bảo tính đúng đắn. Một tệp chỉ mục (index) tương ứng được tạo cho mỗi packfile, ghi lại vị trí (offset) của từng đối tượng trong packfile. Các đối tượng mới được tạo (gắn với lịch sử mới) vẫn được lưu ở dạng tách rời, và cần đóng gói lại định kỳ để duy trì hiệu quả về dung lượng. Quá trình đóng gói kho có thể rất tốn tài nguyên tính toán. Bằng cách cho phép đối tượng tồn tại ban đầu ở dạng "lỏng" (loose) nhưng tạo ra nhanh chóng, Git cho phép hoãn thao tác pack tốn kém sang lúc khác, khi thời gian không còn quá quan trọng, ví dụ cuối ngày làm việc. Git thực hiện repack định kỳ tự động, nhưng cũng có thể repack thủ công bằng lệnh git gc command.[49] Để đảm bảo toàn vẹn dữ liệu, cả packfile và index của nó đều chứa một checksum SHA-1,[50] và tên tệp của packfile cũng chứa một checksum SHA-1. Để kiểm tra tính toàn vẹn của một kho, dùng lệnh git fsck.[51][52]
    Một đặc tính khác của Git là nó chụp snapshot cây thư mục các tệp. Các hệ thống theo dõi phiên bản sớm nhất như SCCS (Source Code Control System) và RCS (Revision Control System) làm việc trên từng tệp riêng lẻ và nhấn mạnh việc tiết kiệm không gian bằng interleaved deltas (SCCS) hoặc mã hóa delta (RCS) giữa các phiên bản (thường rất giống nhau). Các hệ thống sau này vẫn giữ khái niệm "một tệp có một danh tính xuyên suốt nhiều phiên bản". Tuy nhiên, Torvalds đã bác bỏ khái niệm này.[53]Do đó, Git không ghi nhận rõ ràng quan hệ giữa các phiên bản tệp ở bất kỳ mức độ nào bên dưới cây mã nguồn.

    Hạn chế

    Những quan hệ phiên bản ngầm này dẫn tới một số hệ quả đáng kể:

    • Việc xem lịch sử thay đổi của một tệp tốn chi phí hơn một chút so với xem lịch sử của cả dự án.[54] Để có lịch sử các thay đổi ảnh hưởng tới một tệp, Git phải duyệt toàn bộ lịch sử toàn cục rồi kiểm tra xem mỗi thay đổi có sửa tệp đó hay không. Tuy nhiên, cách duyệt lịch sử này cho phép Git tạo ra, với hiệu quả tương đương, một lịch sử duy nhất cho bất kỳ tập tệp nào. Ví dụ, một thư mục con của cây mã nguồn cộng với một tệp header dùng chung toàn cục là một trường hợp rất phổ biến.
    • Việc đổi tên được xử lý một cách ngầm chứ không ghi rõ ràng. Một phàn nàn thường gặp với CVS là nó sử dụng tên tệp để nhận diện lịch sử phiên bản; do đó, việc di chuyển hoặc đổi tên tệp không thể thực hiện được mà không: hoặc là cắt đứt lịch sử, hoặc là "đổi tên lịch sử", từ đó làm lịch sử không còn chính xác. Hầu hết các hệ thống quản lý phiên bản sau CVS giải quyết vấn đề này bằng cách gán cho mỗi tệp một tên định danh dài hạn (tương tự số inode) sống sót qua việc đổi tên. Git không lưu lại loại định danh này, và điều đó được coi là một ưu điểm.[55][56] Các tệp mã nguồn đôi khi bị tách nhỏ, gộp lại, hoặc đơn giản là đổi tên,[57] và nếu ghi nhận chúng chỉ như một lần đổi tên thì sẽ "đóng băng" một mô tả không chính xác về những gì thực sự đã xảy ra trong lịch sử (vốn là bất biến). Git giải quyết vấn đề bằng cách phát hiện đổi tên khi duyệt lịch sử snapshot, chứ không ghi nhận lúc tạo snapshot.[58] (Tóm laị, với một tệp trong phiên bản N, thì tệp cùng tên trong phiên bản N − 1 là tổ tiên mặc định của nó. Tuy nhiên, nếu không có tệp cùng tên trong N − 1, Git sẽ tìm một tệp chỉ tồn tại trong N − 1 và rất giống với tệp mới.) Cơ chế này đòi hỏi tốn CPU hơn mỗi khi xem lịch sử, và có nhiều tùy chọn để tinh chỉnh heuristics. Cơ chế này không phải lúc nào cũng chính xác; đôi khi một tệp được đổi tên đồng thời với việc chỉnh sửa trong cùng một commit sẽ bị hiểu nhầm là xóa tệp cũ và tạo tệp mới. Lập trình viên có thể "lách" hạn chế này bằng cách commit thao tác đổi tên và phần thay đổi nội dung thành hai commit riêng.

    Các bản triển khai

    Tập tin:GNOME gitg.png
    gitg là một giao diện đồ họa (graphical front-end) sử dụng GTK+.

    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.[59][60]

    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.[61] 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.[62]

    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.[63]

    Go-git là một bản triển khai Git mã nguồn mở, viết hoàn toàn bằng Go.[64] 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[65] và cung cấp khả năng mã hóa cho Git.[66]

    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.[67]

    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.[68] Thư viện này có binding cho nhiều ngôn ngữ lập trình, bao gồm Ruby, Python, và Haskell.[69][70][71]

    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.[72]

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

    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.[74][75]

    Lịch sử phát triển

    Phiên bản Ngày đầu phát hành Phiên bản mới nhất Ngày phát hành
    Phiên bản cũ, không còn được hỗ trợ: 0.99 2005-07-11 0.99.9n 2005-12-15
    Phiên bản cũ, không còn được hỗ trợ: 1.0 2005-12-21 1.0.13 2006-01-27
    Phiên bản cũ, không còn được hỗ trợ: 1.1 2006-01-08 1.1.6 2006-01-30
    Phiên bản cũ, không còn được hỗ trợ: 1.2 2006-02-12 1.2.6 2006-04-08
    Phiên bản cũ, không còn được hỗ trợ: 1.3 2006-04-18 1.3.3 2006-05-16
    Phiên bản cũ, không còn được hỗ trợ: 1.4 2006-06-10 1.4.4.5 2008-07-16
    Phiên bản cũ, không còn được hỗ trợ: 1.5 2007-02-14 1.5.6.6 2008-12-17
    Phiên bản cũ, không còn được hỗ trợ: 1.6 2008-08-17 1.6.6.3 2010-12-15
    Phiên bản cũ, không còn được hỗ trợ: 1.7 2010-02-13 1.7.12.4 2012-10-17
    Phiên bản cũ, không còn được hỗ trợ: 1.8 2012-10-21 1.8.5.6 2014-12-17
    Phiên bản cũ, không còn được hỗ trợ: 1.9 2014-02-14 1.9.5 2014-12-17
    Phiên bản cũ, không còn được hỗ trợ: 2.0 2014-05-28 2.0.5 2014-12-17
    Phiên bản cũ, không còn được hỗ trợ: 2.1 2014-08-16 2.1.4 2014-12-17
    Phiên bản cũ, không còn được hỗ trợ: 2.2 2014-11-26 2.2.3 2015-09-04
    Phiên bản cũ, không còn được hỗ trợ: 2.3 2015-02-05 2.3.10 2015-09-29
    Phiên bản cũ, không còn được hỗ trợ: 2.4 2015-04-30 2.4.11 2016-03-17
    Phiên bản cũ, không còn được hỗ trợ: 2.5 2015-07-27 2.5.5 2016-03-17
    Phiên bản cũ, không còn được hỗ trợ: 2.6 2015-09-28 2.6.6 2016-03-17
    Phiên bản cũ, không còn được hỗ trợ: 2.7 2015-10-04 2.7.4 2016-03-17
    Phiên bản cũ, không còn được hỗ trợ: 2.8 2016-03-28 2.8.4 2016-06-06
    Phiên bản cũ, không còn được hỗ trợ: 2.9 2016-06-13 2.9.3 2016-08-12
    Phiên bản cũ, không còn được hỗ trợ: 2.10 2016-09-02 2.10.5 2017-09-22
    Phiên bản cũ, không còn được hỗ trợ: 2.11 2016-11-29 2.11.4 2017-09-22
    Phiên bản cũ, không còn được hỗ trợ: 2.12 2017-02-24 2.12.5 2017-09-22
    Phiên bản cũ, vấn được hỗ trợ: 2.13 2017-05-10 2.13.7 2018-05-22
    Phiên bản cũ, vấn được hỗ trợ: 2.14 2017-08-04 2.14.5 2018-09-27
    Phiên bản cũ, vấn được hỗ trợ: 2.15 2017-10-30 2.15.3 2018-09-27
    Phiên bản cũ, vấn được hỗ trợ: 2.16 2018-01-17 2.16.5 2018-09-27
    Phiên bản cũ, vấn được hỗ trợ: 2.17 2018-04-02 2.17.2 2018-09-27
    Phiên bản cũ, vấn được hỗ trợ: 2.18 2018-06-21 2.18.1 2018-09-27
    Phiên bản cũ, vấn được hỗ trợ: 2.19 2018-09-10 2.19.2 2018-11-21
    Phiên bản cũ, vấn được hỗ trợ: 2.20 2018-12-09 2.20.1 2018-12-15
    Phiên bản ổn định hiện tại: 2.21 2019-02-24 2.21.0 2019-02-24
    Chú giải:
    Phiên bản cũ
    Phiên bản cũ, vẫn được hỗ trợ
    Phiên bản mới nhất
    Phiên bản xem trước mới nhất
    Ra mắt trong tương lai

    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.

    Tham khảo

    1. ^ "Initial revision of "git", the information manager from hell". GitHub. ngày 8 tháng 4 năm 2005. Lưu trữ bản gốc ngày 16 tháng 11 năm 2015. Truy cập ngày 20 tháng 12 năm 2015.
    2. ^ Lỗi chú thích: Thẻ <ref> không hợp lệ; không có nội dung trong ref có tên git-commits
    3. ^ "Git website". Lưu trữ bản gốc ngày 9 tháng 6 năm 2022. Truy cập ngày 9 tháng 6 năm 2022.
    4. ^ "Git Source Code Mirror". GitHub. Lưu trữ bản gốc ngày 3 tháng 6 năm 2022. Truy cập ngày 9 tháng 6 năm 2022.
    5. ^ "Git's LGPL license at github.com". GitHub. ngày 20 tháng 5 năm 2011. Lưu trữ bản gốc ngày 11 tháng 4 năm 2016. Truy cập ngày 12 tháng 10 năm 2014.
    6. ^ "Git's GPL license at github.com". GitHub. ngày 18 tháng 1 năm 2010. Lưu trữ bản gốc ngày 11 tháng 4 năm 2016. Truy cập ngày 12 tháng 10 năm 2014.
    7. ^ Tech Talk: Linus Torvalds on git. ngày 14 tháng 5 năm 2007. Sự kiện xảy ra vào lúc 00:01:30. Lưu trữ bản gốc ngày 20 tháng 12 năm 2015. Truy cập ngày 20 tháng 7 năm 2014 – qua YouTube.
    8. ^ Chacon & Straub 2014, tr. 29-31.
    9. ^ a b Torvalds, Linus (ngày 7 tháng 4 năm 2005). "Re: Kernel SCM saga..." linux-kernel (Danh sách thư). Lưu trữ bản gốc ngày 1 tháng 7 năm 2019. Truy cập ngày 3 tháng 2 năm 2017. "So I'm writing some scripts to try to track things a whole lot faster."
    10. ^ a b Torvalds, Linus (ngày 10 tháng 6 năm 2007). "Re: fatal: serious inflate inconsistency". git (Danh sách thư). Lưu trữ bản gốc ngày 28 tháng 12 năm 2022. Truy cập ngày 3 tháng 2 năm 2017.
    11. ^ a b c d Linus Torvalds (ngày 3 tháng 5 năm 2007). Google tech talk: Linus Torvalds on git. Sự kiện xảy ra vào lúc 02:30. Lưu trữ bản gốc ngày 28 tháng 5 năm 2007. Truy cập ngày 16 tháng 5 năm 2007.
    12. ^ Chacon, Scott (ngày 24 tháng 12 năm 2014). Pro Git (ấn bản thứ 2). New York, NY: Apress. tr. 29–30. ISBN 978-1-4842-0077-3. Lưu trữ bản gốc ngày 25 tháng 12 năm 2015.
    13. ^ a b "A Short History of Git". Pro Git (ấn bản thứ 2). Apress. 2014. Lưu trữ bản gốc ngày 25 tháng 12 năm 2015. Truy cập ngày 26 tháng 12 năm 2015.
    14. ^ Shirey, Russell G. (ngày 1 tháng 3 năm 2015). "Git as an Encrypted Distributed Version Control System" (PDF). Defense Technical Information Center. tr. 38. Truy cập ngày 13 tháng 7 năm 2025.
    15. ^ Knüpfer, Andreas; Callow, Timothy J. (2025). "Data Version Management and Machine-Actionable Reproducibility for HPC based on git and DataLad". arXiv:2505.06558 [cs.DC].
    16. ^ "Stack Overflow Developer Survey 2022". Stack Overflow (bằng tiếng Anh). Lưu trữ bản gốc ngày 27 tháng 6 năm 2022. Truy cập ngày 4 tháng 8 năm 2022.
    17. ^ Krill, Paul (ngày 28 tháng 9 năm 2016). "Enterprise repo wars: GitHub vs. GitLab vs. Bitbucket". InfoWorld. Lưu trữ bản gốc ngày 2 tháng 2 năm 2020. Truy cập ngày 2 tháng 2 năm 2020.
    18. ^ "github.com Competitive Analysis, Marketing Mix and Traffic". Alexa. Bản gốc lưu trữ ngày 31 tháng 3 năm 2013. Truy cập ngày 2 tháng 2 năm 2020.
    19. ^ "sourceforge.net Competitive Analysis, Marketing Mix and Traffic". Alexa. Lưu trữ bản gốc ngày 20 tháng 10 năm 2020. Truy cập ngày 2 tháng 2 năm 2020.
    20. ^ "bitbucket.org Competitive Analysis, Marketing Mix and Traffic". Alexa. Bản gốc lưu trữ ngày 23 tháng 6 năm 2017. Truy cập ngày 2 tháng 2 năm 2020.
    21. ^ "gitlab.com Competitive Analysis, Marketing Mix and Traffic". Alexa. Lưu trữ bản gốc ngày 30 tháng 11 năm 2017. Truy cập ngày 2 tháng 2 năm 2020.
    22. ^ Brown, Zack (ngày 27 tháng 7 năm 2018). "A Git Origin Story". Linux Journal. Linux Journal. Lưu trữ bản gốc ngày 13 tháng 4 năm 2020. Truy cập ngày 28 tháng 5 năm 2020.
    23. ^ "BitKeeper and Linux: The end of the road?". Linux.com (bằng tiếng Anh). ngày 11 tháng 4 năm 2005. Truy cập ngày 18 tháng 5 năm 2023.
    24. ^ McAllister, Neil (ngày 2 tháng 5 năm 2005). "Linus Torvalds' BitKeeper blunder". InfoWorld. Lưu trữ bản gốc ngày 26 tháng 8 năm 2015. Truy cập ngày 8 tháng 9 năm 2015.
    25. ^ a b Torvalds, Linus (ngày 27 tháng 2 năm 2007). "Re: Trivia: When did git self-host?". git (Danh sách thư). Lưu trữ bản gốc ngày 8 tháng 4 năm 2023. Truy cập ngày 3 tháng 2 năm 2017.
    26. ^ Torvalds, Linus (ngày 6 tháng 4 năm 2005). "Kernel SCM saga." linux-kernel (Danh sách thư). Lưu trữ bản gốc ngày 8 tháng 6 năm 2023. Truy cập ngày 3 tháng 2 năm 2017.
    27. ^ Torvalds, Linus (ngày 17 tháng 4 năm 2005). "First ever real kernel git merge!". git (Danh sách thư). Lưu trữ bản gốc ngày 15 tháng 8 năm 2021. Truy cập ngày 3 tháng 2 năm 2017.
    28. ^ Mackall, Matt (ngày 29 tháng 4 năm 2005). "Mercurial 0.4b vs git patchbomb benchmark". git (Danh sách thư). Lưu trữ bản gốc ngày 15 tháng 8 năm 2021. Truy cập ngày 3 tháng 2 năm 2017.
    29. ^ Torvalds, Linus (ngày 17 tháng 6 năm 2005). "Linux 2.6.12". git-commits-head (Danh sách thư).
    30. ^ Torvalds, Linus (ngày 27 tháng 7 năm 2005). "Meet the new maintainer." git (Danh sách thư). Lưu trữ bản gốc ngày 15 tháng 8 năm 2021. Truy cập ngày 3 tháng 2 năm 2017.
    31. ^ Hamano, Junio C. (ngày 21 tháng 12 năm 2005). "Announce: Git 1.0.0". git (Danh sách thư). Lưu trữ bản gốc ngày 16 tháng 8 năm 2021. Truy cập ngày 3 tháng 2 năm 2017.
    32. ^ "GitFaq: Why the 'Git' name?". Git.or.cz. Lưu trữ bản gốc ngày 23 tháng 7 năm 2012. Truy cập ngày 14 tháng 7 năm 2012.
    33. ^ "After controversy, Torvalds begins work on 'git'". PC World. ngày 14 tháng 7 năm 2012. Bản gốc lưu trữ ngày 1 tháng 2 năm 2011. Torvalds seemed aware that his decision to drop BitKeeper would also be controversial. When asked why he called the new software, 'git', British slang meaning 'a rotten person', he said. 'I'm an egotistical bastard, so I name all my projects after myself. First Linux, now git.'
    34. ^ "git(1) Manual Page". Lưu trữ bản gốc ngày 21 tháng 6 năm 2012. Truy cập ngày 21 tháng 7 năm 2012.
    35. ^ "Initial revision of 'git', the information manager from hell · git/git@e83c516". GitHub. Lưu trữ bản gốc ngày 8 tháng 10 năm 2017. Truy cập ngày 21 tháng 1 năm 2016.
    36. ^ "git/usage.c at master · git/git". GitHub (bằng tiếng Anh). Lưu trữ bản gốc ngày 26 tháng 2 năm 2025. Truy cập ngày 11 tháng 7 năm 2025.
    37. ^ Torvalds, Linus (ngày 7 tháng 4 năm 2005). "Initial revision of "git", the information manager from hell · git/git@e83c516". GitHub (bằng tiếng Anh). Lưu trữ bản gốc ngày 16 tháng 11 năm 2015. Truy cập ngày 11 tháng 7 năm 2025.
    38. ^ "Git – Distributed Workflows". Git. Lưu trữ bản gốc ngày 22 tháng 10 năm 2014. Truy cập ngày 15 tháng 6 năm 2020.
    39. ^ Gunjal, Siddhesh (ngày 19 tháng 7 năm 2019). "What is Version Control Tool? Explore Git and GitHub". Medium (bằng tiếng Anh). Lưu trữ bản gốc ngày 17 tháng 4 năm 2025. Truy cập ngày 25 tháng 10 năm 2020.
    40. ^ Torvalds, Linus (ngày 19 tháng 10 năm 2006). "Re: VCS comparison table". git (Danh sách thư). Lưu trữ bản gốc ngày 18 tháng 6 năm 2017. Truy cập ngày 3 tháng 2 năm 2017.
    41. ^ Jst's Blog on Mozillazine "bzr/hg/git performance". Bản gốc lưu trữ ngày 29 tháng 5 năm 2010. Truy cập ngày 12 tháng 2 năm 2015.
    42. ^ Dreier, Roland (ngày 13 tháng 11 năm 2006). "Oh what a relief it is". Lưu trữ bản gốc ngày 16 tháng 1 năm 2009., observing that "git log" is 100x faster than "svn log" because the latter must contact a remote server.
    43. ^ "Trust". Git Concepts. Git User's Manual. ngày 18 tháng 10 năm 2006. Lưu trữ bản gốc ngày 22 tháng 2 năm 2017.
    44. ^ Torvalds, Linus. "Re: VCS comparison table". git (Danh sách thư). Lưu trữ bản gốc ngày 11 tháng 4 năm 2016. Truy cập ngày 10 tháng 4 năm 2009., describing Git's script-oriented design
    45. ^ iabervon (ngày 22 tháng 12 năm 2005). "Git rocks!". Lưu trữ bản gốc ngày 14 tháng 9 năm 2016., praising Git's scriptability.
    46. ^ "Git – Git SCM Wiki". git.wiki.kernel.org. Lưu trữ bản gốc ngày 6 tháng 2 năm 2010. Truy cập ngày 25 tháng 10 năm 2020.
    47. ^ Chacon & Straub 2014.
    48. ^ "Git User's Manual". ngày 10 tháng 3 năm 2020. Lưu trữ bản gốc ngày 10 tháng 5 năm 2020.
    49. ^ Chacon & Straub 2014, tr. 499.
    50. ^ Chacon & Straub 2014, tr. 33-34.
    51. ^ "Git – Packfiles". Git. Lưu trữ bản gốc ngày 26 tháng 7 năm 2025. Truy cập ngày 25 tháng 8 năm 2025.
    52. ^ Chacon & Straub 2014, tr. 568.
    53. ^ Torvalds, Linus (ngày 10 tháng 4 năm 2005). "Re: more git updates." linux-kernel (Danh sách thư). Lưu trữ bản gốc ngày 18 tháng 6 năm 2017. Truy cập ngày 3 tháng 2 năm 2017.
    54. ^ Haible, Bruno (ngày 11 tháng 2 năm 2007). "how to speed up 'git log'?". git (Danh sách thư). Lưu trữ bản gốc ngày 18 tháng 6 năm 2017. Truy cập ngày 3 tháng 2 năm 2017.
    55. ^ Torvalds, Linus (ngày 1 tháng 3 năm 2006). "Re: impure renames / history tracking". git (Danh sách thư). Lưu trữ bản gốc ngày 3 tháng 5 năm 2017. Truy cập ngày 3 tháng 2 năm 2017.
    56. ^ Hamano, Junio C. (ngày 24 tháng 3 năm 2006). "Re: Errors GITtifying GCC and Binutils". git (Danh sách thư). Lưu trữ bản gốc ngày 18 tháng 6 năm 2017. Truy cập ngày 3 tháng 2 năm 2017.
    57. ^ Hamano, Junio C. (ngày 23 tháng 3 năm 2006). "Re: Errors GITtifying GCC and Binutils". git (Danh sách thư). Lưu trữ bản gốc ngày 18 tháng 6 năm 2017. Truy cập ngày 3 tháng 2 năm 2017.
    58. ^ Torvalds, Linus (ngày 28 tháng 11 năm 2006). "Re: git and bzr". git (Danh sách thư). Lưu trữ bản gốc ngày 18 tháng 6 năm 2017. Truy cập ngày 3 tháng 2 năm 2017., on using git-blame to show code moved between source files.
    59. ^ "downloads". Lưu trữ bản gốc ngày 8 tháng 5 năm 2012. Truy cập ngày 14 tháng 5 năm 2012.
    60. ^ "git package versions – Repology". Bản gốc lưu trữ ngày 19 tháng 1 năm 2022. Truy cập ngày 30 tháng 11 năm 2021.
    61. ^ "msysGit". GitHub. Lưu trữ bản gốc ngày 10 tháng 10 năm 2016. Truy cập ngày 20 tháng 9 năm 2016.
    62. ^ "Git – Downloading Package". Git. Lưu trữ bản gốc ngày 29 tháng 7 năm 2025. Truy cập ngày 25 tháng 8 năm 2025. (source code Lưu trữ ngày 26 tháng 7 năm 2025 tại Wayback Machine)
    63. ^ "JGit". Lưu trữ bản gốc ngày 31 tháng 8 năm 2012. Truy cập ngày 24 tháng 8 năm 2012.
    64. ^ "Git – go-git". Git. Lưu trữ bản gốc ngày 22 tháng 4 năm 2025. Truy cập ngày 19 tháng 4 năm 2019.
    65. ^ "SQL interface to Git repositories, written in Go.", github.com, lưu trữ bản gốc ngày 22 tháng 6 năm 2025, truy cập ngày 19 tháng 4 năm 2019
    66. ^ "Keybase launches encrypted git". keybase.io. Lưu trữ bản gốc ngày 16 tháng 5 năm 2018. Truy cập ngày 19 tháng 4 năm 2019.
    67. ^ "Dulwich GitHub Repository README.md". GitHub. Lưu trữ bản gốc ngày 29 tháng 4 năm 2024. Truy cập ngày 29 tháng 4 năm 2024.
    68. ^ "libgit2". GitHub. Lưu trữ bản gốc ngày 11 tháng 4 năm 2016. Truy cập ngày 24 tháng 8 năm 2012.
    69. ^ "rugged". GitHub. Lưu trữ bản gốc ngày 24 tháng 7 năm 2013. Truy cập ngày 24 tháng 8 năm 2012.
    70. ^ "pygit2". GitHub. Lưu trữ bản gốc ngày 5 tháng 8 năm 2015. Truy cập ngày 24 tháng 8 năm 2012.
    71. ^ "hlibgit2". Lưu trữ bản gốc ngày 25 tháng 5 năm 2013. Truy cập ngày 30 tháng 4 năm 2013.
    72. ^ "js-git: a JavaScript implementation of Git". GitHub. Lưu trữ bản gốc ngày 7 tháng 8 năm 2013. Truy cập ngày 13 tháng 8 năm 2013.
    73. ^ "Game of Trees". gameoftrees.org. Lưu trữ bản gốc ngày 18 tháng 7 năm 2025. Truy cập ngày 10 tháng 3 năm 2024.
    74. ^ "git webls". orib.dev. Lưu trữ bản gốc ngày 10 tháng 2 năm 2025. Truy cập ngày 21 tháng 9 năm 2025.
    75. ^ "selfhosting git9". orib.dev. Lưu trữ bản gốc ngày 10 tháng 2 năm 2025. Truy cập ngày 21 tháng 9 năm 2025.

    Nguồn

    Liên kết ngoài