Git reset “undo commit”

“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 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ánh
  • HEAD~n là commit trước HEAD n commit trên cùng nhánh
  • Có thể dùng @ thay cho HEADgit 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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *