Trong quá trình phát triển phần mềm, việc mắc phải sai lầm như thay đổi những nội dung không chính xác hoặc gây ra lỗi hệ thống trong các commit code là điều không thể tránh khỏi. Git cung cấp một công cụ mạnh mẽ để giúp lập trình viên hoàn tác những thay đổi đó nhưng vẫn đảm bảo sự nguyên vẹn của lịch sử commit. Đó chính là git revert.

Đọc bài viết này để hiểu rõ hơn về:

  • Git revert là gì?
  • Cơ chế hoạt động của Git revert
  • Cách sử dụng Git revert
  • Những lưu ý khi sử dụng Git revert

Git revert là gì?

Git revert là một lệnh phổ biến trong Git để hoàn tác (undo) các thay đổi trong commit trước đó bằng việc tạo ra một commit mới có nội dung đảo ngược so với commit được revert. Chính vì điều này, git revert thường được sử dụng để giữ cho lịch sử commit được rõ ràng và không bị thay đổi.

git revert - itviec blog

Cú pháp git revert cơ bản:

git revert <commit-hash>

Ví dụ, bạn thêm 1 commit với nội dung thay đổi là thêm tập tin sample.txt. Tuy nhiên sau đó bạn muốn hoàn tác và thực hiện git revert. Bạn có thể làm theo các bước sau:

Bước 1: Dùng git log để kiểm tra commi-hash của commit cần được revert:

git log --oneline

git revert

Bước 2: Thực hiện git revert

git revert eecf29f

Lúc này git sẽ mở một cửa sổ chỉnh sửa cho commit revert, bạn có thể thoát chế độ chỉnh sửa nếu không cần thay đổi nội dung gì.

git revert - itviec blog

Lúc này một commit mới với nội dung thay đổi là xóa tập tin sample.txt đã được thêm vào lịch sử.

git revert - itviec blog

Cơ chế hoạt động của git revert

Mục đích của git revert là tạo ra một commit mới với nội dung đảo ngược sao với commit được revert, trong khi vẫn giữ nguyên lịch sử commit. Dưới đây là cách mà git hoạt động khi thực thi một lệnh revert:

  • Xác định commit revert: Git xác định commit cụ thể cần hoàn tác dựa vào commit hash được cung cấp
  • Tạo commit đảo ngược: Git sẽ đối chiếu nội dung trong commit được revert so với commit trước nó để lấy ra những thay đổi có trong commit. Sau đó sẽ tạo ra commit mới với nội dung ngược lại.
  • Thêm commit mới vào cuối lịch sử commit với thông điệp mặc định: “Revert “Thông điệp của commit được rever””

Công dụng của git revert

  • Hoàn tác nội dung thay đổi bằng việc tạo ra một commit đảo ngược
  • Giữ cho lịch sử commit được toàn vẹn
  • Lịch sử commit được minh bạch và dễ dàng kiểm tra
  • Giúp tránh xung đột khi cộng tác với nhiều người

Cách sử dụng git revert

Các trường hợp sử dụng git revert

Git revert đặc biệt hữu ích khi sử dụng để hoàn tác các thay đổi đã được commit khi ở trong các trường hợp:

  1. Cần giữ cho lịch sử commit được toàn vẹn
  2. Nội dung commit đã được đẩy lên remote repository
  3. Khi làm việc nhóm và tránh gây xung đột mã nguồn

Những tùy chọn nâng cao

Git revert có nhiều tùy chọn để hoàn tác commit một cách linh hoạt và phù hợp trong các tình huống khác nhau:

Bỏ qua việc mở trình soạn thảo (–no-edit)

Theo mặc định, khi thực hiện git revert sẽ mở ra một trình soạn thảo để chúng ta có thể thay đổi một số nội dung cho commit revert. Tuy nhiên chúng ta có thể bỏ qua bước này bằng cách thêm option –no-edit:

git revert --no-edit <commit-hash>

Hoàn tác nhiều commit

Trong một số trường hợp, chúng ta cần hoàn tác nhiều commit. Thay vì thực hiện nhiều lệnh commit, bạn có thể sử dụng cú pháp sau:

git revert <oldest-commit>..<lastest-commit>

Ví dụ, mã nguồn đang có 5 commit với nội dung như sau:

e2v6g7h8 - commit D (HEAD)
c334e5f6 - commit C
b2c3d4e5 - commit B
a1b2c3d4 - commit A

Bây giờ chúng ta cần revert 3 commit cuối cùng là B, C, D:

git revert b2c3d4e5..HEAD

Trong đó:

  • b2c3d4e5: là commit cũ nhất trong phạm vi cần revert
  • HEAD: là commit mới nhất cần revert

Bỏ qua xác minh (–no-verify)

Sử dụng để bỏ qua các cơ chế xác minh trước khi commit như pre-commit, commit hooks:

git revert --no-verify <commit-hash>

Hoàn tác commit merge

Một trường hợp đặc biệt khi thực hiện revert đó chính là revert một commit merge (commit được tạo ra trong quá trình merge). Bởi vì commit merge liên quan đến nhiều nhánh và nhiều commit, nên việc revert nó cũng phức tạp hơn. Bạn cần phải xác định nhánh chính cần được giữ lại:

git revert -m <parent-number> <merge-commit-hash>

Trong đó:

  • -m <parent-number>: Chỉ định nhánh chính (parent branch). Thường là 1, tương ứng với nhánh bạn đang làm việc trước khi merge.
  • <merge-commit-hash>: Hash của commit merge mà bạn muốn hoàn tác.

Ví dụ, bạn có một nhánh feat đã được merge vào nhánh develop với lịch sử commit như sau:

* xe25f7g9 (merge commit) Merge branch 'feat' into develop
|\
| * b3a2s1d4 (feat) Thêm tập tin 1
| * c3d4e5f6 (feat) Thêm chức năng tìm kiếm
|/
* b2c2f4e6 (develop) Cập nhật giao diện chính

Lúc này, bạn đang đứng ở nhánh develop và muốn hoàn tác commit merge:

git revert -m 1 xe25f7g9

Trong đó:

  • -m 1: Chỉ định nhánh develop là nhánh chính cần giữ lại.
  • xe25f7g9: Là hash của commit merge cần hoàn tác.

Những lưu ý khi sử dụng git revert

Để việc sử dụng git revert được hiệu quả, bạn cần lưu ý một số điểm sau:

  • Không nên hoàn tác các commit cục bộ chưa được đẩy lên kho lưu trữ từ xa: Git revert nên được sử dụng khi commit đã được đẩy lên kho lưu trữ từ xa và người khác có thể đã kéo commit về máy cá nhân. Còn trường hợp commit chỉ ở kho cục bộ, bạn có thể sử dụng git reset để thay thế. Điều này tránh việc tạo ra nhiều commit dư thừa.
  • Lựa chọn đúng nhánh chính khi revert commit merge: Khi revert một commit merge, bạn cần lưu ý chọn đúng nhánh chính cần giữ lại. Điều này giúp tránh dẫn đến sai lệch trong lịch sử.
  • Xử lý xung đột khi revert: Khi thực hiện revert một commit lớn có thể xảy ra xung đột. Bạn có thể sử dụng các option để giải quyết xung đột như:
    • git revert –continue: tiếp tục quá trình revert sau khi giải quyết xung đột
    • git revert –abort: hoàn tác quá trình revert

So sánh git revert và git reset

Git revert và git reset đều được sử dụng để hoàn tác các thay đổi đã được commit, tuy nhiên giữa chúng có những cơ chế hoạt động và mục đích sử dụng khác nhau.

Dưới đây là bản so sánh chi tiết:

Tiêu chí Git revert Git reset
Cơ chế Tạo commit đảo ngược Xóa commit khỏi lịch sử
Tác động đến lịch sử commit Không thay đổi lịch sử commit Có thể thay đổi lịch sử
Cộng tác nhóm Đảm bảo an toàn và hạn chế xảy ra xung đột mã nguồn Có khả năng cao xảy ra xung đột mã nguồn
Khả năng phục hồi Có thể phục hồi hành động dễ dàng Khó phục hồi và có khả năng mất dữ liệu nếu sử dụng sai
Trường hợp sử dụng 1. Hoàn tác commit nhưng vẫn giữ lịch sử commit không bị thay đổi

2. Nội dung commit cần hoàn tác đã được đẩy lên remote repository, việc thay đổi lịch sử lúc này là không an toàn

1. Khi cần hoàn tác commit ở kho lưu trữ cục bộ mà không muốn commit cũ còn lưu trữ trong lịch sử

2. Trường hợp dữ liệu commit chưa được đẩy lên remote repository và bạn muốn loại bỏ những commit nhỏ lẻ

Các câu hỏi thường gặp về git revert

Những trường hợp nào nên sử dụng git revert?

Bạn có thể sử dụng git revert đã hoàn tác các thay đổi đã được commit, và đặc biệt là trong những trường hợp:

  • Không muốn làm thay đổi lịch sử commit
  • Commit đã được đẩy lên kho từ xa và người khác đã kéo commit về máy
  • Hoàn tác các commit merge

Tôi có thể revert cùng lúc nhiều commit không?

Bạn có thể sử dụng revert để hoàn tác cùng lúc nhiều commits. Có hai cách phổ biến để làm điều này:

Sử dụng phạm vi commit

Cú pháp:

git revert <oldest-commit>..<latest-commit>

Giải thích:

  • oldest-commit: Commit cũ nhất mà bạn muốn revert.
  • latest-commit: Commit mới nhất sẽ được revert.

Liệt kê danh sách commit

Liệt kê các commit hash của những commits mà bạn muốn revert, Git sẽ tạo commit ngược cho từng commit được chỉ định. Cú pháp:

git revert <commit-hash1> <commit-hash2> ... <commit-hashN>

Làm sao để hoàn tác hành động revert?

Git revert sẽ tạo ra một commit đảo ngược so với commit được revert. Vì vậy để hoàn tác một hành động revert, chính là hoàn tác commit đảo ngược đó. Lúc này chúng ta có thể sử dụng lại chính git revert hoặc git reset để thực hiện điều này.

  • Git revert: Bạn có thể thực hiện hành động revert thêm một lần nữa. Lúc này nó sẽ có dạng là “revert của revert”. Git sẽ tạo ra một commit để đảo ngược commit revert trước đó.
  • Git reset: Trường hợp hành động revert trước đó vẫn chưa được đẩy lên remote repository, bạn có thể sử dụng git reset để loại bỏ commit revert đó và trả lại trạng thái ban đầu cho repository.

Đọc thêm: Hướng dẫn cách xóa bỏ commit bằng Git Reset

Tổng kết

Hoàn tác một commit là điều khó tránh khỏi trong quá trình phát triển phần mềm. Vì vậy, việc thành thạo lệnh git revert sẽ giúp bạn làm việc với mã nguồn hiệu quả và an toàn hơn.

ITviec hy vọng bài viết này đã giúp bạn hiểu rõ cách hoạt động của git revert, đồng thời cung cấp những kiến thức hữu ích để áp dụng lệnh này trong quá trình phát triển phần mềm của bạn.