git clone: cách sao chép kho lưu trữ từ GitHub và nơi khác
git clone tải toàn bộ kho lưu trữ từ xa — mọi tệp, toàn bộ lịch sử commit và các nhánh — và tạo bản sao cục bộ với remote origin đã được cấu hình. Lệnh cơ bản là git clone địa-chỉ-kho. Các cờ cho phép chọn thư mục, nhánh hoặc chỉ tải commit mới nhất bằng --depth 1.
Lệnh git clone tạo một bản sao cục bộ đầy đủ của kho lưu trữ từ xa: tệp, toàn bộ lịch sử commit, các nhánh và thẻ. Đây là cách chuẩn để bắt đầu làm việc với một dự án đã có trên GitHub, GitLab hoặc máy chủ doanh nghiệp. Khác với việc tải file ZIP, bản clone là một kho lưu trữ đầy đủ, nơi bạn có thể commit và gửi thay đổi trở lại.
Cách dùng cơ bản của git clone
Sao chép địa chỉ kho (trên GitHub — nút «Code» màu xanh) và chạy:
git clone https://github.com/username/project.git
Cloning into 'project'...
remote: Enumerating objects: 1532, done.
remote: Counting objects: 100% (1532/1532), done.
remote: Compressing objects: 100% (812/812), done.
Receiving objects: 100% (1532/1532), 2.41 MiB | 6.10 MiB/s, done.
Resolving deltas: 100% (701/701), done.
Git tạo thư mục project trong thư mục hiện tại (tên lấy từ địa chỉ, bỏ đuôi .git). Sau đó chuyển vào thư mục đó:
cd project
git status
Git clone làm gì bên dưới
Clone không chỉ là tải tệp về. Hiểu các bước sau giúp bạn biết vì sao sau khi clone mọi thứ «tự chạy», và các nhánh có tiền tố origin/ đến từ đâu. Theo từng bước, lệnh thực hiện:
- tạo thư mục và thực hiện tương đương với
git initbên trong; - thêm remote tên
origintrỏ tới địa chỉ gốc; - tải về mọi đối tượng và tham chiếu — tương đương
git fetch; - tạo các nhánh từ xa
origin/main,origin/developvà tương tự; - tạo nhánh cục bộ mặc định (thường là
main), liên kết vớiorigin/mainvà bung tệp ra.
Vì vậy sau khi clone bạn không cần cấu hình git remote thủ công — git push và git pull chạy ngay.
git remote -v
origin https://github.com/username/project.git (fetch)
origin https://github.com/username/project.git (push)
Clone qua HTTPS và SSH
| HTTPS | SSH | |
|---|---|---|
| Địa chỉ | https://github.com/user/repo.git | git@github.com:user/repo.git |
| Kho công khai | Clone không cần đăng nhập | Cần khóa SSH đã thêm vào tài khoản |
| Kho riêng tư, push | Cần Personal Access Token thay cho mật khẩu | Hoạt động bằng khóa, không cần nhập mật khẩu |
| Mạng doanh nghiệp | Cổng 443 hầu như luôn mở | Cổng 22 đôi khi bị chặn |
Để đọc các dự án mã nguồn mở công khai, HTTPS là đủ. Với kho của chính bạn, nơi bạn thường xuyên push, SSH tiện hơn:
git clone git@github.com:username/project.git
Nếu đã clone qua HTTPS và muốn chuyển sang SSH, không cần tải lại:
git remote set-url origin git@github.com:username/project.git
Clone vào thư mục chỉ định
Đối số thứ hai là tên hoặc đường dẫn thư mục đích:
# Vào thư mục có tên khác
git clone https://github.com/username/project.git ban-sao
# Vào thư mục hiện tại (thư mục phải trống)
git clone https://github.com/username/project.git .
Nếu thư mục đích đã tồn tại và không trống, Git sẽ từ chối: fatal: destination path 'project' already exists and is not an empty directory.
Clone đúng một nhánh
Mặc định sau khi clone bạn đứng ở nhánh mặc định của kho từ xa. Để vào ngay một nhánh khác, dùng -b (--branch):
git clone -b develop https://github.com/username/project.git
Lưu ý: khi đó vẫn tải về mọi nhánh, bạn chỉ đứng ở develop. Nếu chỉ cần một nhánh và không cần các nhánh còn lại, thêm --single-branch:
git clone -b develop --single-branch https://github.com/username/project.git
Cờ -b cũng nhận tên thẻ — khi đó bạn có trạng thái dự án tại thời điểm phát hành (ở chế độ detached HEAD):
git clone -b v2.1.0 --depth 1 https://github.com/username/project.git
Các nhánh khác nằm đâu sau khi clone
Người mới hay ngạc nhiên: git branch chỉ hiển thị main. Các nhánh còn lại được tải về dưới dạng nhánh từ xa, và có thể xem bằng:
git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/feature/login
Để bắt đầu làm việc trên một nhánh trong số đó, chỉ cần chuyển sang bằng tên ngắn — Git sẽ tự tạo nhánh cục bộ theo dõi nhánh từ xa:
git switch develop
Clone nông: --depth cho kho lưu trữ lớn
Với dự án cũ, lịch sử có thể nặng vài gigabyte. Nếu bạn chỉ cần mã hiện tại — ví dụ trong CI hoặc chỉ để build dự án — hãy tải các commit gần nhất:
git clone --depth 1 https://github.com/username/big-project.git
Cờ --depth ngầm bao hàm --single-branch, nên chỉ có nhánh mặc định và một commit được tải về. Sau này nếu cần toàn bộ lịch sử, có thể tải bổ sung:
git fetch --unshallow
Có thể chỉ định độ sâu khác, ví dụ --depth 50, hoặc giới hạn lịch sử theo ngày bằng --shallow-since=2025-01-01. Với phát triển tích cực, clone nông gây bất tiện: git log, git blame và tìm kiếm trong lịch sử sẽ không đầy đủ.
Clone một phần: --filter
Phương án khác cho monorepo khổng lồ là tải lịch sử commit, còn nội dung tệp chỉ lấy khi cần:
git clone --filter=blob:none https://github.com/username/monorepo.git
Cách này giữ được toàn bộ lịch sử cho log và chuyển nhánh, nhưng tiết kiệm băng thông và dung lượng. Cần máy chủ hỗ trợ; GitHub và GitLab đều hỗ trợ.
Bản sao gương (mirror) và chuyển kho lưu trữ
Clone thông thường đưa các nhánh về dạng nhánh từ xa và không sao chép các tham chiếu nội bộ của máy chủ. Để chuyển dự án sang hosting khác hoặc tạo bản sao lưu «y hệt», người ta dùng --mirror:
git clone --mirror https://github.com/username/project.git
cd project.git
git push --mirror git@gitlab.com:username/project.git
Bản gương là một kho bare — không có tệp làm việc, mọi nhánh và thẻ đều được lưu như nhánh cục bộ. Lệnh git push --mirror đẩy toàn bộ chúng sang máy chủ mới, lịch sử được chuyển đầy đủ. Lưu ý rằng issue, pull request và cấu hình của dịch vụ không được chuyển theo kiểu này — đó là dữ liệu của dịch vụ chứ không phải của Git.
Cờ --bare cũng tạo kho không có thư mục làm việc, nhưng chỉ sao chép nhánh và thẻ. Nó phù hợp để dựng kho trung tâm trên máy chủ riêng từ một dự án đã có.
Clone kèm submodule
Nếu dự án dùng git submodule, mặc định thư mục của chúng sẽ trống. Để tải tất cả cùng lúc:
git clone --recurse-submodules https://github.com/username/project.git
Nếu đã clone mà không có cờ này, hãy tải bổ sung submodule:
git submodule update --init --recursive
git clone, fork và tải ZIP
| Cách | Bạn nhận được | Khi nào dùng |
|---|---|---|
git clone | Kho đầy đủ với lịch sử và remote | Làm việc với dự án mà bạn có quyền hoặc cần lịch sử |
| Fork trên GitHub | Bản sao kho trong tài khoản của bạn trên máy chủ | Đóng góp vào dự án của người khác qua pull request |
| Download ZIP | Chỉ tệp, không có .git | Xem nhanh mã, không định commit |
Fork và clone không loại trừ nhau: khi làm việc với mã nguồn mở, trước tiên bạn fork trên trang web, sau đó clone chính bản fork của mình và thêm bản gốc làm remote thứ hai:
git clone git@github.com:me/project.git
cd project
git remote add upstream https://github.com/author/project.git
git fetch upstream
Các lỗi thường gặp khi git clone
«Repository not found»
Địa chỉ sai chính tả, hoặc kho là riêng tư và bạn không có quyền truy cập. GitHub cố ý trả về «not found» cho kho riêng tư thay vì «access denied». Hãy kiểm tra địa chỉ và xem bạn đã đăng nhập đúng tài khoản chưa.
«Permission denied (publickey)»
Clone bằng SSH nhưng khóa chưa được cấu hình. Kiểm tra bằng ssh -T git@github.com, thêm khóa công khai vào cài đặt tài khoản, hoặc tạm thời clone qua HTTPS.
«Authentication failed» khi dùng HTTPS
Bạn nhập mật khẩu tài khoản. GitHub từ lâu yêu cầu Personal Access Token thay cho mật khẩu khi thao tác Git qua HTTPS. Nếu Git lưu nhầm thông tin đăng nhập, hãy xóa chúng trong trình quản lý thông tin đăng nhập của hệ điều hành.
Bị ngắt giữa chừng với kho lớn
Các lỗi kiểu early EOF hoặc RPC failed thường do mạng không ổn định và kích thước lớn. Có thể giúp: clone nông --depth 1 rồi git fetch --unshallow, hoặc clone qua SSH.
Vấn đề xuống dòng trên Windows
Sau khi clone, tất cả tệp hiển thị là «đã thay đổi» — đó là hệ quả của việc chuyển đổi CRLF/LF. Trên Windows, đặt git config --global core.autocrlf true (trên Linux và macOS là input), và tốt hơn là khai báo quy tắc trong .gitattributes của dự án.
Việc nên làm ngay sau khi clone
Clone xong rồi, trước khi sửa mã, hãy dành vài phút chuẩn bị. Điều này giúp tránh các vấn đề thường gặp ngay ngày đầu làm việc với dự án của người khác.
- Đọc README và CONTRIBUTING. Thường có mô tả cách cài phụ thuộc, chạy test và quy ước đặt tên nhánh của dự án.
- Kiểm tra nhánh và trạng thái.
git statusvàgit log --oneline -5cho biết bạn đang ở đâu và có những thay đổi gần nhất nào. - Tạo nhánh riêng. Đừng làm việc trực tiếp trên
main:git switch -c feature/my-task. - Kiểm tra tác giả commit. Nếu máy có nhiều tài khoản (cá nhân và công việc), đặt email cho đúng kho này mà không dùng
--global:git config user.email "ban@congty.com". - Cài phụ thuộc. Các thư mục như
node_moduleshayvenvkhông đưa vào kho, chúng được tạo trên máy:npm install,pip install -r requirements.txt, v.v.
Giữ bản clone luôn cập nhật
Clone chỉ làm một lần. Sau đó, commit mới của đồng nghiệp được kéo về từ cùng origin:
# Xem có gì mới trên máy chủ mà không thay đổi gì
git fetch
git log --oneline main..origin/main
# Gộp thay đổi vào nhánh hiện tại
git pull
Thói quen chạy git fetch trước rồi xem có gì mới giúp tránh xung đột bất ngờ. Không nên clone lại dự án «để cập nhật» — làm vậy sẽ mất các nhánh cục bộ và công việc chưa commit.
Bảng tra cứu git clone
| Việc cần làm | Lệnh |
|---|---|
| Clone thông thường | git clone <url> |
| Vào thư mục riêng | git clone <url> <thư-mục> |
| Vào ngay một nhánh | git clone -b <nhánh> <url> |
| Chỉ một nhánh | git clone -b <nhánh> --single-branch <url> |
| Không có lịch sử | git clone --depth 1 <url> |
| Không tải nội dung tệp cũ | git clone --filter=blob:none <url> |
| Kèm submodule | git clone --recurse-submodules <url> |
| Bản bare cho máy chủ | git clone --bare <url> |
Tóm lại
git clone tải kho lưu trữ đầy đủ và thiết lập sẵn liên kết với máy chủ qua origin, nên sau đó bạn có thể commit, push và pull mà không cần cấu hình thêm. Với dự án của mình, dùng SSH; với kho lớn — --depth hoặc --filter; để vào đúng nhánh — -b. Làm việc với kho từ xa, push, pull và fetch được hướng dẫn thực hành trong khóa học Git.
Câu hỏi thường gặp
Khác nhau giữa git clone và git pull là gì?
git clone chạy một lần và tạo bản sao kho mới trên máy. git pull chạy trong bản clone đã có sẵn và kéo các thay đổi mới từ máy chủ về.
Có thể clone chỉ một thư mục trong kho không?
Không trực tiếp. Gần nhất là clone một phần với --filter=blob:none --sparse, sau đó chạy git sparse-checkout set đường-dẫn — khi đó trong thư mục làm việc chỉ xuất hiện thư mục cần thiết.
Bản clone chiếm bao nhiêu dung lượng?
Xấp xỉ kích thước toàn bộ lịch sử ở dạng nén cộng với các tệp của phiên bản hiện tại. Có thể xem kích thước kho bằng git count-objects -vH.
Có thể clone kho cục bộ không?
Có, truyền đường dẫn thay cho địa chỉ: git clone /duong/dan/kho ban-sao. Tiện để thử nghiệm mà không ảnh hưởng tới bản chính.
Có cần chạy git init trước git clone không?
Không. git clone tự tạo thư mục và khởi tạo kho bên trong.
Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Git с нуля до уверенного разработчика”.
Đến khóa học