Sau một lần thử build, working tree có thêm file nháp, thư mục thử nghiệm và sản phẩm build bị ignore. Bạn muốn dọn đúng một phần trong số đó. Trước khi dùng git clean, cần nhìn rõ tập đường dẫn mà lệnh đang chọn, vì một chữ x viết hoa hay viết thường có thể đổi hẳn phạm vi.
Bài kiểm tra bằng Git 2.54.0, đối chiếu tài liệu ngày 08/11/2026. Mọi thao tác thực nghiệm nằm trong repository tạm mới tạo; không chạy clean trong repository làm việc của blog. Ví dụ không đụng remote, lịch sử commit, submodule hoặc repository lồng nhau.
Hiểu dry-run trước khi bật xóa thật
git-clean dùng -n để chỉ liệt kê những gì sẽ xóa. -d cho phép xét thư mục untracked khi không chỉ định pathspec. Mặc định, file ignored không nằm trong tập dọn; -X chỉ chọn ignored, còn -x đưa cả ignored vào phạm vi.
Đừng suy từ chữ “ignored” thành “không có giá trị”. gitignore mô tả quy tắc bỏ qua file chưa được track; nó không đánh giá file nào còn cần dùng. Một thư mục build có thể tái tạo, nhưng một file cấu hình local cũng có thể bị ignore.
Tạo một nơi thực hành riêng
Chạy trong Bash. Các lệnh đều dùng git -C với đường dẫn vừa sinh, nên không phụ thuộc thư mục terminal hiện tại:
set -eu
demo_repo=$(mktemp -d /tmp/aedev-clean-demo.XXXXXX)
git -C "$demo_repo" init -q
printf 'build/\n' > "$demo_repo/.gitignore"
printf 'tracked example\n' > "$demo_repo/README.md"
git -C "$demo_repo" add .gitignore README.md
mkdir "$demo_repo/scratch" "$demo_repo/build"
printf 'draft\n' > "$demo_repo/note.tmp"
printf 'scratch\n' > "$demo_repo/scratch/a.txt"
printf 'generated\n' > "$demo_repo/build/app.bin"
printf 'Demo repository: %s\n' "$demo_repo"
git -C "$demo_repo" clean -nd
git -C "$demo_repo" clean -ndX
git -C "$demo_repo" clean -ndx
README và .gitignore đã vào index; ví dụ không cần tạo commit để Git nhận biết hai đường dẫn được track. Ba phần còn lại cố tình đại diện cho file untracked, thư mục untracked và thư mục ignored.
Trong môi trường kiểm tra, lượt -nd liệt kê note.tmp và scratch/; lượt -ndX chỉ liệt kê build/; lượt -ndx liệt kê cả ba. Tên thông báo có thể phụ thuộc ngôn ngữ của Git, nên hãy đối chiếu đường dẫn và xác nhận các file vẫn tồn tại sau cả ba lượt.
Chỉ xóa một thư mục của ví dụ
Sau khi đã kiểm tra dry-run, chạy tiếp trong cùng shell, với biến demo_repo vẫn trỏ đúng repository tạm:
test -n "$demo_repo"
test -f "$demo_repo/scratch/a.txt"
git -C "$demo_repo" clean -nd -- scratch/
git -C "$demo_repo" clean -fd -- scratch/
test ! -e "$demo_repo/scratch"
test -f "$demo_repo/note.tmp"
test -f "$demo_repo/build/app.bin"
test -f "$demo_repo/README.md"
Lần xóa thật chỉ nhắm scratch/. Các lệnh test sau đó xác nhận thư mục ấy mất, còn file nháp, sản phẩm build và README vẫn ở đó. Dấu -- ngăn pathspec bị hiểu thành tùy chọn. Lệnh có -f là thao tác xóa thật; ở bài này nó chỉ dùng với dữ liệu thử nghiệm vừa tạo.
Một quy trình áp dụng vào công việc
Trước hết xác định đường dẫn bạn thực sự muốn dọn. Chạy dry-run với chính tùy chọn và pathspec dự định dùng, đọc danh sách rồi mới quyết định. Nếu thay -X bằng -x, thay pathspec hoặc chạy từ vị trí khác, hãy xem trước lại vì tập ứng viên đã đổi.
Không coi git clean là cách hoàn tác mọi trạng thái của working tree. Ví dụ chỉ dọn file chưa được track; nó không giải quyết phần sửa của README đã được track. Cũng đừng trông chờ Git khôi phục một file nháp chưa từng được add hoặc commit chỉ vì nó từng nằm trong thư mục repository.
Lỗi thường gặp khi đọc phạm vi
- Chạy dry-run thiếu
-d, sau đó xóa thật lại thêm-d: hai lần đang xét phạm vi khác nhau. - Nhìn nhầm
-xvà-X: kiểm tra trực tiếp danh sách đường dẫn trong ba lượt của ví dụ. - Chạy từ thư mục con rồi nghĩ đang dọn toàn repo: dùng đường dẫn gốc rõ ràng và kiểm tra lại vị trí.
- Sao chép lệnh xóa rộng từ log cũ: tạo dry-run mới trên trạng thái hiện tại.
Bài tập tiếp theo là thêm một file mới vào scratch, chạy lại phần xem trước và dự đoán kết quả trước khi đọc log. Khả năng đọc chính xác tập ứng viên quan trọng hơn việc nhớ một chuỗi cờ dọn nhanh.

