Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Git Reset To The Rescue (Git Reset Cứu Vãn)

Khi bạn làm việc trên dự án tự mình hoặc như một phần của nhóm, có thể có trường hợp bạn muốn hoàn tác (undo) một commit. Lệnh git reset là một trong những công cụ được biết đến như người cứu tinh thực sự.

Cơ chế Theo dõi của Git

Trước khi đến git reset, chúng ta cần hiểu về cấu trúc bên dưới của git. Git quản lý và theo dõi file, thông qua cấu trúc dạng cây với node và con trỏ.

Về cơ bản có ba "cây" này trên kho git cục bộ của bạn:

  1. Working Directory (Thư mục làm việc): Hay working tree, tham chiếu đến thư mục cục bộ và git status cho trạng thái thư mục làm việc.
  2. HEAD: Chỉ là snapshot commit cuối của nhánh hiện tại. Nếu bạn chuyển nhánh với git checkout thì HEAD sẽ thay đổi thành commit cuối trên nhánh đó.
  3. Index (Chỉ mục): Hay staging area (khu vực chuẩn bị). Vì vậy khi bạn git add file để commit nó thêm vào index này.

Git Workflow (Quy trình Git)

Ví dụ sau cho thấy làm thay đổi file rồi thêm vào index (staging) dùng git add sau đó kiểm tra git status xem thay đổi sẽ commit.

Git Reset To The Rescue (Git Reset Cứu Vãn)

Bây giờ khi chúng ta làm git commit nó lưu như snapshot vĩnh viễn hơn và cập nhật master và HEAD đến con trỏ đó. Vì vậy nếu làm git status sau git commit, chúng ta sẽ thấy cả ba cây ở cùng trạng thái (sẽ không có gì để commit).

Git Reset To The Rescue (Git Reset Cứu Vãn)

Vậy mục đích của git reset là gì?

Bạn có thể thắc mắc tại sao cần tất cả lời dẫn này chỉ để đến git reset. Vâng git reset thao tác các cây này theo cách khác nhau. Vì vậy git reset chấp nhận nhiều tùy chọn tùy thuộc vào điều bạn muốn làm.

Các Chế độ (Modes) Git Reset

Giả sử chúng ta commit vài thay đổi và file, rồi nhận ra commit sai nhánh hoặc commit bị lỗi nên muốn quay lại. Đây là nơi biết về các modes git reset hữu ích.

Tất cả git reset với mode sẽ cập nhật con trỏ HEAD. Nó có cú pháp sau:

git reset <mode> <commit-tùy_chọn>

Các mode chính là:

  • --soft: Reset con trỏ HEAD và để index và working directory không thay đổi. Vì vậy HEAD sẽ reset và các cây khác vẫn hiển thị thay đổi mới nhất.
  • --mixed: Mặc định. Reset HEAD và index. Về cơ bản un-stage (bỏ chuẩn bị) tất cả thay đổi và để bạn ở trạng thái trước khi làm git add. Lưu ý: Nếu bạn làm git reset chỉ mình nó không có tùy chọn, nó sẽ được hiểu như git reset --mixed.
  • --hard: Cẩn thận với cái này. Bên cạnh reset HEAD, index, nó cũng reset working directory. Vì vậy bạn có thể mất mã đã viết! Bất kỳ thay đổi nào sau con trỏ HEAD hiện tại (commit cuối) bị loại bỏ.

Các mode khác như --merge và --keep có thể đọc trong tài liệu chính thức.

Các Mẹo git reset Hữu ích

Quay lại commit (Rewinding a commit)

Nhớ rằng nếu bỏ qua mode (git reset không có tùy chọn) nó sẽ được hiểu như --mixed.

Bây giờ nếu chỉ gõ git reset HEAD không gì xảy ra, nhưng nếu làm git reset HEAD~1 thì HEAD sẽ giờ trỏ đến commit trước.

Ví dụ tiếp theo tiếp tục từ cái trước. Giả sử thêm văn bản mới vào file mẫu. Sau đó git add và commit. Sau đó làm git reset HEAD~1, tất cả thay đổi bị un-stage và về commit trước.

Git Reset To The Rescue (Git Reset Cứu Vãn)

Đây là cách hữu ích và nhanh khi muốn hoàn tác commit!

Un-stage file cụ thể

Giả sử bạn thêm file vào index với git add. Chúng ta có thể xóa file đó chỉ bằng:

git reset HEAD <tên-file>

Tình huống: Tôi làm hỏng hết mã! Có thể quay lại lúc nó chạy được không?

Nếu bạn muốn vứt bỏ tất cả thay đổi cục bộ và quay lại commit trước, phương án cuối cùng là git reset --hard.

Thường nếu bạn làm hỏng mã đây có thể là lựa chọn duy nhất. Nếu biết commit hash bạn có thể do git reset --hard <commit>. Nhưng lưu ý cái này cũng ảnh hưởng bất kỳ commit nào sau commit cụ thể (nếu có)!

Tình huống: Commit này nên ở nhánh mới!

Điều này thường xảy ra, đặc biệt khi bắt đầu làm việc production. Nếu xảy ra với bạn, đừng hoang mang!

Cần làm cơ bản là tạo nhánh mới có trạng thái nhánh cần quay lại. Sau đó reset nhánh bị ảnh hưởng, và checkout sang nhánh mới và commit ở đó:

git branch new-branch

git reset HEAD~1 --hard

git checkout new-branch

Cứu tinh đúng không!

Lời cuối

Cẩn thận khi làm git reset --hard và cũng khi quay lại commit cụ thể, đặc biệt trong mã production và khi làm việc với lập trình viên khác. Thường git revert là cách an toàn để làm thay đổi này. Nhưng đó là chuyện cho lần sau. Cho đến lúc đó! 👍😎