Vòng đời của một File trong Git: Hiểu rõ 4 trạng thái Untracked, Unmodified, Modified, Staged
Giải thích vòng đời của file trong Git qua 4 trạng thái Untracked, Unmodified, Modified và Staged, kèm sơ đồ, câu lệnh thực hành và cách hoàn tác an toàn.
ShanverseCập nhật 8 phút đọc— lượt xemĐang tải lượt xem
Git
Developer Tools
Trong một Git repository, file thường di chuyển qua bốn trạng thái chính: Untracked, Unmodified, Modified và Staged. Đây là nền tảng để hiểu git status, git add, git commit, git restore và hầu hết quy trình làm việc hằng ngày.
Bức tranh tổng thể
Mermaid
Loading diagram…
Luồng phổ biến nhất:
Bình luận
💡
Warning
Tracked không phải một trạng thái ngang hàng với bốn trạng thái trên. Đây là nhóm file Git đã biết, bao gồm Unmodified, Modified và Staged. Untracked là file Git chưa theo dõi.
1. Untracked — Git chưa theo dõi file
Một file ở trạng thái Untracked khi nó tồn tại trong working directory nhưng chưa có trong commit trước và chưa được đưa vào staging area.
Ví dụ, tạo file mới:
Git sẽ hiển thị file dưới phần Untracked files.
Điều đó có nghĩa:
File đang nằm trên ổ đĩa.
Git nhìn thấy file.
File chưa được chọn cho commit tiếp theo.
Nếu xóa file lúc này, lịch sử Git không bị ảnh hưởng vì Git chưa theo dõi nó.
Đưa file vào staging area:
File chuyển từ Untracked sang Staged.
Khi không muốn Git theo dõi file
Các file như dependencies, output build, log và biến môi trường thường không nên được commit. Thêm chúng vào .gitignore:
.gitignore chỉ ảnh hưởng đến file chưa được theo dõi. Nếu file đã được commit, thêm nó vào .gitignore không tự động khiến Git ngừng theo dõi.
2. Unmodified — File giống commit gần nhất
Một file ở trạng thái Unmodified khi Git đang theo dõi file và nội dung trong working directory giống với snapshot của commit hiện tại.
Ngay sau khi clone repository hoặc vừa commit thành công, phần lớn file tracked ở trạng thái này.
Khi không có thay đổi, Git thường báo:
Unmodified không có nghĩa file không bao giờ được sửa. Nó chỉ có nghĩa phiên bản hiện tại của file không khác commit đang checkout.
Khi bạn mở file và thay đổi nội dung, file chuyển từ Unmodified sang Modified.
3. Modified — File đã thay đổi nhưng chưa được chọn
Một file ở trạng thái Modified khi Git đang theo dõi file và nội dung trong working directory khác với commit hiện tại, nhưng thay đổi mới chưa được đưa vào staging area.
Ví dụ:
Xem chính xác phần thay đổi chưa staged:
Ở trạng thái này, bạn có hai lựa chọn phổ biến.
Giữ thay đổi cho commit tiếp theo
File chuyển từ Modified sang Staged.
Loại bỏ thay đổi trong working directory
File quay về nội dung của index và thường trở lại Unmodified.
4. Staged — Snapshot đã được chọn cho commit kế tiếp
Một file ở trạng thái Staged khi phiên bản hiện tại của nó đã được sao chép vào staging area, còn gọi là index.
Git thường hiển thị file dưới phần Changes to be committed.
Xem nội dung đã staged:
Tạo commit:
Sau commit, snapshot đã staged được lưu vào repository. Nếu working directory không có thay đổi mới, file trở về Unmodified.
Đưa file ra khỏi staging area
Nếu stage nhầm file:
Lệnh này bỏ phiên bản file khỏi staging area nhưng giữ thay đổi trong working directory. File thường chuyển từ Staged về Modified; nội dung bạn đã viết không bị xóa.
Staging area thực sự lưu gì?
Một hiểu lầm phổ biến là staging area chỉ lưu “tên các file sẽ commit”. Thực tế, nó lưu snapshot nội dung đã chọn cho commit tiếp theo.
Thử quy trình sau:
Lúc này, profile.js có thể xuất hiện ở hai nơi trong git status:
Một phiên bản nằm trong Staged.
Phần chỉnh sửa mới hơn nằm trong Modified.
So sánh hai lớp thay đổi:
Nếu commit ngay, Git chỉ commit snapshot đã staged. Phần sửa sau lần git add vẫn ở working directory.
Thực hành toàn bộ vòng đời
Bước 1: Tạo repository thử nghiệm
Bước 2: Tạo file mới — Untracked
Bước 3: Stage file — Staged
Bước 4: Commit — Unmodified
Bước 5: Chỉnh sửa — Modified
Bước 6: Stage thay đổi — Staged
Bước 7: Bỏ stage — Modified
Bước 8: Stage và commit lại — Unmodified
Đọc nhanh git status --short
Dạng rút gọn giúp bạn xem nhiều file nhanh hơn:
Một số ký hiệu thường gặp:
Hai cột đầu lần lượt mô tả trạng thái của index và working tree. Vì vậy vị trí của chữ cái rất quan trọng.
File bị xóa hoặc đổi tên thì sao?
Nếu xóa một file tracked bằng trình quản lý file, Git thấy đó là một thay đổi chưa staged:
Stage thao tác xóa:
Hoặc xóa và stage trong một lệnh:
Đổi tên bằng Git:
Git dựa trên nội dung để phát hiện rename. git mv là cách tiện lợi để thực hiện thao tác di chuyển rồi stage thay đổi.
Bảng lệnh theo mục tiêu
Những nhầm lẫn thường gặp
“Modified nghĩa là file chưa được Git theo dõi”
Không đúng. Modified là file đã được theo dõi nhưng khác với snapshot hiện tại. File Git chưa theo dõi là Untracked.
“Chạy git add một lần là đủ”
Nếu bạn sửa file tiếp sau khi stage, phần mới không tự động được thêm vào snapshot đã staged. Cần chạy git add lần nữa nếu muốn đưa nó vào cùng commit.
“git commit lưu mọi thay đổi đang thấy”
Thông thường, commit chỉ lưu snapshot trong staging area. Thay đổi Modified và file Untracked chưa stage sẽ không nằm trong commit.
“Unmodified nghĩa là file rỗng hoặc không quan trọng”
Unmodified chỉ mô tả sự giống nhau giữa working tree và commit hiện tại; nó không nói gì về nội dung hay mức độ quan trọng của file.
Quy trình an toàn trước mỗi commit
Quy trình này giúp commit chỉ chứa những thay đổi có cùng mục đích và tránh đưa nhầm file vào lịch sử.
Tổng kết
Bốn trạng thái tạo thành vòng đời cơ bản của một file trong Git:
Untracked: Git nhìn thấy file nhưng chưa theo dõi.
Unmodified: file tracked giống commit hiện tại.
Modified: file tracked đã thay đổi nhưng chưa stage.
Staged: snapshot của thay đổi đã sẵn sàng cho commit kế tiếp.
1# 1. Xem toàn bộ trạng thái2gitstatus34# 2. Đọc thay đổi chưa staged5gitdiff67# 3. Chọn file liên quan8gitaddsrc/app.jssrc/app.test.js910# 4. Xem chính xác snapshot sẽ được commit11gitdiff--staged1213# 5. Tạo commit14gitcommit-m"feat: add application behavior"
Bài viết liên quan
Những bài viết có cùng chủ đề hoặc công nghệ bạn có thể muốn đọc tiếp.
Hướng dẫn Git Aliases và .gitconfig thực chiến: alias an toàn, log đẹp, cấu hình pull/push/rebase, includeIf cho tài khoản work/personal, bảo mật và chia sẻ dotfiles.
Phân tích Gitflow vs GitHub Flow vs Trunk-Based Development: cấu trúc branch, ưu nhược điểm, điều kiện áp dụng, ma trận quyết định và lộ trình chuyển đổi cho từng loại dự án.
Hướng dẫn git worktree từ cơ bản đến thực tế: tạo nhiều working tree, làm feature và hotfix song song, review PR, quản lý list/remove/prune/lock/repair và tránh lỗi phổ biến.