Chào các bạn đã đến với chủ đề tiếp theo của mình. Ở những bài trước, mình có nhắc qua các khái niệm Commit và Staging Area. Nhưng có thể các bạn vẫn còn mơ hồ về nó. Ở bài này, mình sẽ giải thích rõ hơn để các bạn có thể hiểu hơn nhé.
Nội dung
1. Staging Area là gì?
Staging Area là khu vực mà nó sẽ được chuẩn bị cho quá trình commit. Trước hết, bạn cần phải hiểu rằng trong các hệ thông quản lý source code (Version Control System), thì dữ liệu được lưu trữ ở 2 nơi: 1 là thư mục mà bạn đang làm việc ở máy tính cá nhân (local repository) và 1 là nơi lưu trữ source code (còn gọi là remote repository, ví dụ như GitHub).
Nhưng với GIT thì nó có thêm 1 nơi nữa đó là khu vực trung gian mà hay gọi là Staging Area. Staging Area là khu vực lưu trữ những thay đổi của bạn để nó có thể được commit, vì muốn commit 1 tập tin nào đó thì tập tin đó phải nằm trong Staging Area. Các bạn hãy xem hình sau:
Các bạn có thể thấy rằng, trong hình trên, khi các bạn muốn đưa code từ máy local lên remote server, chúng ta phải dùng 3 câu lệnh:
- git add
- git commit -m ‘messsage’
- git push
Nếu chúng ta chỉ sử dụng lệnh git add, thì những thứ chúng ta thay đổi, nó vẫn còn nằm ở phía local mà chưa được đẩy lên remote server để lưu trữ. Đó là vì chúng chỉ mới được lưu vào vùng Staging Area.
Tiếp theo, sau khi sử dụng git add, chúng ta sẽ gọi tiếp lệnh git commit -m ‘message’. Tuy nhiên, với lệnh này, những thay đổi vẫn còn nằm trong local repository.
Khi chúng ta tạo repository ở GitHub, và checkout source code về máy local. Mặc định trong folder chứa source code đó sẽ tạo ra 1 thư mục git ẩn. Những thứ chúng ta thay đổi ở local sẽ được lưu ở đây.
2. Commit là gì? Cách hoạt động của nó ra sao?
Hiểu 1 cách đơn giãn thì commit có nghĩa là một hành động để GIT lưu lại 1 bản chụp (snapshot) của những sự thay đổi, và những sự thay đổi đó phải nằm trong Staging Area. Mỗi lần commit, nó sẽ lưu lại lịch sử chỉnh sửa source code kèm theo thông tin tên và email của người commit. Sau đó, chúng ta sẽ sử dụng lệnh git push để lưu tất cả những thay đổi này vào remote repository (GitHub)
Các bạn có thể lên GitHub để kiểm trả lại lịch sử commit, ví dụ như hình bên dưới, mình có 2 lần commit, mỗi commit sẽ có 1 ID tương ứng. Qua đó, khi mình làm việc trong 1 team lớn, mình có thể biết được ai commit, commit vào ngày nào. Nếu có issue thì mình có thể biết được issue đó đến từ commit nào. Từ đó mình có thể giải quyết issue nhanh hơn.
3. Các trạng thái khi commit
Khi làm việc với GIT, chúng ta sẽ có 4 trạng thái như hình bên dưới:
3.1. Untracked
Là trạng thái của file khi vừa mới được tạo ra. Ví dụ, chúng ta sẽ tạo file test.txt, sau đó dùng câu lệnh git status để xem trạng thái của nó
3.2. Tracked
Để chuyển trạng thái Untracked sang Tracked, chúng ta sẽ sử dụng lệnh git add. Có 2 cách để sử dụng câu lệnh này:
- “git add .” hoặc “git add -a” : add tất cả các file
- “git add <tên_file>”: add cụ thể 1 file nào đó
Ví dụ:
Một khi một tập tin đã được đưa về Tracked thì nó sẽ có thể thay đổi giữa 3 trạng thái khác nhau là Modified, Unmodified và Staged.
Tiếp tục với ví dụ trên, bây giờ, mình sẽ update file test.txt. Sau đó, mình sẽ dùng câu lệnh git status để check kết quả
Bây giờ, các bạn thấy file test.txt sẽ được hiển thị ở 2 trạng thái Staged (Changes to be committed) và Modified (Changes not staged for commit). Sở dĩ nó nằm ở 2 trạng thái này là vì trước đó bạn đã add và đưa file này vào Tracked. Sau đó bạn lại update nó nên nó tạo ra 1 version khác nên nó nằm ở trạng thái Modified. Nếu bây giờ bạn sử dụng câu lệnh git commit, thì bạn sẽ commit version mà trước khi bạn update. Còn nội dung bạn vừa mới update sẽ ko được commit.
Nếu bạn muốn commit luôn version có cả nội dung vừa được update, thì bạn phải gõ lại lệnh git add test.txt một lần nữa.
3.3. Chuyển tập tin từ Tracked về Untracked
Trong Git, bạn có thể đưa một tập tin từ Tracked về Untracked với lệnh rm –cached tên_file. Lệnh này sẽ giúp bạn đưa tập tin về trạng thái Untracked nhưng không xóa hẳn trong ổ cứng.
3.4. Hủy commit
Với ví dụ trên, giả sử mình đã add file text.txt vào vùng staging và đã commit nó. Như hình bên dưới:
Sau khi commit, file này vẫn còn nằm ở local mà chưa được push lên remote server. Lúc này, mình vô tình phát hiện ra có lỗi, nên mình quyết định hủy bỏ lần commit đó. Thế câu hỏi đặt ra là chúng ta có thể hủy bỏ không? Câu trả lời là Yes nhé.
Để hủy commit, mình sẽ dùng lệnh git reset –soft HEAD~1. Câu lệnh này sẽ hủy lần commit cuối cùng. Đồng thời, những gì chúng ta đã thay đổi trong lần commit cuối cùng sẽ được giữ lại.
Nếu các bạn muốn xóa những thay đổi của lần commit cuối cùng, thì chúng ta sẽ dùng câu lệnh git reset –hard HEAD~1
Ví dụ:
Trong hình trên, chúng ta có 2 lần commit. Lần 1 mình add file test.txt, và lần 2, mình update lại file đó. Bây giờ mình sẽ hủy lần commit 2 và kiểm tra lại lịch sử commit:
4. Lời kết
Trên đây, mình đã hoàn thành giới thiệu cách hoạt động của commit và các trạng thái của nó. Mình hi vọng qua bài viết này, các bạn sẽ có thể hiểu thêm với Git. Chúc các bạn thành công.
Nguồn tham khảo:
https://thachpham.com/tools/hieu-them-ve-commit-va-staging-area-git.html