Có những tình huống mà việc xóa commit khỏi lịch sử Git có thể hữu ích. Để xóa/hủy các commit gần đây, bạn có thể thử lệnh reset; tuy nhiên, để xóa các commit tồn tại xa hơn trong lịch sử, hãy sử dụng interactive rebase.
Delete không phải là một lệnh Git độc lập, mà là một trong những lệnh có sẵn trong mode interactive rebase khi chạy lệnh git rebase -i. Hãy đảm bảo bạn đã hiểu về interactive rebase trước khi học bài này.
Bắt đầu bằng việc nói với Git bạn muốn thao tác trên những commit nào bằng cách chỉ định một chuỗi các commit bắt đầu từ con trỏ HEAD trở về trước:
git rebase -i HEAD~3
Lệnh này sẽ cho phép bạn thao tác trên 3 commit gần nhất.
Sau khi thực thi lệnh rebase, Git sẽ mở trình soạn thảo văn bản mặc định trong terminal của bạn (thường là Vim) và hiển thị một bộ hướng dẫn mặc định. Các commit từ chuỗi đã chọn được liệt kê ở đầu file này:
pick 2f8e823 Refactored screenreader attributes
pick 7f9d4bf Updated README
pick 3f8e810 Accessibility fix
# Rebase 4095f73..ec48d74 onto 4095f73 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
...
Để xóa một commit, hãy tìm commit bạn muốn xóa và đổi tiền tố của nó từ pick thành drop (nếu bạn đang sử dụng Vim, nhấn i để vào chế độ insert và thực hiện thay đổi).
Ví dụ, để xóa commit "Updated README":
pick 2f8e823 Refactored screenreader attributes
drop 7f9d4bf Updated README
pick 3f8e810 Accessibility fix
Sau khi chỉnh sửa xong file hướng dẫn (đã đổi pick thành drop ở những commit muốn xóa), bạn cần lưu và đóng file soạn thảo (với Vim: nhấn ESC, sau đó gõ :wq rồi Enter).
Khi interactive rebase thực thi bộ hướng dẫn, nó sẽ không viết lại các commit được đánh dấu bằng "drop" trở lại cây lịch sử, từ đó loại bỏ chúng khỏi lịch sử commit một cách hiệu quả.
Nếu các commit gần đây hơn dựa trên các thay đổi có trong commit bị xóa, Git sẽ hủy bỏ thao tác. Nếu điều này xảy ra, hãy thử sử dụng reset để hủy commit thay vì xóa nó.
Nếu xảy ra xung đột, các thông báo sau sẽ được trả về bởi thao tác:
CONFLICT (content): Merge conflict
error: could not apply d81b1f0
Khi gặp lỗi này, bạn có hai lựa chọn:
Hủy bỏ thao tác: Sử dụng git rebase --abort để quay về trạng thái ban đầu.
Sử dụng reset thay thế: Nếu bạn muốn loại bỏ commit nhưng gặp xung đột, hãy cân nhắc sử dụng git reset thay vì xóa commit trong interactive rebase.
Nếu bạn chỉ muốn xóa commit gần nhất, hãy sử dụng git reset HEAD~1 thay vì interactive rebase.
Khi sử dụng Vim, nhớ rằng bạn cần vào chế độ insert (i) để chỉnh sửa, và thoát chế độ insert (ESC) trước khi lưu (:wq).
Bạn có thể xóa nhiều commit trong cùng một lần interactive rebase bằng cách đổi pick thành drop cho tất cả các commit bạn muốn xóa.
Hãy cẩn thận khi xóa commit, vì điều này sẽ xóa vĩnh viễn các thay đổi trong commit đó. Đảm bảo bạn không cần những thay đổi đó trước khi xóa.
Delete cho phép bạn loại bỏ các commit khỏi lịch sử dự án. Quy trình bao gồm ba bước: chọn các commit cần thao tác, tạo bộ hướng dẫn bằng cách đổi pick thành drop, và thực thi bộ hướng dẫn để xóa commit khỏi lịch sử.
Hãy nhớ rằng delete chỉ nên được sử dụng trên các commit local chưa được chia sẻ để tránh gây xung đột cho các thành viên khác trong team. Nếu gặp xung đột khi xóa commit, hãy cân nhắc sử dụng reset thay thế.
Tiếp theo: Sắp xếp lại commit