Git là một hệ thống quản lý phiên bản mạnh mẽ, cho phép bạn theo dõi sự thay đổi trong mã nguồn một cách dễ dàng. Trong Git, git reset là một lệnh quan trọng giúp bạn quay lại một trạng thái cụ thể của lịch sử commit, hoặc thay đổi trạng thái của chỉ mục (index) và thư mục làm việc (working directory).

git reset thường được sử dụng để loại bỏ các commit không mong muốn, hoặc đưa các tệp từ trạng thái đã staged trở lại unstaged để chỉnh sửa tiếp.

Các chế độ hoạt động của Git Reset

Git Reset có ba chế độ hoạt động chính: --soft, --mixed, và --hard. Mỗi chế độ này có mức độ ảnh hưởng khác nhau lên commit, chỉ mục (index), và thư mục làm việc (working directory).

Chế độ –soft

Khi sử dụng git reset --soft, Git sẽ di chuyển HEAD về commit bạn chỉ định mà không thay đổi chỉ mục hoặc thư mục làm việc. Điều này có nghĩa là các thay đổi từ commit đó vẫn còn trong staged (chỉ mục), và bạn có thể commit lại.

Cú pháp

git reset --soft <commit>

Ví dụ, nếu bạn muốn quay lại commit trước đó mà vẫn giữ các thay đổi trong staged:

git reset --soft HEAD~1

Chế độ –mixed

Chế độ --mixed là mặc định khi bạn chạy git reset mà không chỉ rõ chế độ. Lệnh này sẽ di chuyển HEAD về commit chỉ định và các thay đổi từ commit sẽ được di chuyển từ trạng thái staged trở về unstaged. Điều này cho phép bạn chỉnh sửa lại các thay đổi trước khi commit lại.

Cú pháp

git reset --mixed <commit>

Ví dụ:

git reset HEAD~1

Lệnh này sẽ đưa các thay đổi của commit trước đó từ trạng thái staged trở lại unstaged.

Chế độ –hard

git reset --hard là chế độ mạnh mẽ nhất, vì nó không chỉ di chuyển HEAD, mà còn thay đổi cả chỉ mục và thư mục làm việc. Tất cả các thay đổi sẽ bị xóa và không thể khôi phục lại nếu bạn không sử dụng một công cụ backup khác như git reflog.

Cú pháp

git reset --hard <commit>

Ví dụ:

git reset --hard HEAD~1

Lệnh này sẽ xóa hoàn toàn commit trước đó cùng với tất cả các thay đổi liên quan trong thư mục làm việc.

Sử dụng git reset trong các tình huống thực tế

  1. Quay lại commit cũ và giữ lại thay đổi: Nếu bạn phát hiện lỗi trong commit gần đây và muốn quay lại để chỉnh sửa, bạn có thể sử dụng git reset --soft để quay lại commit trước mà vẫn giữ các thay đổi ở trạng thái staged.
  2. Xóa bỏ commit gần nhất: Nếu bạn commit nhầm mà không cần giữ các thay đổi, sử dụng git reset --hard để xóa bỏ hoàn toàn commit đó và các thay đổi.
  3. Di chuyển thay đổi từ staged về unstaged: Khi bạn lỡ thêm các tệp vào staged (bằng git add) nhưng muốn chỉnh sửa thêm trước khi commit, bạn có thể sử dụng git reset --mixed để di chuyển chúng về unstaged.

Reset một thư mục khỏi trạng thái staged trong Git

Khi bạn thêm một thư mục vào staged bằng cách sử dụng lệnh git add, tất cả các tệp bên trong thư mục đó sẽ được đưa vào trạng thái staged, chuẩn bị cho việc commit. Tuy nhiên, nếu bạn muốn reset (di chuyển) một thư mục khỏi trạng thái staged, để các tệp trong thư mục trở lại trạng thái unstaged, bạn có thể sử dụng lệnh git reset.

Trong trường hợp này, Git sẽ không xóa các tệp trong thư mục làm việc, mà chỉ di chuyển chúng khỏi chỉ mục (index), tức là trạng thái staged. Điều này có nghĩa là các tệp sẽ không còn được chuẩn bị để commit, nhưng thay đổi của bạn vẫn sẽ còn trong thư mục làm việc để bạn tiếp tục chỉnh sửa.

Hướng dẫn reset một thư mục khỏi staged

Cú pháp

git reset <folder_name>

Ví dụ

Giả sử bạn có một thư mục tên là src/, và bạn đã thêm nó vào staged bằng lệnh:

git add src/

Bây giờ, bạn muốn reset thư mục src/ và đưa các tệp trong thư mục này trở về trạng thái unstaged. Bạn có thể thực hiện lệnh sau:

git reset src/

Sau khi chạy lệnh này, tất cả các tệp trong thư mục src/ sẽ bị đưa khỏi trạng thái staged, nhưng vẫn giữ lại trong thư mục làm việc của bạn để bạn có thể chỉnh sửa hoặc thêm vào staged lại sau này.

Lưu ý

  • Lệnh git reset <folder_name> chỉ di chuyển các tệp trong thư mục khỏi staged mà không làm mất bất kỳ thay đổi nào trong các tệp đó. Điều này có nghĩa là các thay đổi vẫn tồn tại trong thư mục làm việc.
  • Nếu bạn muốn chỉ reset một số tệp cụ thể bên trong thư mục thay vì toàn bộ thư mục, bạn có thể chỉ rõ tên tệp khi sử dụng lệnh git reset.

Reset một thư mục khỏi trạng thái staged trong Git giúp bạn dễ dàng quản lý các thay đổi mà không lo mất dữ liệu. Khi bạn nhận ra cần chỉnh sửa thêm trước khi commit, lệnh git reset giúp bạn linh hoạt đưa các thay đổi trở về trạng thái unstaged.

Trong Git, việc hiểu cách sử dụng git reset là một kỹ năng quan trọng, giúp bạn kiểm soát lịch sử commit và quản lý mã nguồn hiệu quả. Mỗi chế độ reset đều có mục đích riêng, từ việc giữ lại thay đổi đến hoàn toàn xóa bỏ commit. Sử dụng git reset đúng cách sẽ giúp bạn tránh những sai lầm và tối ưu hóa quá trình phát triển.