Thông báo lỗi
Bạn đang ở giữa quá trình merge, bạn đã tinh chỉnh mã nguồn của mình và cố gắng commit chỉ một file cụ thể. Thay vì nhận được thông báo thành công, Git chặn bạn lại với rào cản này:
$ git commit -m "Sửa logic đăng nhập" src/auth.py
fatal: cannot do a partial commit during a merge.
Tại sao Git chặn bạn
Git tuân theo các quy tắc nghiêm ngặt trong quá trình merge. Khi bạn bắt đầu merge (thông qua git merge hoặc git pull), Git chuyển sang trạng thái tạm thời, nơi nó mong đợi một kết quả "nguyên tử" (atomic) duy nhất. Nó muốn bạn giải quyết tất cả các xung đột và sau đó ghi lại toàn bộ kết quả dưới dạng một commit merge duy nhất.
Không giống như một commit thông thường, một commit merge có hai commit cha. Nó đại diện cho sự kết hợp của hai lịch sử khác nhau. Vì lý do này, Git từ chối cho phép bạn commit chỉ một phần của sự kết hợp đó. Nếu bạn cố gắng commit auth.py trong khi index.html vẫn còn các dấu hiệu xung đột, bạn sẽ tạo ra trạng thái "merge dở dang", điều này có thể dẫn đến việc hỏng lịch sử Git sau này.
Ba cách để khắc phục
Bạn có ba con đường để thực hiện tùy thuộc vào việc bạn muốn hoàn tất việc merge, bỏ qua hạn chế hoặc chỉ muốn bắt đầu lại từ đầu.
Giải pháp 1: Cách đáng tin cậy (Commit tất cả mọi thứ)
Đây là quy trình tiêu chuẩn. Khi bạn đã giải quyết xong các xung đột, bạn phải thông báo cho Git rằng toàn bộ dự án đã sẵn sàng. Đừng nêu tên các file cụ thể trong lệnh commit của bạn.
- Stage mọi file đã được giải quyết (ví dụ:
main.pyhoặcstyles.csscủa bạn):
git add .
- Kiểm tra trạng thái:
```
git status
Bạn nên thấy: "All conflicts fixed but you are still merging." (Tất cả xung đột đã được sửa nhưng bạn vẫn đang trong quá trình merge).
- Hoàn tất việc merge mà không chỉ định tên file:
git commit -m "Merge feature-login vào main"
### Giải pháp 2: Lối tắt "Include" (-i)
Nếu bạn là một người dùng nâng cao và chỉ muốn commit những file bạn đã stage, bạn có thể sử dụng flag `-i` (include). Điều này thông báo cho Git stage file bạn đã chỉ định và sau đó commit mọi thứ hiện đang sẵn sàng.
git commit -i src/auth.py -m "Sửa lỗi một phần trong khi merge"
**Cảnh báo:** Hãy thận trọng khi sử dụng cách này. Nó không thực sự kết thúc quá trình merge nếu các file khác vẫn đang chờ xử lý hoặc bị lỗi. Đây chỉ là một cách sửa lỗi nhanh, không phải là giải pháp lâu dài cho các lần merge phức tạp.
### Giải pháp 3: Lối thoát (Abort)
Đôi khi mọi thứ trở nên lộn xộn. Nếu việc merge quá phức tạp hoặc bạn nhận ra lẽ ra mình nên commit các thay đổi cục bộ từ 5 phút trước, chỉ cần hủy bỏ toàn bộ quá trình.
- Hủy bỏ quá trình merge:
```
git merge --abort
- Các file của bạn sẽ quay trở lại trạng thái trước khi quá trình merge bắt đầu. Bây giờ bạn có thể commit file cụ thể của mình một cách bình thường:
git commit src/auth.py -m "Lưu công việc trước khi merge"
- Thử merge lại lần nữa:
```
git merge feature-branch
Cách kiểm tra kết quả
Sau khi bạn đã áp dụng một trong các cách sửa lỗi này, hãy thực hiện kiểm tra nhanh:
git status
Nếu thành công, bạn sẽ thấy nothing to commit, working tree clean. Nếu bạn vẫn đang trong quá trình merge, bạn sẽ thấy cảnh báo đáng sợ "You have unmerged paths".
Để xem kết quả trong lịch sử, hãy kiểm tra 3 mục gần nhất:
git log --oneline -n 3
Mẹo nhỏ để tránh rắc rối
- Dọn dẹp nhà cửa trước: Đừng bao giờ bắt đầu merge khi có các thay đổi chưa được commit. Chạy
git statustrước khigit pullđể đảm bảo thư mục làm việc của bạn sạch sẽ. - Đừng dùng tên file: Khi kết thúc một lần merge, hãy tập thói quen gõ
git commit(không có đối số). Git sẽ tự động mở trình soạn thảo của bạn với một thông báo merge được điền sẵn, giúp bạn tránh các lỗi đánh máy. - Stage ngay khi thực hiện: Khi bạn sửa các xung đột trong các file khác nhau, hãy sử dụng
git add [tên_file]ngay lập tức để không bị mất dấu tiến trình của mình.

