Hướng Dẫn Sử Dụng git clone Hiệu Quả Từ Cơ Bản Đến Nâng Cao
Bạn không chỉ clone một kho lưu trữ—bạn chọn lọc những gì bạn mang về: nhánh, độ sâu lịch sử, tệp và thậm chí là tài sản lớn. Dưới đây là sách hướng dẫn theo từng cấp độ.
🟢 CƠ BẢN — “Chỉ lấy những gì tôi cần”
Clone nhánh mặc định
bash
git clone https://github.com/owner/repo.git
Mặc định, Git tạo các nhánh theo dõi từ xa cho tất cả các nhánh từ xa và kiểm tra một nhánh ban đầu phù hợp với nhánh hoạt động của remote.
Clone và kiểm tra một nhánh cụ thể (ví dụ, develop)
bash
git clone -b develop https://github.com/owner/repo.git
# Mẹo: Thêm --single-branch để chỉ lấy lịch sử của nhánh đó
git clone -b develop --single-branch https://github.com/owner/repo.git
--single-branch giới hạn việc clone vào lịch sử của nhánh đã chọn (hoặc HEAD của remote nếu -b bị bỏ qua).
Bắt đầu nhanh (nông)
bash
git clone --depth 1 -b develop --single-branch https://github.com/owner/repo.git
--depth N chỉ lấy N commit gần nhất; clone nông cũng chỉ lấy lịch sử cho nhánh bạn yêu cầu.
🟡 TRUNG BÌNH — “Làm cho nó gọn gàng & dự đoán được”
Chọn HTTPS hay SSH
bash
# HTTPS (dễ bắt đầu)
git clone https://github.com/owner/repo.git
# SSH (tuyệt vời cho những người đóng góp)
git clone [email protected]:owner/repo.git
Đặt tên remote khác hoặc thiết lập cấu hình ngay khi clone
bash
git clone -o upstream https://github.com/owner/repo.git
git clone -c core.autocrlf=input https://github.com/owner/repo.git
Sử dụng -o để đổi tên origin, và -c key=value để thiết lập cấu hình cho kho mới.
Bỏ qua tags (lấy nhẹ hơn)
bash
git clone --no-tags --single-branch -b develop https://github.com/owner/repo.git
--no-tags tránh việc lấy tham chiếu tag khi clone. Bạn có thể lấy tags sau này với git fetch --tags.
Sử dụng GitHub CLI
bash
gh repo clone owner/repo -- -b develop --depth 1 --single-branch
Mọi thứ sau -- được chuyển tiếp đến git clone.
🔵 NÂNG CAO — “Repo lớn, kích thước nhỏ”
Clone một phần (không có blob)
bash
git clone --filter=blob:none https://github.com/owner/repo.git
# Kết hợp để tăng tốc độ:
git clone --filter=blob:none --depth 1 -b develop --single-branch https://github.com/owner/repo.git
Clone một phần tránh việc tải xuống nội dung tệp (blobs) ngay từ đầu; blobs được lấy khi cần trong quá trình kiểm tra. Rất thích hợp cho các mã nguồn lớn.
Kiểm tra lưa chọn (mono-repo)
bash
git clone --filter=blob:none https://github.com/owner/repo.git
cd repo
git sparse-checkout init --cone
git sparse-checkout set apps/web libs/ui
Sparse checkout chỉ tạo ra các thư mục đã chọn trong cây làm việc của bạn—hoàn hảo cho mono-repos và CI.
Quản lý submodules đúng cách
bash
git clone --recurse-submodules https://github.com/owner/repo.git
# (Tùy chọn) giữ submodules nông:
git clone --recurse-submodules --shallow-submodules https://github.com/owner/repo.git
--recurse-submodules khởi tạo và cập nhật submodules trong quá trình clone; --shallow-submodules giữ cho chúng nhẹ.
Git LFS: bỏ qua tài sản nặng trong quá trình clone
bash
# một lần
GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/owner/huge-lfs-repo.git
# hoặc thiết lập toàn cầu
git lfs install --skip-smudge
Bỏ qua việc tải LFS tự động trong quá trình clone; tải tài sản sau khi cần với git lfs pull.
🟣 CHUYÊN GIA — “Quản trị, gương, nguồn gốc & động thái mạnh mẽ”
Gương so với bare (cho sao lưu & gương CI)
bash
# Gương chính xác của tất cả các refs (bao gồm ghi chú, refs, vv)
git clone --mirror https://github.com/owner/repo.git /backups/repo.git
# Một kho làm việc bare (không có cây làm việc)
git clone --bare https://github.com/owner/repo.git
--mirror ngụ ý --bare và theo dõi tất cả refs để sao chép 1:1. Sử dụng git remote update để làm mới.
Thư mục .git riêng biệt (cây làm việc tạm thời)
bash
git clone --separate-git-dir=/var/git/repo.git https://github.com/owner/repo.git worktree
Giữ cơ sở dữ liệu đối tượng bên ngoài thư mục làm việc của bạn—tiện lợi cho các tác nhân xây dựng và cây tạm thời.
Clone có thể tái tạo, tối thiểu (kết hợp các kỹ thuật)
bash
git clone --filter=blob:none --single-branch -b release/2025.09 --depth 20 --no-tags https://github.com/owner/big-mono.git
cd big-mono
git sparse-checkout init --cone
git sparse-checkout set services/api
Bây giờ bạn có một bản sao làm việc nhỏ, nhanh, cụ thể theo nhánh và tập trung vào thư mục.
Bảng Tóm Tắt: Chọn công thức của bạn
| Mục tiêu | Lệnh |
|---|---|
| Chỉ nhánh cụ thể | git clone -b <name> --single-branch <url> |
| Chỉ commit mới nhất | git clone --depth 1 <url> |
| Blobless & nông | git clone --filter=blob:none --depth 1 <url> |
| Đường dẫn lưa chọn | git sparse-checkout init --cone && git sparse-checkout set <dirs> |
| Có submodules | git clone --recurse-submodules <url> |
| Bỏ qua LFS lúc clone | GIT_LFS_SKIP_SMUDGE=1 git clone <url> |
| Gương chính xác | git clone --mirror <url> |
| GitHub CLI + flags | gh repo clone owner/repo -- -b develop --depth 1 |
Những cạm bẫy thường gặp (và cách khắc phục nhanh)
- Clone với
-b developnhưng fetch lại kéo tất cả các nhánh? Thêm--single-branchđể giới hạn lịch sử vào nhánh đó trong quá trình clone ban đầu. - Clone nông làm gãy các công cụ như
git describehoặc các merge sâu? Tăng độ sâu khi cần:git fetch --deepen 200hoặc giảm độ sâu với một fetch đầy đủ:git fetch --unshallow. - Clone một phần cảm thấy “thiếu tệp”? Điều đó là bình thường; blobs tải xuống khi cần trong quá trình kiểm tra. Xem xét
--filter=blob:limit=<bytes>khi cần một số blobs lớn. - Sparse checkout không giảm thời gian clone? Sparse giới hạn cây làm việc; kết hợp với
--filter=blob:nonevà/hoặc độ sâu nông để giảm khối lượng truyền tải. - Submodules không đồng bộ? Sử dụng
--recurse-submoduleskhi clone, hoặc chạygit submodule update --init --recursive.
Mô Hình Tư Duy: Tại sao có nhiều tùy chọn?
Hãy nghĩ về git clone như một pipeline:
-
Khám phá refs (nhánh/tag) →
-
Quyết định lịch sử (
--single-branch,--depth) → -
Quyết định đối tượng (
--filterclone một phần) → -
Quyết định tệp trên đĩa (sparse checkout) →
-
Thêm (submodules, LFS, gương/bare, cấu hình).
Điều chỉnh từng giai đoạn chỉ theo nhu cầu sử dụng của bạn.
Những Lưu Ý Cuối
- Đối với công việc hàng ngày trên một nhánh:
-b <name> --single-branch --depth 1là mặc định tuyệt vời. - Đối với các repo khổng lồ: thêm
--filter=blob:nonevà thực hiện sparse-checkout cho cây con của bạn. - Đối với gương/sao lưu CI:
--mirrorlà người bạn đồng hành của bạn. - Đối với người dùng GitHub CLI: nhớ sử dụng
--để chuyển tiếp.
Clone ít hơn. Xây dựng nhiều hơn. 🛠️✨