Hướng dẫn

git clone: cách sao chép kho lưu trữ từ GitHub và nơi khác

Cập nhật: · Skillaria.Top

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:

  1. tạo thư mục và thực hiện tương đương với git init bên trong;
  2. thêm remote tên origin trỏ tới địa chỉ gốc;
  3. tải về mọi đối tượng và tham chiếu — tương đương git fetch;
  4. tạo các nhánh từ xa origin/main, origin/develop và tương tự;
  5. tạo nhánh cục bộ mặc định (thường là main), liên kết với origin/main và 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

HTTPSSSH
Địa chỉhttps://github.com/user/repo.gitgit@github.com:user/repo.git
Kho công khaiClone không cần đăng nhậpCần khóa SSH đã thêm vào tài khoản
Kho riêng tư, pushCần Personal Access Token thay cho mật khẩuHoạt động bằng khóa, không cần nhập mật khẩu
Mạng doanh nghiệpCổ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áchBạn nhận đượcKhi nào dùng
git cloneKho đầy đủ với lịch sử và remoteLàm việc với dự án mà bạn có quyền hoặc cần lịch sử
Fork trên GitHubBả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 ZIPChỉ tệp, không có .gitXem 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.

  1. Đọ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.
  2. Kiểm tra nhánh và trạng thái. git status và git log --oneline -5 cho biết bạn đang ở đâu và có những thay đổi gần nhất nào.
  3. Tạo nhánh riêng. Đừng làm việc trực tiếp trên main: git switch -c feature/my-task.
  4. 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".
  5. Cài phụ thuộc. Các thư mục như node_modules hay venv khô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àmLệnh
Clone thông thườnggit clone <url>
Vào thư mục riênggit clone <url> <thư-mục>
Vào ngay một nhánhgit clone -b <nhánh> <url>
Chỉ một nhánhgit 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 submodulegit 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.

Học chủ đề này qua video

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