Sửa lỗi Git: fatal: It seems that there is already a rebase-merge directory

intermediate📦 Git2026-06-06| Tất cả các hệ điều hành (Linux, macOS, Windows) sử dụng Git 2.x trở lên.

Error Message

fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge"
#git#rebase#rebase-merge#troubleshooting#git-error

Khi Git bị kẹt trong trạng thái Rebase lơ lửng

Bạn đang làm việc trên một feature branch và đã sẵn sàng để đồng bộ với main. Bạn chạy lệnh git rebase main, nhưng thay vì có một lịch sử sạch sẽ, Git lại chặn bạn. Nó thông báo rằng thư mục rebase-merge đã tồn tại. Về cơ bản, bạn đang rơi vào một thế bế tắc về mặt kỹ thuật.

Điều này xảy ra khi một lần rebase trước đó chưa hoàn tất. Có lẽ bạn đã bỏ dở giữa chừng một cuộc xung đột merge phức tạp, terminal của bạn bị treo, hoặc máy tính hết pin ngay giữa câu lệnh. Git hiện đang ở trạng thái "zombie". Nó nghĩ rằng tiến trình rebase vẫn đang diễn ra ngay cả khi bạn không thực sự thực hiện nó.

fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase.  If that is the case, please try
	git rebase (--continue | --abort | --skip)
If that is not the case, please
	rm -fr ".git/rebase-merge"

Nguyên nhân gốc rễ: Bộ nhớ của thư mục .git

Khi bạn bắt đầu một tiến trình rebase, Git sẽ tạo một thư mục tạm thời ẩn bên trong thư mục .git của bạn. Thư mục này thường có tên là .git/rebase-merge hoặc .git/rebase-apply. Thư mục này đóng vai trò như một bản nháp, lưu trữ khoảng 10 đến 15 tệp metadata—bao gồm head-name, onto, và orig-head—để theo dõi điểm bắt đầu và đích đến của bạn.

Git sẽ tự động xóa thư mục này sau khi quá trình rebase kết thúc. Tuy nhiên, nếu tiến trình bị dừng đột ngột từ bên ngoài hoặc bạn xóa các nhánh một cách thủ công trong khi lệnh rebase vẫn đang "hoạt động", những tệp này sẽ vẫn còn đó. Khi bạn cố gắng bắt đầu một lần rebase mới, Git nhìn thấy thư mục đó và dừng lại để ngăn bạn ghi đè lên những công việc quan trọng có thể có.

Bước 1: Xác nhận trạng thái hiện tại

Trước khi chạy các lệnh có tính chất xóa dữ liệu, hãy kiểm tra xem Git đang hiểu chuyện gì đang xảy ra. Hãy chạy lệnh sau:

git status

Nếu Git vẫn nghĩ rằng bạn đang ở giữa quá trình rebase, kết quả trả về sẽ trông như thế này:

rebase in progress; onto 1a2b3c4
You are currently rebasing branch 'feature-branch' on '1a2b3c4'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --abort" to check out the original branch)

Bước 2: Cách thoát sạch nhất (git rebase --abort)

Cách an toàn nhất để khắc phục điều này là yêu cầu Git hủy bỏ tiến trình rebase bị gián đoạn. Việc này sẽ đưa repository của bạn trở về trạng thái ban đầu trước khi rắc rối bắt đầu. Hãy chạy:

git rebase --abort

Lệnh này sẽ reset HEAD của bạn và xóa sạch thư mục .git/rebase-merge. Điều này thường giải quyết lỗi ngay lập tức và là bước đầu tiên tốt nhất cho 99% người dùng.

Bước 3: Xóa thủ công (Khi --abort thất bại)

Đôi khi, trạng thái của repository trở nên hỗn loạn đến mức lệnh git rebase --abort thất bại với thông báo "No rebase in progress". Tuy nhiên, lỗi "rebase-merge directory already exists" vẫn tiếp diễn. Trong trường hợp cụ thể này, bạn phải xóa thư mục tạm thời một cách thủ công.

Trên Linux hoặc macOS:

rm -rf .git/rebase-merge

Lưu ý: Nếu thông báo lỗi của bạn chỉ đích danh rebase-apply, hãy xóa thư mục đó.

Trên Windows (PowerShell):

Remove-Item -Recurse -Force .git/rebase-merge

Trên Windows (Command Prompt):

rd /s /q .git\rebase-merge

Sau khi thư mục này bị xóa, Git sẽ không còn tin rằng một tiến trình rebase đang diễn ra nữa. Bây giờ bạn có thể thoải mái bắt đầu một lệnh git rebase mới.

Bước 4: Xác minh

Xác minh rằng môi trường của bạn đã sạch sẽ trước khi thử lại:

  • Chạy lệnh git status. Nó sẽ hiển thị trạng thái nhánh sạch sẽ mà không có cảnh báo rebase.
  • Bắt đầu lại tiến trình rebase: git rebase main.

Các trường hợp đặc biệt thường gặp

1. Nhiều Worktrees

Nếu bạn sử dụng git worktree, một thư mục khác có thể đang thực hiện rebase trên cùng một nhánh. Git khóa các hoạt động này để ngăn chặn việc hỏng dữ liệu. Hãy kiểm tra các thư mục dự án khác của bạn để xem có terminal nào đang chờ giải quyết xung đột ở đó không.

2. Các tệp bị khóa

Trên Windows, các IDE như VS Code hoặc IntelliJ đôi khi khóa các tệp bên trong thư mục .git. Nếu lệnh rm -rf thất bại với lỗi "Permission Denied", hãy đóng trình soạn thảo của bạn và thử lại lệnh. Chỉ cần một tệp bị khóa là đủ để giữ cho trạng thái zombie rebase tồn tại.

Bài học kinh nghiệm

  • Tránh nút 'X': Đừng bao giờ chỉ đóng terminal của bạn khi đang có xung đột. Hãy hoàn thành nó hoặc chạy lệnh --abort một cách rõ ràng.
  • Sử dụng một prompt mô tả: Các theme shell như Oh My Zsh hoặc Starship có thể hiển thị (REBASE 1/5) trên dòng lệnh của bạn. Điều này giúp bạn không bao giờ quên rằng mình đang ở giữa một tiến trình rebase.
  • Xóa thủ công là an toàn: Việc xóa thư mục rebase-merge chỉ loại bỏ tiến trình của lần thử rebase cụ thể đó. Các commit thực tế và mã nguồn của bạn vẫn không thay đổi.

Related Error Notes