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 clone vớ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

bash
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ướcLệnhĐiều xảy ra
1git clone git@github.com:team/app.gitClone 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.
2git branchChỉ có một nhánh cục bộ là main. Dấu sao đánh dấu nhánh đang checkout.
3git branch -aCờ -a liệt kê cả nhánh theo dõi: develop có mặt dưới dạng remotes/origin/develop.
4git switch developGit 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ướcLệnhĐiều xảy ra
1git clone --depth 1 --branch main --single-branch git@github.com:team/app.gitClone nông chỉ lấy commit mới nhất của nhánh main. C1 và C2 ở lại trên remote.
2git log --onelineLịch sử cục bộ chỉ có một dòng, vì phần cũ chưa được tải.
3git fetch --unshallowKhi 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

bash
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:

bash
git remote -v
text
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ỉ --depth mới giới hạn.
  • "origin là tên của dự án." origin chỉ 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 log sâu, git blame xa, merge với nhánh cũ) sẽ thiếu dữ liệu.

Tự kiểm tra

  1. Sau clone, git branch hiện những nhánh nào?
  2. Làm sao để có nhánh cục bộ develop theo dõi origin/develop?
  3. 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.
  • develop chư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).