Git reset

Git reset

Một trong những tính năng hữu ích nhất của bất kỳ hệ thống kiểm soát phiên bản nào là khả năng "hoàn tác" những sai lầm của bạn. Trong Git, "hoàn tác" có thể có nhiều nghĩa hơi khác nhau.

Khi bạn thực hiện một cam kết mới, Git sẽ lưu trữ ảnh chụp nhanh kho lưu trữ của bạn tại thời điểm cụ thể đó; sau đó, bạn có thể sử dụng Git để quay lại phiên bản trước đó của dự án của mình.

Trong bài đăng này, tôi sẽ xem xét một số trường hợp phổ biến mà bạn có thể muốn "hoàn tác" một thay đổi mà bạn đã thực hiện và cách tốt nhất để thực hiện điều đó bằng Git

Git reset là gì?

Lệnh Git reset là một công cụ phức tạp và linh hoạt để hoàn tác các thay đổi. Nó có ba hình thức gọi chính:

  • --soft
  • --mixed
  • --hard
    Ba đối số, mỗi đối số tương ứng với ba cơ chế quản lý trạng thái nội bộ của Git, The Commit Tree (HEAD), The Staging Index, and The Working Directory.

Git Reset & Three Trees of Git

Để hiểu đúng cách sử dụng git reset, trước tiên chúng ta phải hiểu các hệ thống quản lý trạng thái nội bộ của Git. Đôi khi những cơ chế này được gọi là "three trees" của Git. Chúng là các cấu trúc dữ liệu dựa trên nút và con trỏ mà Git sử dụng để theo dõi tiến trình chỉnh sửa. Cách tốt nhất để chứng minh các cơ chế này là tạo tập thay đổi trong kho lưu trữ.

Để bắt đầu, chúng ta sẽ tạo một repository:

Đoạn mã ví dụ trên tạo một repository mới với một file có tên là demo, Tại thời điểm này, repository  có một commit duy nhất (6544b5d)

The working directory

Cây đầu tiên chúng ta sẽ kiểm tra là "The Working Directory". Cây này đồng bộ với hệ thống tệp cục bộ và là đại diện cho những thay đổi tức thì được thực hiện đối với nội dung trong tệp và thư mục.


Trong repository demo của chúng tôi, chúng tôi sửa đổi và thêm một số nội dung vào file demo. Kiểm tra trạng thái git cho thấy rằng Git nhận thức được những thay đổi đối với tệp. Những thay đổi này hiện là một phần của cây đầu tiên, "Thư mục làm việc". Trạng thái Git có thể được sử dụng để hiển thị các thay đổi đối với Thư mục làm việc. Chúng sẽ được hiển thị bằng màu đỏ với tiền tố 'đã sửa đổi'.

Staging index

Trên Git, khi đã thực hiện commit thì trạng thái sẽ không được ghi trực tiếp trong repository từ working tree, mà sẽ ghi trạng thái đã được thiết lập của index được xây dựng ở giữa đó. Vì thế, để ghi lại trạng thái của file bằng commit thì trước hết cần đăng ký file trong index.

Với việc chèn index vào giữa như thế này, có thể thực hiện commit không bao gồm những file không cần thiết trong working tree, hay có thể đăng ký chỉ một phần thay đổi của file trong index rồi commit.

Cách hoạt động

vd: Thực hiện git reset b:
git reset sẽ di chuyển con trỏ tham chiếu HEAD và con trỏ tham chiếu đến nhánh được chỉ định. việc cập nhật các con trỏ tham chiếu cam kết, git reset sẽ sửa đổi trạng thái của ba cây. Việc sửa đổi con trỏ tham chiếu luôn xảy ra và là bản cập nhật cho cây thứ ba, cây Cam kết.

Main Options

Lệnh gọi mặc định của git reset có các đối số ngầm định là --mixed và HEAD. Điều này có nghĩa là thực thi git reset tương đương với thực hiện git reset --mixed HEAD.

--soft

Trường hợp này sẽ hủy commit cuối, con trỏ HEAD sẽ chuyển về commit cha. Đồng thời những thay đổi của commit cuối được chuyển vào vùng staging nhằm để có cơ hội commit lại hoặc sửa đổi

Ban đầu có 2 commit là : first commit và c2
Sau đó ta tạo file2 và commit, ta có thêm 1 commit mới là c3 (tổng 3 commit)
Tiếp theo ta thực hiện: git reset --soft HEAD~1

  • Commit cuối cùng đã bị hủy
  • Nội dung thay đổi của commit cuối vẫn được lưu lại trong staging
--hard

Đây là tùy chọn trực tiếp, NGUY HIỂM và được sử dụng thường xuyên nhất. Khi dùng tham số --hard thì kết quả giống với dùng tham số --soft, chỉ có một khác biết là nội dung thay đổi của commit cuối không đưa đưa vào staging mà bị hủy luôn. Trường hợp này dùng khi bạn quyết định hủy hoàn toàn commit cuối

Một vài trường hợp dùng git reset khác

  • Hủy git add:
    Nếu bạn đã dùng lệnh git add để cập nhật thay đổi vào vùng staging, bạn có thể hủy thao tác này bằng cách thực hiện lệnh:

git reset

  • Hủy đưa một file vào staging
    Nếu muốn hủy một file nào đó trong vùng staging chứ không phải toàn bộ thì dùng lệnh:

git reset -- filename

Tài liệu tham khảo:

Git Reset | Atlassian Git Tutorial
git revert and git reset undo a committed snapshot. git checkout checks out files, commits and branches. git clean removes untracked files from directory.