Khóa học
Hãy tưởng tượng bạn đang viết một cuốn sách và muốn thử nghiệm các ý tưởng mới mà không làm xáo trộn bản gốc. Bạn có thể bắt đầu một cuốn sổ tay mới cho từng ý tưởng, giữ các bản thảo tách biệt.
Git, một hệ thống quản lý phiên bản, cho phép các nhà phát triển phần mềm làm điều tương tự với mã thông qua "nhánh". Mỗi nhánh giống như một lộ trình phát triển riêng biệt, cho phép bạn khám phá các thay đổi mà không ảnh hưởng đến mã nguồn chính.

Trong bài viết này, tôi sẽ hướng dẫn bạn sử dụng git clone, tập trung vào việc clone các nhánh cụ thể. Nếu bạn muốn tìm hiểu thêm về Git, tôi gợi ý khóa học Introduction to Git này.
Hãy bắt đầu với câu trả lời ngắn gọn cho những bạn đang vội. Sau đó, chúng ta sẽ đi sâu vào chi tiết.
Câu trả lời ngắn: Cách clone một nhánh cụ thể
Để clone một nhánh cụ thể từ kho git, hãy dùng lệnh:
git clone --single-branch --branch <branch_name> <repository_url>
Thay <branch_name> bằng tên nhánh mong muốn và <repository_url> bằng URL của kho chứa. Lệnh này tạo một bản sao cục bộ của nhánh đã chỉ định, cho phép bạn phát triển ngay lập tức và tập trung trên nhánh đó.
Ví dụ
Xuyên suốt bài viết, chúng ta sẽ dùng kho này. Bạn có thể dùng nó để thử các lệnh học được trên máy của mình. Kho chứa có ba nhánh:
main: Nhánh mặc định với hai tệp văn bản.add-new-file: Nhánh trong đó đã thêm tệp thứ ba.modify-file: Nhánh trong đó tệp thứ hai đã được chỉnh sửa.
Đây là cách chúng ta có thể clone nhánh add-new-file:
git clone --single-branch --branch add-new-file https://github.com/fran-aubry/git-clone-example.git
git clone là gì?
Theo mặc định, git clone được thiết kế để sao chép toàn bộ kho chứa vào một thư mục mới trên máy cục bộ của bạn, clone tất cả các nhánh. Cú pháp như sau:
git clone <repository_url>
Để clone kho ví dụ, chúng ta có thể làm như sau:
git clone https://github.com/fran-aubry/git-clone-example.git
Sau khi chạy lệnh này, tất cả các nhánh sẽ được sao chép về máy cục bộ của bạn. Tuy nhiên, tại một thời điểm, chỉ các tệp của một nhánh là hiển thị, gọi là nhánh được checkout. Sau khi clone một kho chứa, nhánh mặc định (thường là main hoặc master) sẽ được checkout.

Chuyển nhánh
Sau khi clone đầy đủ, chúng ta có thể chuyển (checkout) sang nhánh mong muốn bằng lệnh git checkout. Ví dụ, để checkout nhánh modify-file, chúng ta sẽ làm như sau:
git checkout modify-file

Độ sâu khi clone
Khi làm việc với git, các thay đổi trong một nhánh được lưu lại bằng cách commit chúng với lệnh git commit. Mỗi commit tạo ra một trạng thái mới của nhánh, mà bạn có thể quay lại khi cần. Hãy hình dung mỗi commit như một bức ảnh chụp nhanh, và git theo dõi tất cả các ảnh chụp đó. Bạn có thể đưa nhánh về bất kỳ ảnh chụp nào trong số này vào bất cứ lúc nào.
Lệnh git clone khi dùng mà không có tùy chọn sẽ tải về mọi commit của mọi nhánh vào máy cục bộ của bạn. Tùy kích thước dự án, việc này có thể chiếm khá nhiều dung lượng lưu trữ. Nếu bạn biết mình không cần toàn bộ lịch sử, bạn có thể dùng tham số --depth để chỉ định số lượng commit (hay ảnh chụp) bạn muốn clone.
Để clone nhánh chính nhưng chỉ tải commit gần nhất, hãy dùng lệnh sau:
git clone --depth=1 https://github.com/fran-aubry/git-clone-example.git
Clone một nhánh cụ thể
Chúng ta đã học cách clone một kho bằng git clone. Theo mặc định, lệnh này clone mọi thứ về máy cục bộ. Thông thường, bạn chỉ quan tâm làm việc trên một nhánh cụ thể, nên việc chỉ clone nhánh đó sẽ hiệu quả hơn. Cách này tiết kiệm dung lượng đĩa và cho phép bạn bắt tay vào làm ngay mà không cần chuyển nhánh sau khi clone.
Quay lại ví dụ viết sách, giả sử bạn được giao nhiệm vụ viết lại chương hai. Khi đó, bạn chỉ nên clone nhánh nơi công việc này đang diễn ra, vì không cần truy cập các nhánh liên quan đến việc sửa các chương khác.
Bạn có thể yêu cầu git chỉ clone một nhánh bằng cách thêm các tham số --single-branch và --branch theo sau là tên nhánh:
git clone --single-branch --branch <branch_name> <repository_url>
Hãy phân tích lệnh:
git clone: Lệnh git cơ bản để sao chép một kho từ nguồn từ xa về máy cục bộ.
--single-branch: Tùy chọn này bảo Git chỉ clone một nhánh. Nếu không chỉ định nhánh, nhánh mặc định sẽ được clone.
--branch <branch_name>: Tùy chọn này chỉ định nhánh cần clone. <branch_name> là tên nhánh bạn muốn clone.<repository_url>: URL của kho chứa.
Ví dụ, để chỉ clone nhánh modify-file từ kho của chúng ta, có thể làm như sau:
git clone --single-branch --branch add-new-file https://github.com/fran-aubry/git-clone-example.git
Cách làm việc với một nhánh đã clone
Khi làm việc trên một nhánh, có ba thao tác thiết yếu bạn cần thực hiện:
- Lưu công việc hiện tại bằng cách tạo ảnh chụp trạng thái hiện thời.
- Tải lên các thay đổi để mọi người có thể truy cập.
- Tải về thay đổi của người khác và hợp nhất với phần của bạn.
Lưu thay đổi của bạn với git commit
Trong Git, lưu công việc của bạn được gọi là tạo một commit. Quá trình này tạo ảnh chụp trạng thái hiện tại của nhánh bạn đang làm.
Trạng thái của nhánh được lưu trên máy cục bộ sau mỗi commit, cho phép bạn di chuyển giữa các giai đoạn tiến độ khác nhau.

Để commit các thay đổi trong git, bạn dùng lệnh git commit. Tuy nhiên, trước khi commit, git cần biết những tệp nào bạn muốn đưa vào commit. Bạn chỉ định các tệp cần lưu bằng lệnh git add. Cú pháp như sau:
git add <path_to_file>
Trong cú pháp, <path_to_file> là đường dẫn tới tệp bạn muốn commit. Chẳng hạn, nếu chúng ta đang ở nhánh modify-file của kho ví dụ và đã thêm một đoạn văn vào file2.txt, bạn sẽ thêm tệp đó bằng cách chạy:
git add file2.txt
Sau khi thêm tất cả tệp bạn muốn đưa vào commit, bạn có thể tiến hành commit bằng cách chạy:
git commit -m <message>
Ở đây, tham số <message> nên là một thông điệp ngắn gọn đặt trong dấu ngoặc kép, mô tả súc tích các thay đổi. Ví dụ:
git commit -m "Add paragraph"
Dưới đây là một số quy ước cho thông điệp commit. Chúng rất quan trọng để đảm bảo rõ ràng và dễ hiểu cho tất cả mọi người tham gia dự án:
- Dùng lối mệnh lệnh: Bắt đầu thông điệp commit bằng một động từ ở dạng mệnh lệnh (ví dụ: "Add", "Fix", "Update"). Chẳng hạn, thay vì "Added new feature", hãy viết "Add new feature".
- Ngắn gọn nhưng mô tả rõ: Hướng tới thông điệp ngắn, lý tưởng dưới 50 ký tự. Tuy nhiên, ưu tiên sự rõ ràng khi mô tả thay đổi. Thay vì "Changed stuff", hãy viết "Update styling for navigation bar".
- Tránh thông điệp chung chung: Tránh các thông điệp mơ hồ như "Fix bugs" hoặc "Make improvements". Thay vào đó, hãy cụ thể: "Fix bug in login form validation" hoặc "Improve readability of documentation".
Tải lên thay đổi của bạn với git push
Khi bạn commit, bạn tạo một ảnh chụp các thay đổi trên máy cục bộ. Để người khác truy cập được các thay đổi này, bạn cần tải chúng lên. Để làm vậy, bạn dùng lệnh push.
Cú pháp cơ bản của lệnh push trong Git là:
git push <remote> <branch>
Hãy cùng phân tích:
<remote>: Tên của kho chứa từ xa nơi bạn muốn đẩy các thay đổi. Theo mặc định, khi bạn clone một kho, kho từ xa có tên là origin.<branch>: Tên nhánh có các thay đổi bạn muốn đẩy lên kho từ xa. Nếu bỏ qua tham số này, Git sẽ đẩy thay đổi dựa trên nhánh hiện tại và cấu hình theo dõi từ xa.
Một số trường hợp sử dụng phổ biến của git push:
- Đẩy thay đổi từ nhánh hiện tại:
git push - Đẩy thay đổi từ một nhánh cụ thể:
git push origin <branch>
Tải về thay đổi với git pull
Git cho phép các nhóm lớn làm việc đồng thời trên cùng một dự án. Khi đồng nghiệp chỉnh sửa cùng nhánh bạn đang làm, nhánh cục bộ của bạn có thể trở nên lỗi thời so với nhánh từ xa.
Để tải về các commit của người khác, chúng ta dùng lệnh git pull. Cú pháp cơ bản của lệnh pull trong git là:
git pull <remote> <branch>
Ý nghĩa từng tham số:
<remote>: Tên kho chứa từ xa mà bạn muốn pull. Theo mặc định, kho này có tên là origin.<branch>: Tên nhánh mà bạn muốn pull thay đổi. Nếu không chỉ định, git sẽ dùng nhánh hiện tại cùng nhánh upstream của nó.
Một số trường hợp sử dụng phổ biến của git pull:
- Pull thay đổi từ nhánh hiện tại:
git pull - Pull thay đổi từ một nhánh cụ thể:
git pull origin <branch>
Quy trình commit-pull-push
Khi sử dụng Git, tôi khuyến nghị thường xuyên pull cập nhật để đảm bảo nhánh cục bộ luôn mới nhất. Tôi đề xuất tuân theo các thực hành tốt sau:
- Trước khi bắt đầu làm việc, hãy pull các cập nhật mới nhất cho nhánh hiện tại để đảm bảo bạn đang làm trên phiên bản mới nhất.
- Commit thường xuyên, đảm bảo mỗi commit tập trung vào các thay đổi nhỏ, có liên quan logic.
- Sau khi thực hiện một số thay đổi và tạo commit, hãy pull lại để cập nhật nhánh của bạn, phòng khi ai đó cũng vừa cập nhật song song.
- Cuối cùng, push các thay đổi của bạn lên kho từ xa.

Xung đột Git
Khi chạy lệnh git pull để tải thay đổi từ kho từ xa, có thể gặp tình huống một commit khác đã sửa cùng những dòng như commit cục bộ của bạn. Git cố gắng tự động hợp nhất các thay đổi và thường thành công. Ví dụ, nếu các thay đổi được thực hiện ở những phần khác nhau của cùng một tệp, Git có thể hợp nhất trơn tru vì các commit ảnh hưởng đến các đoạn riêng biệt.
Tuy nhiên, nếu bạn và một cộng tác viên khác đã chỉnh sửa cùng một đoạn văn, git sẽ không thể xác định phiên bản nào cần giữ, dẫn đến xung đột hợp nhất. Lúc này, bạn sẽ cần tự xử lý xung đột bằng cách quyết định giữ thay đổi nào.
Để được hướng dẫn thêm về cách xử lý xung đột, tôi khuyến nghị đọc bài viết về cách giải quyết xung đột hợp nhất trong Git.
Tải về từ GitHub
Trong một số tình huống, bạn muốn có bản sao cục bộ của kho để sử dụng mà không có ý định chỉnh sửa. Nếu đó là kho công khai, bạn không cần cài Git trên máy. Bạn có thể tải trực tiếp kho từ GitHub bằng cách nhấp nút Code rồi đến nút Download Zip như hình dưới:

Kết luận
Clone Git cho phép bạn sao chép một kho Git về máy cục bộ, giúp bạn sử dụng mã hoặc mở rộng nó bằng cách thêm chức năng mới. Khi clone một kho, tất cả nhánh được tải xuống, điều này có thể tiêu tốn đáng kể dung lượng đĩa.
Các nhánh được dùng để làm việc trên những thay đổi hoặc tính năng cụ thể. Clone một nhánh cụ thể cho phép bạn đóng góp cho phần thay đổi đó mà không cần tải về những phần không liên quan, nhờ đó tiết kiệm nhiều dung lượng và giữ cho ổ đĩa của bạn gọn gàng hơn.
Nếu bạn muốn tìm hiểu thêm về chủ đề này, tôi gợi ý bài Hướng dẫn GitHub và Git cho người mới bắt đầu.
