Kho lưu trữ Git — là nơi lưu trữ mã nguồn của dự án, nơi Git theo dõi mọi thay đổi tệp trong suốt quá trình phát triển. Kho lưu trữ chứa toàn bộ lịch sử commit, nhánh và thẻ, cho phép các nhà phát triển cộng tác trên mã. Theo Git, 2024, kho lưu trữ là nền tảng của bất kỳ hệ thống kiểm soát phiên bản nào và được sử dụng trong hàng triệu dự án trên toàn thế giới.
Những điểm chính
Kho lưu trữ Git — là một cấu trúc dữ liệu nơi hệ thống kiểm soát phiên bản lưu trữ siêu dữ liệu và các đối tượng mô tả lịch sử thay đổi tệp của dự án. Khi một nhà phát triển khởi tạo kho lưu trữ bằng lệnh git init, Git tạo một thư mục ẩn .git trong thư mục gốc của dự án.
Bên trong thư mục này là tất cả các đối tượng, tham chiếu và tệp cấu hình cần thiết cho hoạt động của hệ thống. Kho lưu trữ không bị ràng buộc vào một vị trí cụ thể — nhà phát triển có thể tạo nó cục bộ và sau đó liên kết với máy chủ từ xa.
Git sử dụng mô hình kho lưu trữ phân tán: mỗi thành viên trong dự án có một bản sao đầy đủ lịch sử trên máy tính của họ. Điều này có nghĩa là hầu hết các thao tác — commit, xem lịch sử, tạo nhánh — được thực hiện cục bộ mà không cần liên hệ với máy chủ.
Theo tài liệu Git, kiến trúc phân tán làm cho hệ thống có khả năng chịu lỗi: nếu máy chủ gặp sự cố, bất kỳ kho lưu trữ cục bộ nào cũng có thể trở thành nguồn khôi phục lịch sử đầy đủ của dự án.
Kho lưu trữ cục bộ — là bản sao của dự án trên máy tính của nhà phát triển. Nó chứa toàn bộ lịch sử commit, nhánh và thẻ, và cho phép thực hiện các thao tác commit, branch, merge và rebase mà không cần kết nối mạng.
Kho lưu trữ từ xa — được lưu trữ trên máy chủ và đóng vai trò là điểm đồng bộ hóa cho tất cả các thành viên trong nhóm. Các nhà phát triển gửi thay đổi của họ bằng lệnh git push và nhận thay đổi của người khác bằng git pull.
Kết nối giữa kho lưu trữ cục bộ và từ xa được cấu hình thông qua remote origin — URL máy chủ được lưu trong cấu hình Git. Một kho lưu trữ cục bộ có thể được liên kết với nhiều kho lưu trữ từ xa, rất hữu ích khi làm việc với fork.
Ưu điểm chính của mô hình này là nhà phát triển có thể làm việc trên mã ngoại tuyến và đồng bộ hóa các thay đổi chỉ khi sẵn sàng gửi kết quả.
| Đặc điểm | Cục bộ | Từ xa |
|---|---|---|
| Vị trí | Trên máy tính của nhà phát triển | Trên máy chủ (GitHub, GitLab) |
| Truy cập ngoại tuyến | Truy cập đầy đủ tất cả thao tác | Không khả dụng nếu không có kết nối |
| Đồng bộ hóa | Push/Pull với kho từ xa | Nhận push từ kho cục bộ |
| Sao lưu | Không được bảo vệ khỏi mất dữ liệu | Được lưu trên máy chủ với bản sao lưu |
Mô hình lưu trữ của Git khác cơ bản so với các hệ thống kiểm soát phiên bản khác. Thay vì lưu trữ danh sách thay đổi (delta) giữa các phiên bản, Git lưu các ảnh chụp đầy đủ của tất cả tệp dự án tại thời điểm mỗi commit.
Mỗi đối tượng trong kho lưu trữ được xác định bằng băm SHA-1 duy nhất gồm 40 ký tự. Nếu nội dung tệp không thay đổi giữa các commit, Git không tạo đối tượng mới mà sử dụng lại đối tượng hiện có — điều này tiết kiệm dung lượng.
Git sử dụng bốn loại đối tượng: blob (nội dung tệp), tree (cấu trúc thư mục), commit (ảnh chụp với siêu dữ liệu) và tag (tham chiếu có tên đến một commit). Tất cả các đối tượng được lưu trong thư mục .git/objects.
Theo Git Internals, mô hình đối tượng của Git đảm bảo tính toàn vẹn dữ liệu: bất kỳ thay đổi nào trong nội dung tệp đều tạo ra một băm mới, khiến cho việc thay đổi lịch sử mà không bị phát hiện trở nên bất khả thi.
Thư mục .git là trái tim của kho lưu trữ. Nếu không có nó, Git không thể theo dõi các thay đổi và một thư mục thông thường chỉ là một tập hợp các tệp. Hiểu cấu trúc của thư mục này giúp chẩn đoán các vấn đề với kho lưu trữ.
Tệp HEAD đáng được chú ý đặc biệt. Ở trạng thái bình thường, nó chứa một tham chiếu tượng trưng đến một nhánh, ví dụ ref: refs/heads/main. Ở trạng thái detached HEAD, nó trỏ trực tiếp đến một commit — điều này có nghĩa là các commit mới sẽ không được gắn vào bất kỳ nhánh nào.
Làm việc với kho lưu trữ Git bao gồm một tập hợp các thao tác cơ bản mà nhà phát triển thực hiện hàng ngày. Mỗi thao tác thay đổi trạng thái của kho lưu trữ bằng cách thêm các đối tượng mới hoặc di chuyển các tham chiếu.
Các thao tác push và pull là những thao tác duy nhất yêu cầu kết nối đến máy chủ từ xa. Tất cả các thao tác khác được thực hiện hoàn toàn cục bộ, đảm bảo tốc độ cao ngay cả với khối lượng lịch sử lớn.
Mỗi tệp trong kho lưu trữ trải qua bốn trạng thái: untracked (không được theo dõi), modified (đã sửa đổi), staged (đã chuẩn bị) và committed (đã commit). Git chỉ theo dõi các tệp được thêm rõ ràng qua git add hoặc đã có trong lịch sử commit.
Hiểu mô hình này là chìa khóa để làm việc hiệu quả với Git. Nhà phát triển có thể chọn lọc chuẩn bị chỉ một phần các tệp đã sửa đổi cho commit, tạo ra các commit hoàn chỉnh về mặt logic với mô tả rõ ràng.
Kho lưu trữ từ xa thường được lưu trữ trên các nền tảng chuyên dụng cung cấp giao diện web, hệ thống quản lý truy cập và các công cụ bổ sung cho phát triển cộng tác.
Việc lựa chọn nền tảng phụ thuộc vào quy mô nhóm, yêu cầu về quyền riêng tư và các tích hợp cần thiết. Đối với phát triển di động, GitHub thường được chọn nhờ sự hỗ trợ rộng rãi của cộng đồng và tích hợp với các công cụ CI/CD cho iOS và Android.
Hãy xem xét một kịch bản thực tế: một nhà phát triển sao chép một kho lưu trữ hiện có, tạo một nhánh mới, thực hiện thay đổi và gửi chúng lên máy chủ. Mỗi lệnh minh họa cách làm việc với các thành phần khác nhau của kho lưu trữ.
# Sao chép kho lưu trữ từ xa
git clone https://github.com/user/mobile-app.git
# Di chuyển đến thư mục dự án
cd mobile-app
# Tạo nhánh feature mới và chuyển sang nó
git checkout -b feature/auth
# Kiểm tra trạng thái các tệp đã sửa đổi
git status
# Thêm tất cả thay đổi vào khu vực staging
git add .
# Tạo commit với mô tả
git commit -m "Add authentication module"
# Gửi thay đổi đến kho lưu trữ từ xa
git push origin feature/auth
Lệnh git status là một trong những lệnh hữu ích nhất trong công việc hàng ngày. Nó hiển thị tệp nào đã được sửa đổi, tệp nào đã được chuẩn bị cho commit và tệp nào không được Git theo dõi.
Để phân tích lịch sử kho lưu trữ, lệnh git log được sử dụng với các cờ định dạng khác nhau. Nó hiển thị thứ tự thời gian của các commit, tác giả, ngày tháng và mã nhận dạng SHA-1.
# Xem lịch sử với trực quan hóa đồ thị nhánh
git log --oneline --graph --all
# Xem thay đổi trong một commit cụ thể
git show a1b2c3d
# So sánh trạng thái hiện tại với commit cuối cùng
git diff HEAD
# Xem lịch sử của một tệp cụ thể
git log --follow src/MainActivity.kt
Cờ --graph hiển thị đồ thị ASCII của các nhánh, đặc biệt hữu ích trong các kho lưu trữ có hoạt động tích cực trên nhiều nhánh. Đối với các dự án di động có bản phát hành thường xuyên, đồ thị trực quan giúp đánh giá nhanh cấu trúc phát triển.
Câu hỏi thường gặp
Kho lưu trữ là nơi lưu trữ kỹ thuật mã với lịch sử thay đổi. Dự án là một khái niệm rộng hơn bao gồm kho lưu trữ, hệ thống quản lý nhiệm vụ, tài liệu và các quy trình phát triển. Một dự án có thể chứa nhiều kho lưu trữ.
Tạo một kho lưu trữ mới qua giao diện web của GitHub bằng cách nhấp vào nút New. Chỉ định tên, mô tả và mức truy cập. Sau đó, sao chép kho lưu trữ về máy cục bộ hoặc liên kết với kho lưu trữ cục bộ hiện có qua git remote add origin.
Nếu kho lưu trữ từ xa đã bị xóa khỏi máy chủ nhưng ít nhất một nhà phát triển có bản sao cục bộ, kho lưu trữ có thể được khôi phục. Chỉ cần tạo một kho lưu trữ từ xa mới và thực hiện git push --force từ bản sao cục bộ với toàn bộ lịch sử.
Fork là một bản sao của kho lưu trữ của người khác trên tài khoản của bạn. Bạn nhận được bản sao đầy đủ lịch sử và có thể thực hiện bất kỳ thay đổi nào mà không ảnh hưởng đến bản gốc. Fork được sử dụng để tham gia các dự án mã nguồn mở thông qua Pull Request.
Sử dụng git gc để nén các đối tượng và xóa dữ liệu không thể truy cập. Xóa các tệp lớn khỏi lịch sử thông qua git filter-branch hoặc git filter-repo. Đối với các dự án có tệp nhị phân, hãy cân nhắc Git LFS (Large File Storage).
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm