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 init hay git clone theo 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ướcLệnhĐiều xảy ra
1echo "Xin chào" > hello.txtTệp mới chỉ nằm trong Working Directory. Git chưa theo dõi nên nó ở trạng thái untracked.
2git status --shortDấu ?? báo tệp chưa được theo dõi.
3git add hello.txtAdd đưa bản hiện tại vào Staging Area. Tệp chuyển sang trạng thái staged.
4git 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.
5echo "Xin chào, Git" > hello.txtSử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.
6git status --shortChữ M ở cột bên phải nghĩa là đã sửa nhưng chưa staged.
7git 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ướcLệnhĐiều xảy ra
1echo "Xin chào, Git" > hello.txtSửa tệp: Working Directory có v2, hai vùng còn lại giữ v1.
2git status --shortTệp ở trạng thái modified, chưa staged.
3git restore hello.txtRestore lấy lại bản từ Staging Area về Working Directory. Thay đổi chưa staged bị bỏ.
4git status --shortKhô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ả." init tạo kho trống, còn clone sao chép kho đã có kèm lịch sử và remote origin.

Tự kiểm tra

  1. 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?
  2. Tệp a.txt vừa tạo, chưa chạy lệnh Git nào. Nó ở trạng thái gì?
  3. Bạn sửa tệp sau khi git add rồi chạy git 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ớ

  • init bắt đầu từ trống, clone bắ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 init tạo ra những gì.

Nguồn tham khảo

Pro Git, chương 2.1 và 2.2 (git-scm.com/book).