File cấu hình riêng của máy đã được commit trước khi nhóm thêm quy tắc ignore. Chỉ thêm tên file vào gitignore chưa làm Git ngừng track nó. Bạn cần phân biệt bản file trên đĩa với entry trong index chuẩn bị cho commit tiếp theo.
Fixture dưới đây chạy bằng Git 2.54.0 trong repository tạm, với cấu hình global/system được cô lập khi biên tập. Tài liệu Git được đọc ngày 04/11/2026. Không thao tác trên repository công việc thật, không fetch hoặc push và không viết lại lịch sử.
Dùng file demo không chứa thông tin riêng
Đoạn Bash tạo một repository riêng rồi in đường dẫn để bạn xem tiếp. Nó không tự xóa thư mục sau khi chạy:
(
set -eu
demo_dir=$(mktemp -d)
echo "$demo_dir"
cd "$demo_dir"
git init -q -b main
git config user.name 'AeDev Demo'
git config user.email '[email protected]'
git config commit.gpgsign false
printf '{"theme":"demo"}\n' > local.settings.json
git add local.settings.json
git -c core.hooksPath=/dev/null commit -qm 'Track demo settings'
printf '/local.settings.json\n' > .gitignore
git add .gitignore
git rm --cached -- local.settings.json
test -f local.settings.json
cat local.settings.json
git status --short
git diff --cached --name-status
)
Fixture đã chạy thành công. File trên đĩa vẫn chứa JSON theme demo. Index chuẩn bị thêm .gitignore và xóa local.settings.json khỏi snapshot tiếp theo. Status thể hiện một file được thêm và một file được xóa trong phần staged, dù file local vẫn tồn tại.
Đây là thao tác thay đổi index, không phải một lệnh xem trạng thái chỉ đọc. Tên file trong ví dụ là dữ liệu demo; trước khi áp dụng vào dự án thật, xác định chính xác file cần ngừng chia sẻ và đọc phần thay đổi đang stage.
Vì sao cần cả cached và ignore?
git rm --cached bỏ đường dẫn khỏi index và giữ file working tree. Quy tắc ignore giúp những lần add thông thường sau đó không đưa lại file local vào tracking. Hai bước phục vụ hai mục đích khác nhau.
Dấu / đầu pattern trong ví dụ đặt đường dẫn từ gốc file gitignore này. Nếu file nằm trong thư mục con hoặc cần nhiều quy tắc, hãy đối chiếu pattern thật. Không thay mẫu đơn lẻ bằng lệnh bỏ toàn bộ index chỉ để xử lý một file.
Kiểm tra trước và sau commit
Trong repository thử đã in đường dẫn, có thể chạy tiếp:
git ls-files -- local.settings.json
git check-ignore -v -- local.settings.json
git -c core.hooksPath=/dev/null commit -qm 'Keep local settings outside tracking'
test -f local.settings.json
git status --short
git show HEAD~1:local.settings.json
Các bước đã được chạy trong fixture. ls-files không còn liệt kê file, check-ignore chỉ ra quy tắc, status sau commit sạch và file trên máy vẫn còn. Lệnh cuối vẫn đọc được nội dung từ commit cũ, vì việc bỏ tracking hiện tại không xóa lịch sử đã có.
Không diễn giải status sạch thành “file không tồn tại” hoặc “Git đã xóa mọi bản sao”. Nó chỉ thể hiện quan hệ giữa working tree, index, commit và ignore theo cách Git đang theo dõi.
Giới hạn khi làm trong nhóm
Commit bỏ file khỏi snapshot sẽ thay đổi nội dung mà các máy khác nhận khi cập nhật nhánh. Việc giữ bản local trên máy đang thao tác không phải cam kết rằng mọi working tree khác đều giữ file theo cùng trạng thái. Nhóm nên thống nhất cách cung cấp file mẫu và tạo cấu hình local.
Nếu nội dung cũ có dữ liệu nhạy cảm, chỉ bỏ tracking không giải quyết những bản đã commit hoặc chia sẻ. Cần xử lý theo quy trình sự cố của nhóm; fixture không thực hiện thay đổi credential hay rewrite history. Với file demo ở đây, không có dữ liệu riêng cần xử lý.
Giữ thao tác nhỏ, chỉ rõ đường dẫn và kiểm staged diff trước khi commit. Cách kiểm chứng file trên đĩa, entry index và bản trong lịch sử giúp bạn biết chính xác điều gì đã thay đổi.


