Bạn sửa code, xóa một file cũ và tạo thêm file test. Sau git add -u, phần code được stage nhưng file test vẫn đứng ngoài commit. Lệnh đã làm đúng phạm vi của nó: cập nhật các đường dẫn đã có trong index, không thêm file untracked mới.
Bài kiểm tra bằng Git 2.54.0 ngày 05/11/2026. Mọi thao tác ghi được chạy trong repository tạm do ví dụ tạo, không dùng repository công việc, không fetch hoặc push. Tài liệu git-add hiện hành được đối chiếu riêng với phiên bản thực thi; không suy luận rằng máy người đọc đã cài cùng bản Git.
Phân biệt ba nhóm thay đổi
| Tình trạng file trong demo | add -u | add -A |
|---|---|---|
| Đã track, nội dung bị sửa | Stage nội dung mới | Stage nội dung mới |
| Đã track, bị xóa khỏi working tree | Stage việc xóa | Stage việc xóa |
| File mới chưa track, không bị ignore | Chưa thêm | Thêm vào index |
Index là ảnh nội dung chuẩn bị cho commit. Stage không có nghĩa đã commit, và cũng không có nghĩa các lần sửa tiếp theo tự đi vào index. Nếu sửa file sau lần add, cần xem lại diff rồi stage phần thay đổi mới khi muốn đưa nó vào commit.
1. Tạo một repository minh họa riêng
Chạy đoạn Bash dưới đây. Toàn bộ lệnh nằm trong dấu ngoặc tròn nên thay đổi thư mục không ảnh hưởng shell đang làm việc của bạn:
(
set -eu
demo_dir=$(mktemp -d)
printf '%s\n' "$demo_dir"
cd "$demo_dir"
git init -q
git config user.name 'AeDev Demo'
git config user.email '[email protected]'
printf 'old\n' > tracked.txt
printf 'remove later\n' > obsolete.txt
git add -- tracked.txt obsolete.txt
git -c commit.gpgsign=false commit -qm 'Initial demo files'
printf 'updated\n' > tracked.txt
rm -- obsolete.txt
printf 'new test\n' > new-test.txt
git add -u
git diff --cached --name-status
git status --short
)
Dòng đầu in đường dẫn thư mục tạm. Giữ đường dẫn ấy để kiểm tra tiếp. File obsolete.txt chỉ được xóa trong demo mới tạo; không chạy rời lệnh xóa này trong repository của bạn.
Phần diff cached phải có D cho obsolete.txt và M cho tracked.txt. status short còn có ?? new-test.txt, nghĩa là file mới vẫn untracked. Chỉ nhìn diff cached sẽ không cho thấy file mới đang đứng ngoài index.
2. Stage thêm file mới rồi đọc lại index
Mở shell ở đúng thư mục tạm vừa in, sau đó chạy các lệnh sau. Không dùng đường dẫn repository công việc để thay cho thư mục demo:
git add -A
git diff --cached --name-status
git status --short
git show :new-test.txt
Bây giờ diff cached có thêm A cho new-test.txt. Lệnh git show với dấu hai chấm đọc phiên bản của file trong index; nội dung cần thấy là new test. Bài không cần tạo thêm commit để chứng minh file đã được stage.
add -A không tự đưa file ignored mới vào index trong trường hợp thông thường. Nó cũng không phải cơ chế chọn đúng những thay đổi liên quan đến một task. Đọc danh sách và nội dung staged trước khi commit vẫn là bước cần làm.
Giới hạn phạm vi bằng pathspec
Với Git hiện đại, add -u hoặc add -A không có pathspec áp dụng trên toàn working tree, không chỉ thư mục con hiện tại. Nếu bạn đứng trong thư mục frontend rồi chạy add -u, thay đổi tracked ở nơi khác trong repository cũng có thể được stage.
Muốn giới hạn vào một thư mục, truyền pathspec sau dấu --, chẳng hạn thư mục tương đối mà bạn đã kiểm tra. Dấu -- ngăn tên đường dẫn bị đọc như option. Phân biệt việc giới hạn thư mục với việc chọn từng hunk; khi cần chọn một phần nội dung file, xem chế độ add -p.
Kiểm tra trước khi commit
Đọc cả status short để biết file còn ngoài index và diff cached để biết commit sắp chứa gì. Trong fixture, danh sách staged sau add -A phải đúng ba đường dẫn: một file mới, một file sửa, một file xóa. Nếu có đường dẫn khác, dừng lại và xác định bạn có đang ở đúng repository tạm không.
Khi sửa project thật, ưu tiên stage các đường dẫn liên quan rõ ràng rồi rà patch. Không dùng -A để chữa mọi lần “thiếu file” mà bỏ qua danh sách thay đổi; nó có thể đưa thêm nội dung bạn chưa định commit. Sau khi hiểu phạm vi -u và -A, bạn có thể chọn lệnh theo trạng thái file thay vì đoán từ tên gọi.

