Bài trước: Git thực hành (4) - Các khu vực làm việc của Git
5. Các khu vực làm việc của Git (tiếp)
5.1 Khu tạm
Như đã đề cập, Khu tạm (staging area), hay còn gọi là index, là một khu vực trung gian giữa Thư mục làm việc (working directory) và Kho chứa (repository). Nó cho phép bạn chọn lọc và tổ chức các thay đổi bạn muốn đưa vào commit tiếp theo.
Ở phần trước, bạn cũng đã biết cách sử dụng lệnh git add để chọn các tập tin trong Thư mục làm việc sẽ được commit, danh sách các tập tin được lưu vào Khu tạm.
Khu tạm là tập tin index trong thư mục .git.
Lệnh git rm --cached <tên_tập_tin>
Trong trường hợp bạn đã đưa tên một tập tin vào Khu tạm, tuy nhiên, do đưa nhầm tập tin hoặc không muốn commit tập tin đó nữa. Khi đó, bạn sẽ sử dụng lệnh git rm để gỡ bỏ tên tập tin ra khỏi Khu tạm.
Ví dụ, ở phần trước bạn đã đưa tên tập tin index.js vào Khu tạm. Dùng lệnh sau để gỡ bỏ tên index.js ra khỏi Khu tạm.
E:\HocGit\TeoShop>git rm --cached index.js
rm 'index.js'
Kiểm tra lại trạng thái của TeoShop
E:\HocGit\TeoShop>git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in
what will be committed)
index.js
nothing added to commit but untracked files present (use "git
add" to track)
Lệnh git status cho biết: index.js là tập tin chưa được Git theo dõi (Untracked files) và không có tập tin nào để commit.
Mở lại .git\index, bạn sẽ không thấy tên tập tin index.js trong index.
5.2 gitignore
Git ignore là một cơ chế trong Git, cho phép bạn chỉ định các tập tin hoặc thư mục mà Git sẽ bỏ qua (không theo dõi - untracked) khi thực hiện các lệnh như git add hoặc git status. Điều này được thực hiện thông qua tập tin .gitignore, thường được đặt ở thư mục gốc của dự án. Mục đích là loại bỏ các tập tin không cần thiết khỏi lịch sử phiên bản, như tập tin tạm, tập tin nhị phân, hoặc thư viện phụ thuộc.
Ignore có nghĩa là bỏ qua.
Công dụng của gitignore
- Tránh commit rác: không thêm các tập tin không liên quan (ví dụ: node_modules, tập tin log) vào kho chứa.
- Giữ lịch sử sạch: tập trung vào mã nguồn chính.
- Tăng hiệu quả: giảm kích thước kho chứa và tránh xung đột không cần thiết.
Cách sử dụng gitignore
- Tạo tập tin .gitignore trong thư mục dự án.
- Trong tập tin .gitignore, ghi các mẫu (pattern) của tập tin/thư mục muốn bỏ qua.
Thực hành với gitignore
- Đảm bảo trong khi thư mục TeoShop chưa có tập tin .gitignore, bạn tạo tập tin
test.log, sau đó dùng lệnh git status để kiểm tra trạng thái.
E:\HocGit\TeoShop>git status
On branch master
No commits yet
Untracked files:
(use "git add
<file>..." to include in what will be committed)
index.js
test.log
- Bạn sẽ thấy khi chưa có tập tin .gitignore, thì tập tin test.log vẫn được Git quan tâm. Bằng chứng là trong lệnh git status có đề cập tới.
- Thực hiện đưa test.log vào Khu tạm
E:\HocGit\TeoShop>git add test.log
- Bạn vẫn thực hiện việc đưa test.log vào Khu tạm được.
- Thực hiện gỡ test.log ra khỏi Khu tạm
E:\HocGit\TeoShop>git rm --cached test.log
rm 'test.log'
- Trong thư mục TeoShop, tạo tập tin .gitignore
- Trong tập tin .gitignore thêm nội dung sau
[.gitignore]
node_modules/
dist/
.env
*.log
*.tmp
Ý nghĩa của các dòng mà bạn vừa thêm vào tập tin .gitignore: bỏ qua toàn bộ thư mục node_modules, dist; bỏ qua tập tin.env; bỏ qua các tập tin có đuôi là .env, .log, .tmp.
- Thực hiện lại lệnh git status, sẽ không còn thấy Git nhắc tới tập tin test.log, mặc dù test.log vẫn tồn tại trong thư mục TeoShop. Nghĩa là .gitignore đã có tác dụng.
E:\HocGit\TeoShop>git status
On branch master
No commits yet
Untracked files:
(use "git add
<file>..." to include in what will be committed)
.gitignore
index.js
Vậy là bạn đã làm quen với gitignore.
Bạn nên tìm hiểu thêm về cách viết nội dung trong .gitignore.
Bạn có thể tham khảo các tập tin “.gitignore mẫu” cho các ngôn ngữ lập trình và các môi trường cụ thể. Ví dụ các mẫu trên Github: https://github.com/github/gitignore
Tập tin .gitignore cũng cần được commit vào kho chứa, để các thành viên trong nhóm cùng dùng một bộ quy tắc của gitignore. Điều này đảm bảo mọi người sẽ làm việc với một kho chứa gọn gàng, tránh được các xung đột không cần thiết.
5.3 Kho chứa
Như đã đề cập, Kho chứa (repository) là nơi lưu trữ tất cả các tập tin và lịch sử thay đổi của một dự án. Thư mục .git trong dự án chính là Kho chứa. Dùng git commit để chuyển tập tin từ Khu tạm sang Kho chứa. Ví dụ: sau lệnh git commit, những thay đổi của tập tin index.js sẽ được lưu vào .git.
Kho chứa giống như một cơ sở dữ liệu, chứa mọi phiên bản của mã nguồn, cho phép bạn quay lại bất kỳ thời điểm nào trong quá trình phát triển.
Có 2 loại kho chứa: kho chứa cục bộ và kho chứa ở xa
Kho chứa cục bộ (local repository)
- Là kho chứa nằm trên máy tính cá nhân của bạn.
- Bạn có thể tạo kho chứa cục bộ bằng lệnh git init.
- Đây là nơi bạn làm việc trực tiếp với mã nguồn và thực hiện các commit.
Kho chứa ở xa (remote repository)
- Là kho chứa được lưu trữ trên một máy chủ ở xa, chẳng hạn như GitHub, GitLab hoặc Bitbucket.
- Kho chứa ở xa cho phép nhiều người cùng làm việc trên một dự án và chia sẻ các thay đổi.
- Bạn có thể sao chép kho chứa ở xa về máy tính của mình bằng lệnh git clone.
5.4 Lệnh git commit
git commit là lệnh trong Git, dùng để lưu các thay đổi từ Khu tạm vào Kho chứa, tạo ra một "ảnh chụp" (snapshot) mới trong lịch sử phiên bản. Mỗi commit đi kèm một thông điệp (message) mô tả thay đổi, giúp theo dõi và quản lý mã nguồn hiệu quả.
Vai trò của lệnh git commit
- Ghi nhận thay đổi: lưu vĩnh viễn các tập tin/thay đổi đã được thêm bằng git add.
- Tạo lịch sử: mỗi commit là một mốc thời gian, gắn với định danh người dùng (tác giả).
- Hỗ trợ cộng tác: giúp nhóm biết ai đã làm gì và khi nào.
Cú pháp cơ bản
- git commit -m "Thông điệp": commit với thông điệp ngắn gọn.
- git commit: mở trình soạn thảo để viết thông điệp chi tiết.
- git commit -a -m "Thông điệp": tự động thêm các tập tin đã theo dõi (tracked) và commit.
Quy trình làm việc thực tế
- Chỉnh sửa tập tin trong Khu vực làm việc (working directory).
- Dùng git add để đưa vào Khu tạm (staging area).
- Dùng git commit để lưu vào Kho chứa (repository).
Cách viết thông điệp trong lệnh commit
Thông điệp commit là phần mô tả ngắn gọn nhưng rõ ràng về thay đổi bạn vừa thực hiện. Nó được viết khi dùng git commit, giúp bạn và nhóm hiểu mục đích của commit khi xem lại lịch sử.
Cách viết theo chuẩn thường dùng:
[1] Dòng đầu tiên (Subject):
- Ngắn gọn (dưới 50 ký tự), mô tả chính xác thay đổi.
- Dùng động từ ở dạng mệnh lệnh (imperative), như "Add", "Fix", "Update".
- Ví dụ: "Add login feature".
[2] Dòng trống (nếu cần chi tiết):
- Để cách dòng đầu một dòng trống.
[3] Phần mô tả chi tiết (body, tùy chọn):
- Giải thích "tại sao" và "cái gì" nếu cần, dài không quá 72 ký tự.
- Dùng khi thay đổi phức tạp.
[4] Cách nhập thông điệp:
- Dùng -m cho thông điệp ngắn: git commit -m "Thông điệp".
- Không dùng -m để mở trình soạn thảo (như Vim) viết chi tiết.
Ví dụ dùng -m với thông điệp ngắn:
git commit -m
"Initialize Node.js project with Express and Nodemon"
Ví dụ dùng thông điệp chi tiết:
Fix: resolve issue with user login
This commit addresses a bug where users were unable to log in due to an incorrect password validation.
- Modified the password validation logic in `auth.py`.
- Added unit tests to verify the fix.
Kinh nghiệm hữu ích:
- Hãy viết thông điệp commit ngay khi thực hiện commit.
- Đừng ngại viết thông điệp commit dài nếu cần thiết.
- Sử dụng các công cụ hỗ trợ để kiểm tra và định dạng thông điệp commit.
5.5 Bài tập
Bài tập 5.1 Thực hành các nội dung trong bài học
Câu hỏi 5.2 Khu tạm (staging area) trong Git là gì? Phát biểu nào sau đây không đúng?
A. Khu tạm là một khu vực trung gian giữa Thư mục làm việc (working directory) và Kho chứa (repository).
B. Khu tạm là một thư mục vật lý trong Thư mục làm việc.
C. Khu tạm cho phép bạn chọn lọc và tổ chức các thay đổi bạn muốn đưa vào commit tiếp theo.
D. Lệnh git rm --cached <tên_tập_tin> được sử dụng để gỡ bỏ tên tập tin ra khỏi Khu tạm.
Câu hỏi 5.3 gitignore là gì? Phát biểu nào sau đây không đúng?
A. gitignore giúp thêm các tập tin không liên quan (ví dụ: node_modules, tập tin log) vào kho chứa.
B. gitignore là một cơ chế trong Git, cho phép bạn chỉ định các tập tin hoặc thư mục mà Git sẽ bỏ qua khi thực hiện các lệnh như git add hoặc git status.
C. gitignore được thực hiện thông qua tập tin có tên là .gitignore, thường đặt ở thư mục gốc của dự án.
D. Mục đích của gitignore là loại bỏ các tập tin không cần thiết khỏi lịch sử phiên bản,
như tập tin tạm, tập tin nhị phân, hoặc thư viện phụ thuộc.
Câu hỏi 5.4 Kho chứa (repository) trong Git là gì? Phát biểu nào sau đây không
đúng?
A. Kho chứa là nơi lưu trữ tất cả các tập tin và lịch sử thay đổi của một dự án.
B. Thư mục .git trong dự án chính là Kho chứa.
C. Lệnh git commit được sử dụng để chuyển tập tin từ Thư mục làm việc (working directory) sang Kho chứa.
D. Kho chứa cục bộ (local repository) là kho chứa được lưu trữ trên một máy chủ ở xa.
Câu 5.5 Commit trong Git là gì? Phát biểu nào sau đây không đúng?
A. Commit là lệnh trong Git dùng để lưu các thay đổi từ Khu tạm vào Kho chứa.
B. Commit tạo ra một "ảnh chụp" (snapshot) mới trong lịch sử phiên bản.
C. Commit dùng để chuyển tập tin từ Kho chứa sang Khu tạm.
D. Mỗi commit đi kèm một thông điệp (message) mô tả thay đổi.