Bạn đổi tên file bằng git mv, sửa thêm một dòng rồi commit. Tên mới có trong commit nhưng phần sửa cuối chưa xuất hiện. git mv cập nhật index khi hoàn tất; nó không tự stage những lần sửa nội dung diễn ra sau lệnh đó.
Bài đối chiếu tài liệu git-mv và git-diff ngày 06/11/2026, chạy fixture với Git 2.54.0. Mọi thao tác ghi chỉ nằm trong repository tạm do ví dụ tạo, không đổi repository công việc, không fetch hoặc push. Demo không có submodule, symlink hay đổi tên chỉ khác chữ hoa chữ thường.
Nhìn lại hai nơi chứa nội dung
Sau git mv, working tree có đường dẫn mới và index cũng đã được cập nhật cho việc đổi tên. Nếu tiếp tục sửa file mới, working tree đi trước index. Lúc ấy bạn cần xem cả diff thường lẫn diff cached để biết commit sắp chứa phần nào.
Đừng coi chữ R trong status là bằng chứng mọi nội dung mới đã được stage. Đó là thông tin về thay đổi được nhận diện; hãy đọc patch hoặc nội dung trực tiếp trong index khi cần xác nhận một dòng cụ thể.
1. Tạo và đổi tên trong repository riêng
Chạy đoạn Bash sau. Dấu ngoặc tròn giữ việc cd trong một subshell, không đổi thư mục shell của bạn:
(
set -eu
demo_dir=$(mktemp -d)
printf '%s\n' "$demo_dir"
cd "$demo_dir"
git init -q
git config user.name 'AeDev Demo'
git config user.email '[email protected]'
printf 'title=old\nmode=demo\n' > draft.txt
git add -- draft.txt
git -c commit.gpgsign=false commit -qm 'Initial demo file'
git mv -- draft.txt article.txt
git diff --cached --find-renames=100% --name-status
printf 'title=new\nmode=demo\n' > article.txt
git show :article.txt
git diff -- article.txt
git status --short
)
Dòng đầu là đường dẫn repository tạm. Trước lần sửa nội dung, diff cached với ngưỡng rename chính xác phải nhận diện draft.txt chuyển thành article.txt với nội dung không đổi. Sau lần sửa, git show đọc từ index vẫn phải thấy title=old, còn diff thường phải thể hiện title=new ở working tree.
Giữ đường dẫn thư mục tạm để kiểm tra tiếp. Không chép riêng các lệnh tạo hoặc ghi đè file vào repository đang làm việc nếu bạn chỉ muốn thử ví dụ.
2. Stage phần nội dung mới rồi đọc lại
Mở shell ở đúng repository tạm vừa in, chạy nhóm lệnh sau:
git add -- article.txt
git show :article.txt
git diff -- article.txt
git diff --cached --find-renames --summary
git diff --cached --find-renames
Lúc này nội dung index phải có title=new và diff thường cho article.txt phải trống vì working tree đã khớp index. Diff cached vẫn cần được đọc để biết commit tiếp theo chứa cả thay đổi đường dẫn và nội dung nào.
Bài không tạo commit thứ hai: mục tiêu là quan sát ảnh sắp commit. Nhờ vậy có thể đối chiếu HEAD cũ, index và file trên đĩa mà không phải hoàn tác một commit thử.
Rename trong báo cáo diff là kết quả nhận diện
git diff có cơ chế nhận diện cặp xóa và thêm tương tự nhau. –find-renames cho phép đặt ngưỡng độ giống; 100% trong bước đầu giúp kiểm tra riêng ca chỉ đổi tên. Sau khi nội dung bị sửa, mức giống có thể giảm và cách báo cáo có thể đổi theo dữ liệu, option và cấu hình.
Vì thế đừng viết test yêu cầu mọi lần đổi tên kèm viết lại toàn bộ nội dung đều phải hiện R100. Kiểm tra đường dẫn cũ không còn trong index, đường dẫn mới có đúng blob cần ghi và patch chứa các thay đổi dự kiến. Tên gọi rename trong giao diện không thay thế việc kiểm tra nội dung.
Lỗi thường gặp và phạm vi thử nghiệm
Nếu đích đã tồn tại, dừng để đọc trạng thái trước khi dùng option force. -f có thể cho phép ghi đè đích; nó không nên là bước mặc định chỉ vì lệnh đầu thất bại. Có thể dùng dry-run để xem thao tác dự kiến, nhưng vẫn cần kiểm tra diff sau thao tác thật.
Đổi tên file cũng không tự sửa import, đường dẫn cấu hình hay tham chiếu trong tài liệu. Sau khi stage đúng nội dung, chạy kiểm tra phù hợp với project để tìm các tham chiếu cũ. Fixture chỉ chứng minh trạng thái Git của hai file text, chưa chứng minh chương trình vẫn build sau một lần đổi tên thật.
Giữ một quy trình ngắn: đổi tên, sửa nội dung, đọc diff thường và cached, stage phần còn thiếu rồi đọc patch lần cuối. Cách này giúp bạn biết rõ commit sắp lưu cả tên mới lẫn nội dung mới nào.


