“Git reset” được sử dụng khi nào?
Git reset được dùng đến khi muốn quay về một điểm commit nào đó, đồng thời cũng xóa lịch sử của các commit trước nó. Thường do chúng ta commit nhầm hoặc muốn xóa commit đó vì một lý do đặc biệt nào đó.
Git tuyệt vời, git mềm dẻo, nhưng hãy cẩn thận khi sử dụng “git reset” kẻo cả ngày code đi tong.
Cấu trúc câu lệnh git reset
git reset [--soft | --mixed | --hard | --merge | --keep] <commit>
Về cơ bản ta hay sử dụng 3 lệnh sau là chủ yếu:
git reset <commit> git reset --soft <commit> git reset --hard <commit>
trong đó git reset <commit>
thực chất chính là sử dụng tham số mặc định –mixed
Liên quan đến “git reset” chúng ta cần phải tìm hiểu lý thuyết về “HEAD, Working tree, Index trong git là gì?“
HEAD, Working tree, Index trong git là gì?
- Git giữ một con trỏ đặc biệt có tên HEAD. Trong Git, đây là một con trỏ tới nhánh nội bộ mà bạn đang làm việc
- Trên Git, những thư mục được đặt trong sự quản lý của Git mà mọi người đang thực hiện công việc trong thực tế được gọi là Working tree.
- Giữa repository và working tree tồn tại một nơi gọi là index. Index là nơi để chuẩn bị cho việc commit lên repository
Để hiểu chi tiết hơn về working tree và index, xem tại Git quản lý các file như thế nào?
Ví dụ tình huống sử dụng “git reset”
Giả sử repository của chúng ta có các commit như sau:
A - B - C (HEAD -> master)
git reset –soft B
git reset --soft B
Sẽ đưa HEAD về vị trí commit B, giữ nguyên các thay đổi đã được git add
tại B trong Staging Area. Tương ứng với tại B ta vừa git add
xong, khi này chỉ việc git commit
là ta lại có commit như C bên trên.
git reset B
git reset B
Sẽ đưa HEAD về vị trí commit B, đồng thời đưa các thay đổi về Working directory. Tương ứng với tại B ta vừa code xong, chưa git add
.
git reset –hard B
git reset --hard B
Sẽ đưa HEAD về vị trí commit B, đồng thời loại bỏ tất cả các thay đổi tại B. Tương ứng với tại B ta chưa code gì cả.
git reset HEAD~1
Đôi khi bạn thấy lệnh git reset HEAD~1 thì nó cũng tương đương với lệnh git reset B như trên, vì HEAD~1 chính là lùi HEAD lại 1 commit.
HEAD
chính là commit hiện tại ta đang đứng.HEAD~1
là commit ngay trước HEAD trên cùng nhánhHEAD~n
là commit trước HEAD n commit trên cùng nhánh- Có thể dùng
@
thay choHEAD
:git log @
Cập nhật thay đổi lên remote repository
Tuy nhiên, các thay đổi này mới chỉ diễn ra trên local repository, để cập nhật thay đổi này lên remote repository bạn cần phải thực hiện lệnh git push -f