git clone
Xem thửVấn đề cần giải quyết
Ngày đầu đi làm, trưởng nhóm gửi bạn một đường dẫn kho và bảo "clone về rồi chạy thử". Bạn cần biết lệnh đó mang về những gì: chỉ mã nguồn, hay cả lịch sử và các nhánh? Và vì sao mở kho ra bạn chỉ thấy nhánh main dù đồng đội nói còn nhánh develop.
Sau bài này, bạn có thể
- Dùng
git clonevới URL HTTPS hoặc SSH. - Giải thích các nhánh
origin/*và vì sao chỉ có một nhánh cục bộ sau clone. - Chọn clone đầy đủ, một nhánh hay clone nông (
--depth 1) cho từng tình huống.
Tiên quyết: bài git init và Git SSH.
Cú pháp
git clone <url>
git clone https://bitbucket.org/team/repo.git
git clone git@github.com:user/repo.git
git clone <url> ten-thu-muc-moi
git clone sao chép một kho đã tồn tại (thường ở xa) về máy: toàn bộ lịch sử, mọi nhánh (dưới dạng nhánh theo dõi origin/*) và một bản làm việc của nhánh mặc định.
Cách đọc hình. Bên trái là remote với hai nhánh. Bên phải là kho cục bộ sau clone: origin/main và origin/develop là remote-tracking branch, ảnh chụp nhánh của remote và chỉ đọc. Git tạo thêm nhánh cục bộ main rồi checkout nội dung của nó ra Working Directory. Hộp xám nhắc rằng develop hiện chỉ tồn tại dưới dạng origin/develop.
Thử và quan sát
Hãy dự đoán: sau git clone, nhánh develop có phải nhánh cục bộ của bạn không? Chạy mô phỏng và bấm Bước tiếp tới khi bạn chuyển sang develop. Dùng nút biến thể để thử clone nông.
Đang tải Animation…
Bảng bước (bản đọc tĩnh của mô phỏng)
| Bước | Lệnh | Điều xảy ra |
|---|---|---|
| 1 | git clone git@github.com:team/app.git | Clone sao chép toàn bộ commit về máy, tạo origin/main, origin/develop (chỉ đọc) và một nhánh cục bộ main được checkout. |
| 2 | git branch | Chỉ có một nhánh cục bộ là main. Dấu sao đánh dấu nhánh đang checkout. |
| 3 | git branch -a | Cờ -a liệt kê cả nhánh theo dõi: develop có mặt dưới dạng remotes/origin/develop. |
| 4 | git switch develop | Git thấy origin/develop nên tạo nhánh cục bộ develop trỏ cùng commit, rồi chuyển sang đó. |
Biến thể: Clone nông với --depth 1
| Bước | Lệnh | Điều xảy ra |
|---|---|---|
| 1 | git clone --depth 1 --branch main --single-branch git@github.com:team/app.git | Clone nông chỉ lấy commit mới nhất của nhánh main. C1 và C2 ở lại trên remote. |
| 2 | git log --oneline | Lịch sử cục bộ chỉ có một dòng, vì phần cũ chưa được tải. |
| 3 | git fetch --unshallow | Khi cần lịch sử đầy đủ, --unshallow tải nốt các commit còn thiếu. |
Giải đáp. Chưa. develop có trong máy bạn dưới dạng origin/develop; chỉ khi chạy git switch develop, Git thấy có nhánh theo dõi trùng tên nên tạo nhánh cục bộ trỏ cùng commit. Ở biến thể, clone nông chỉ giữ commit mới nhất nên nhẹ, đổi lại bạn không xem được lịch sử cũ cho tới khi git fetch --unshallow.
Các tùy chọn thường dùng
git clone --branch develop --single-branch <url>
git clone --depth 1 <url>
--single-branch chỉ lấy một nhánh. --depth 1 chỉ lấy commit mới nhất, rất hữu ích cho CI khi chỉ cần build bản mới nhất.
origin là gì
Khi clone, Git tự tạo một remote tên origin trỏ về kho gốc, nhờ đó bạn dùng git fetch, git pull, git push mà không gõ lại URL:
git remote -v
origin git@github.com:user/repo.git (fetch)
origin git@github.com:user/repo.git (push)
Khác biệt cốt lõi: init tạo kho rỗng cục bộ; clone tạo bản sao đầy đủ của một kho đã có.
Hiểu lầm thường gặp
- "Clone chỉ tải mã nguồn mới nhất." Clone mặc định tải toàn bộ lịch sử; chỉ
--depthmới giới hạn. - "origin là tên của dự án."
originchỉ là tên mặc định của remote; bạn có thể đổi hoặc thêm remote khác. - "Clone nông thì dùng bình thường được." Một số thao tác cần lịch sử (như
git logsâu,git blamexa, merge với nhánh cũ) sẽ thiếu dữ liệu.
Tự kiểm tra
- Sau clone,
git branchhiện những nhánh nào? - Làm sao để có nhánh cục bộ
developtheo dõiorigin/develop? - Pipeline CI chỉ cần build commit mới nhất. Bạn clone thế nào để nhanh nhất?
Đáp án gợi ý. (1) Chỉ nhánh mặc định, thường là main; các nhánh khác là origin/* (xem bằng git branch -a). (2) git switch develop. (3) git clone --depth 1 <url>, thêm --branch nếu cần nhánh khác.
Điều cần nhớ
- Clone mang về lịch sử đầy đủ, các nhánh
origin/*và một nhánh cục bộ được checkout. developchưa là nhánh cục bộ cho tới khi bạn chuyển sang nó.--depth 1đổi lịch sử lấy tốc độ.- Bài sau:
git config, cấu hình danh tính và hành vi của Git.
Nguồn tham khảo
Tài liệu git-clone (git-scm.com/docs/git-clone); Pro Git, chương 2.1 (git-scm.com/book).