Tổng quan: thiết lập một kho Git
Xem thửVấn đề cần giải quyết
Bạn nhận một dự án mới. Có khi thư mục dự án đã tồn tại trên máy nhưng chưa dưới sự quản lý của Git; có khi dự án nằm sẵn trên GitHub và bạn cần một bản về máy. Hai tình huống này dùng hai lệnh khác nhau, và cả hai dẫn tới cùng một đích: một kho (repository) mà bạn có thể commit vào.
Sau bài này, bạn có thể
- Chọn
git inithaygit clonetheo tình huống. - Mô tả ba trạng thái của một tệp: untracked, staged, committed.
- Gọi tên ba khu vực: Working Directory, Staging Area và thư mục
.git.
Tiên quyết: chương Nhập môn Git.
Hai cách có một kho
Đang tải sơ đồ…
Cách đọc hình. Câu hỏi duy nhất cần trả lời là dự án đã có trên remote chưa. Nếu chưa, git init biến thư mục hiện có thành kho với lịch sử trống. Nếu rồi, git clone sao chép kho từ xa về kèm toàn bộ lịch sử. Hai nhánh gặp nhau ở hộp cuối: bạn có một kho sẵn sàng commit.
Ba khu vực và vòng đời của một tệp
Mỗi dự án Git có ba khu vực:
- Working Directory: nơi bạn thực sự sửa tệp.
- Staging Area (Index): bản nháp của commit kế tiếp.
- Thư mục
.git: nơi Git lưu toàn bộ lịch sử và dữ liệu mô tả của kho.
Một tệp trong thư mục làm việc ở một trong các trạng thái: untracked (Git chưa theo dõi), staged (đã vào vùng chờ commit), committed (đã vào lịch sử), và sau khi sửa lại nó thành modified.
Thử và quan sát
Hãy dự đoán: sau khi commit, bạn sửa tiếp tệp rồi chạy git status. Tệp ở trạng thái nào, và nó khác chỗ nào so với bản trong kho? Chạy mô phỏng và dùng nút biến thể để thử hoàn tác một thay đổi chưa staged.
Đang tải Animation…
Bảng bước (bản đọc tĩnh của mô phỏng)
| Bước | Lệnh | Điều xảy ra |
|---|---|---|
| 1 | echo "Xin chào" > hello.txt | Tệp mới chỉ nằm trong Working Directory. Git chưa theo dõi nên nó ở trạng thái untracked. |
| 2 | git status --short | Dấu ?? báo tệp chưa được theo dõi. |
| 3 | git add hello.txt | Add đưa bản hiện tại vào Staging Area. Tệp chuyển sang trạng thái staged. |
| 4 | git commit -m "Thêm hello.txt" | Commit chụp Staging Area vào Repository. Tệp chuyển sang trạng thái committed và có commit đầu tiên C1. |
| 5 | echo "Xin chào, Git" > hello.txt | Sửa tệp đã theo dõi: Working Directory có v2 khác bản v1 trong Staging Area và Repository. Trạng thái modified. |
| 6 | git status --short | Chữ M ở cột bên phải nghĩa là đã sửa nhưng chưa staged. |
| 7 | git add hello.txt && git commit -m "Sửa lời chào" | Lặp lại hai bước: add đưa v2 vào staging, commit ghi C2. Ba vùng khớp nhau trở lại. |
Biến thể: Hoàn tác thay đổi chưa staged
| Bước | Lệnh | Điều xảy ra |
|---|---|---|
| 1 | echo "Xin chào, Git" > hello.txt | Sửa tệp: Working Directory có v2, hai vùng còn lại giữ v1. |
| 2 | git status --short | Tệp ở trạng thái modified, chưa staged. |
| 3 | git restore hello.txt | Restore lấy lại bản từ Staging Area về Working Directory. Thay đổi chưa staged bị bỏ. |
| 4 | git status --short | Không còn gì để báo: ba vùng lại khớp nhau. |
Giải đáp. Tệp ở trạng thái modified: Working Directory có bản mới (v2) trong khi Staging Area và Repository vẫn giữ v1. git status --short hiện chữ M ở cột bên phải. Mỗi lệnh chỉ đẩy tệp đi đúng một bước: add từ Working Directory sang Staging Area, commit từ Staging Area sang Repository.
Hiểu lầm thường gặp
- "git commit lưu mọi thứ tôi vừa sửa." Commit chỉ lưu những gì đang ở Staging Area. Tệp modified chưa add sẽ không vào commit.
- "Tệp mới tự động được Git theo dõi." Tệp mới luôn bắt đầu ở untracked; phải
git addít nhất một lần. - "clone và init cho cùng kết quả."
inittạo kho trống, cònclonesao chép kho đã có kèm lịch sử và remoteorigin.
Tự kiểm tra
- Bạn có một thư mục mã nguồn chưa dùng Git. Lệnh nào đưa nó vào Git?
- Tệp
a.txtvừa tạo, chưa chạy lệnh Git nào. Nó ở trạng thái gì? - Bạn sửa tệp sau khi
git addrồi chạygit commit. Bản nào đi vào commit?
Đáp án gợi ý. (1) git init. (2) Untracked. (3) Bản đã có trong Staging Area tại thời điểm add; lần sửa sau vẫn nằm ở Working Directory (tệp ở trạng thái modified).
Điều cần nhớ
initbắt đầu từ trống,clonebắt đầu từ một kho đã có.- Ba khu vực: Working Directory, Staging Area,
.git. - Mỗi lệnh đẩy tệp đi một bước; hiểu ba khu vực là chìa khóa cho mọi lệnh sau.
- Bài sau:
git inittạo ra những gì.
Nguồn tham khảo
Pro Git, chương 2.1 và 2.2 (git-scm.com/book).