TL;DR: Cách khắc phục trong 30 giây
Cách đáng tin cậy nhất để xử lý lỗi này là chuyển công việc hiện tại của bạn vào một khu vực lưu trữ tạm thời, hoàn tất rebase, sau đó khôi phục lại các thay đổi. Hãy chạy ba lệnh sau:
git stash
git rebase origin/main
git stash pop
Nếu bạn hoàn toàn không cần các thay đổi cục bộ, bạn có thể xóa sạch chúng bằng lệnh git reset --hard. Hãy cẩn thận—lệnh này sẽ xóa vĩnh viễn mọi công việc mà bạn chưa commit.
Tại sao Git chặn quá trình rebase của bạn
Git đóng vai trò như một lưới an toàn. Khi bạn rebase, Git sẽ "tháo" các commit của bạn và áp dụng lại từng cái một lên một base mới. Quá trình này thường liên quan đến việc sửa đổi chính các tệp mà bạn đang làm việc.
Nếu bạn có các thay đổi chưa stage trong app.js và quá trình rebase cũng cần cập nhật app.js, Git sẽ không mạo hiểm ghi đè lên công việc chưa lưu của bạn. Vì những thay đổi này chưa nằm trong cơ sở dữ liệu của Git, việc mất chúng đồng nghĩa với việc chúng sẽ biến mất mãi mãi. Git buộc bạn phải quyết định làm gì với những tệp đó trước khi nó can thiệp vào lịch sử commit.
Cách 1: Sử dụng Git Stash (Tiêu chuẩn vàng)
Hầu hết các lập trình viên đều ưu tiên stashing vì nó không gây mất dữ liệu. Hãy coi git stash như một clipboard cho hệ thống tệp của bạn. Nó lấy các chỉnh sửa chưa commit và đưa chúng vào một ngăn xếp (stack), trả lại cho bạn một thư mục làm việc sạch sẽ và đồng bộ 100%.
- Cất các thay đổi sang một bên:
git stash - Thực hiện rebase:
git rebase origin/develop - Áp dụng lại công việc của bạn:
git stash pop
Nếu git stash pop gây ra xung đột (conflict), điều đó có nghĩa là phần việc bạn đã stash và các commit mới sau khi rebase đã thay đổi cùng một dòng mã. Hãy mở trình soạn thảo của bạn, giải quyết các xung đột và tiếp tục như bình thường.
Cách 2: Autostash - 'Thiết lập một lần và quên đi'
Nếu bạn thấy lỗi này phiền phức, bạn có thể tự động hóa toàn bộ quá trình stashing. Kể từ Git 1.8.4, cờ --autostash cho phép Git tự động xử lý việc stash và pop cho bạn.
git rebase origin/main --autostash
Để biến đây thành hành vi mặc định cho mọi lần rebase, hãy chạy lệnh cấu hình global sau:
git config --global rebase.autoStash true
Đây là một cải tiến lớn giúp tăng năng suất. Nó giúp bạn tiết kiệm thời gian thay vì phải gõ ba lệnh khi chỉ cần một lệnh là đủ.
Cách 3: Commit WIP (Work In Progress)
Đôi khi bạn có thể có hàng tá tệp đã chỉnh sửa và muốn có một bản ghi lâu dài hơn là stash. Trong trường hợp này, hãy tạo một commit "WIP" tạm thời. Điều này giữ cho công việc của bạn an toàn bên trong cây Git.
git add .
git commit -m "wip: lưu lại tiến độ"
git rebase origin/main
Sau khi rebase xong, bạn có thể "hoàn tác" commit tạm thời đó nhưng vẫn giữ lại các thay đổi trong tệp bằng cách chạy git reset HEAD~1. Lệnh này đưa các thay đổi trở lại thư mục làm việc của bạn dưới dạng các tệp chưa stage.
Cách 4: Dọn dẹp không gian làm việc
Nếu các thay đổi đang ngăn cản quá trình rebase chỉ là những chỉnh sửa vô ý hoặc các dòng console.log để debug, hãy xóa chúng đi. Đối với Git hiện đại (phiên bản 2.23 trở lên), hãy sử dụng lệnh restore:
git restore .
Đối với các phiên bản cũ hơn, cú pháp hơi khác một chút:
git checkout -- .
Xác minh: Xác nhận Rebase thành công
Làm thế nào để biết mọi thứ đã trở lại bình thường? Hãy kiểm tra ba điều sau:
- Kiểm tra cây Git: Chạy
git log --oneline --graph. Các commit của bạn bây giờ sẽ nối tiếp commit mới nhất từ nhánh đích theo một đường thẳng. - Kiểm tra trạng thái:
git statuskhông được hiển thị thông báo "rebase in progress". - Kiểm tra stash: Nếu bạn dùng Cách 1, hãy chạy
git stash list. Nếu lệnh pop thành công và không có xung đột, danh sách stash sẽ trống.

