Tại sao Git ngăn bạn chuyển nhánhBạn đã sẵn sàng chuyển nhánh để kiểm tra PR hoặc tải về các cập nhật mới nhất. Bạn chạy lệnh git checkout main, nhưng thay vì thông báo thành công, Git lại chặn đứng bạn bằng một thông báo lỗi kỹ thuật. Nó trông như thế này:
error: The following untracked working tree files would be overwritten by checkout:
config/settings.local.php
dist/bundle.js
Please move or remove them before you switch branches.
Aborting
Lỗi này là một tính năng an toàn. Git đang bảo vệ dữ liệu của bạn. Nó xảy ra do bạn có các file trong thư mục mà Git chưa theo dõi (untracked). Tuy nhiên, nhánh mà bạn định chuyển sang lại theo dõi các đường dẫn file đó. Nếu Git cho phép chuyển nhánh, nó sẽ ghi đè các file cục bộ của bạn bằng phiên bản từ kho lưu trữ (repository). Công việc của bạn sẽ bị xóa ngay lập tức.
Xác định nguyên nhân trước tiênTrước khi chạy bất kỳ lệnh nào có thể xóa dữ liệu, hãy kiểm tra xem những file này thực chất là gì. Chúng là các file build nặng 50MB như dist/bundle.js, hay là các file cấu hình 1KB mà bạn đã mất cả giờ để tinh chỉnh? Chạy git status để xem danh sách đầy đủ.
git status
Nếu các file được liệt kê trong thông báo lỗi xuất hiện dưới mục "Untracked files", hãy chọn một trong bốn cách sau đây tùy thuộc vào mức độ quan trọng của dữ liệu đó.
Giải pháp 1: Sao lưu thủ công (An toàn nhất)Di chuyển các file nếu chúng chứa các khóa API nhạy cảm hoặc mã nguồn bạn chưa commit. Đây là cách tiếp cận tốt nhất khi bạn không chắc chắn 100% liệu các file đó có thể bỏ đi hay không. Chỉ mất vài giây để đảm bảo an toàn.
# Tạo một thư mục sao lưu tạm thời bên ngoài repo
mkdir ../git_backup
# Di chuyển các file bị xung đột
mv config/settings.local.php ../git_backup/
# Bây giờ hãy chuyển nhánh
git checkout destination-branch
Sau khi chuyển nhánh, bạn có thể so sánh thủ công phiên bản đã sao lưu với phiên bản mà Git vừa tải về.
Giải pháp 2: Sử dụng Git Clean (Tốt nhất cho các file rác khi build)Đôi khi xung đột đến từ các file build, file log hoặc rác trong node_modules. Nếu bạn không quan tâm đến những file này, hãy dùng git clean để xóa sạch chúng. Lưu ý: Hành động này là vĩnh viễn và không thể hoàn tác.
Luôn thực hiện "dry run" trước để xem những gì sẽ bị xóa:
git clean -n
Nếu danh sách trông có vẻ an toàn, hãy chạy lệnh với cờ force và directory:
# -f để bắt buộc, -d để xóa các thư mục
git clean -fd
Sau khi cây làm việc (working tree) đã sạch, lệnh git checkout của bạn sẽ hoạt động ngay lập tức.
Giải pháp 3: Chuyển nhánh bắt buộcSử dụng cờ force nếu bạn muốn chuyển nhánh ngay lập tức và không quan tâm đến việc mất các file untracked đó. Điều này yêu cầu Git ưu tiên phiên bản của kho lưu trữ hơn là các file cục bộ của bạn.
git checkout -f destination-branch
Cảnh báo: Git sẽ ghi đè lên các file untracked cục bộ của bạn. Vì Git chưa bao giờ theo dõi các file này, nên sẽ không có lịch sử để khôi phục chúng nếu bạn đổi ý.
Giải pháp 4: Theo dõi và Tạm cất (Cách chuyên nghiệp)Có lẽ bạn nhận ra rằng những file này lẽ ra nên là một phần của kho lưu trữ ngay từ đầu. Trong trường hợp này, hãy theo dõi chúng, tạm cất chúng vào stash, sau đó chuyển nhánh. Điều này giữ cho lịch sử công việc của bạn luôn sạch sẽ.
# 1. Đưa các file vào hàng chờ (stage)
git add config/settings.local.php
# 2. Tạm cất chúng một cách an toàn
git stash
# 3. Chuyển nhánh
git checkout destination-branch
# 4. (Tùy chọn) Lấy lại các thay đổi của bạn
git stash pop
Nếu bạn sử dụng stash pop và nhánh đích có nội dung khác trong các file đó, Git sẽ kích hoạt một xung đột merge (merge conflict) thông thường. Cách này an toàn hơn nhiều so với việc ghi đè trực tiếp vì bạn có thể chọn dòng code nào muốn giữ lại.

