Dat's Blog
Trang chủ Blog Videos Giới thiệu

3 vùng bạn phải hiểu: Working Directory, Staging Area, Repository

Đây là bài quan trọng nhất khi học Git — hiểu 3 vùng này thì mọi lệnh Git sẽ có nghĩa.


Tóm tắt AI

3 vùng bạn phải hiểu: Working Directory, Staging Area, Repository

Nếu bạn đã từng chạy git add rồi git commit mà không hiểu tại sao phải làm 2 bước — bài này dành cho bạn.

Đây là bài quan trọng nhất trong series. Hiểu được 3 vùng này thì mọi lệnh Git sau này sẽ tự nhiên có nghĩa. Không hiểu thì dù học bao nhiêu lệnh cũng chỉ copy-paste mù quáng.

3 vùng trong Git

Git chia công việc của bạn thành 3 vùng riêng biệt:

┌─────────────────┐    git add    ┌──────────────┐   git commit   ┌────────────┐
│ Working         │ ────────────► │ Staging Area │ ─────────────► │ Repository │
│ Directory       │               │  (Index)     │                │  (.git)    │
└─────────────────┘               └──────────────┘                └────────────┘

1. Working Directory — nơi bạn làm việc

Đây là thư mục dự án trên máy bạn — nơi bạn tạo file, sửa code, xóa thứ không cần. Git biết những file nào thay đổi, nhưng chưa làm gì với chúng cho đến khi bạn bảo nó.

2. Staging Area — vùng chuẩn bị

Còn gọi là Index. Đây là vùng trung gian — bạn "chọn lọc" những thay đổi nào muốn đưa vào commit tiếp theo.

Tại sao cần vùng này? Vì không phải lúc nào bạn cũng muốn commit tất cả những gì đang thay đổi. Ví dụ bạn sửa 5 file, nhưng chỉ muốn commit 2 file liên quan đến một tính năng cụ thể.

3. Repository — kho lưu trữ lịch sử

Thư mục ẩn .git trong project của bạn. Mỗi lần git commit, Git tạo một "snapshot" và lưu vào đây vĩnh viễn. Đây là nơi chứa toàn bộ lịch sử dự án.

Ví dụ thực tế: bếp nấu ăn

Hãy nghĩ như một đầu bếp:

Git Nhà bếp
Working Directory Nguyên liệu thô trên bàn
Staging Area Đĩa đã sắp xếp sẵn, chuẩn bị nấu
Repository Ảnh chụp món ăn hoàn chỉnh, lưu lại mãi mãi

Bạn không chụp ảnh nguyên liệu đang bừa bộn — bạn chụp khi mọi thứ đã được sắp xếp gọn gàng.

Demo thực hành

Tạo một repo mới và thử luôn:

mkdir thu-git && cd thu-git
git init

Tạo một file:

echo "# Dự án thử nghiệm" > README.md

Kiểm tra trạng thái — lúc này file đang ở Working Directory, chưa được Git theo dõi:

git status
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md

Đưa vào Staging Area:

git add README.md
git status
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   README.md

Commit vào Repository:

git commit -m "feat: khởi tạo README"
git log --oneline
a1b2c3d feat: khởi tạo README

Các lệnh hay dùng

# Xem trạng thái 3 vùng
git status

# Đưa file vào staging
git add ten-file.txt
git add .          # thêm tất cả thay đổi

# Commit từ staging vào repository
git commit -m "mô tả thay đổi"

# Xem lịch sử commit
git log
git log --oneline  # gọn hơn

Lỗi hay gặp

Quên git add trước khi commit:

git commit -m "cập nhật code"
# → nothing to commit, working tree clean

Git không tự biết bạn muốn commit gì — phải add vào staging trước.

Muốn bỏ file ra khỏi staging:

git restore --staged ten-file.txt

File vẫn còn trong Working Directory, chỉ bị đưa ra khỏi staging thôi — không mất gì.

Tổng kết

3 vùng của Git:

  • Working Directory: nơi bạn làm việc
  • Staging Area: vùng chọn lọc, chuẩn bị commit
  • Repository: kho lưu trữ lịch sử vĩnh viễn

Flow cơ bản: sửa file → git addgit commit. Hai bước này không thể gộp lại vì mục đích của chúng khác nhau.

Bài 3 tới mình sẽ đi sâu vào git log — cách đọc lịch sử commit, hiểu HEAD là gì, và tại sao "detached HEAD" nghe đáng sợ nhưng thực ra không phải vậy.


Series Git cơ bản — Bài 2/10