Xóa tệp trong Git không phải lúc nào cũng đơn giản như tưởng. Bạn xóa một tệp khỏi hệ thống của mình, nhưng điều đó không có nghĩa là nó đã biến mất khỏi kho. Nó có thể vẫn tồn tại trong lịch sử, hoặc tệ hơn, bị commit nhầm, như một tệp cấu hình hoặc khóa API.
Trong hướng dẫn này, bạn sẽ học cách xóa tệp khỏi Git. Chúng ta sẽ bắt đầu với các lệnh cơ bản như git rm, rồi đi vào các phương pháp nâng cao hơn như dọn dẹp tệp chưa được theo dõi và chỉnh sửa lịch sử commit.
Yêu cầu tiên quyết
Trước khi xóa tệp bằng Git, hãy đảm bảo mọi thứ đã được thiết lập.
Trước tiên, kiểm tra xem Git đã được cài đặt chưa. Mở terminal và chạy:
Bạn cũng có thể cài một Git GUI như GitHub Desktop, Sourcetree hoặc GitKraken nếu thích giao diện trực quan. Nhưng trong hướng dẫn này, tôi sẽ dùng dòng lệnh (Git Bash).
Hãy chắc chắn bạn có quyền thay đổi kho, đặc biệt nếu bạn là thành viên nhóm hoặc làm việc với kho từ xa như GitHub hay GitLab.
Lưu ý: Một số thao tác xóa tệp không thể hoàn tác. Vì vậy, tốt nhất là sao lưu dự án hoặc ít nhất kiểm tra kỹ trạng thái kho trước khi chạy bất kỳ lệnh nào xóa tệp.
Xong rồi thì bắt đầu nhé.
Xóa tệp cơ bản trong Git
Có vài cách khác nhau để xóa tệp trong Git, tùy vào mục đích của bạn. Hãy xem một số lựa chọn phổ biến:
Dùng git rm
Lệnh git rm xóa tệp khỏi kho Git. Khi bạn chạy, hai việc xảy ra:
Git xóa tệp khỏi thư mục làm việc
Và stage thay đổi đó cho lần commit tiếp theo
Nhưng Git không chỉ xóa tệp. Nó ghi nhận việc xóa trong lịch sử. Khi bạn commit, tệp được chính thức gỡ khỏi dự án.
Lệnh này xóa mọi tệp trong thư mục temp mà không xóa chính thư mục.
Git cũng bổ sung một số kiểm tra an toàn. Nếu tệp có thay đổi chưa được commit, Git sẽ không xóa trừ khi bạn ép buộc. Chỉ dùng nếu bạn chắc chắn có thể loại bỏ các thay đổi đó:
(Ở đây, * nghĩa là tất cả. Nó khớp mọi tên tệp kết thúc bằng .txt.)
2. --cached
Tùy chọn này xóa tệp khỏi kho nhưng giữ lại trên máy của bạn. Giả sử tôi lỡ thêm một tệp nhạy cảm như config.env. Tôi không muốn nó trong kho, nhưng vẫn cần trên máy. Vậy tôi sẽ chạy:
Viết tắt của recursive. Thay vì một tệp, tùy chọn này xóa đệ quy thư mục và nội dung của nó. Nếu không có cờ này, Git sẽ báo lỗi khi bạn thử xóa thư mục.
Lệnh này hiển thị lịch sử đầy đủ các commit, checkout, reset, và mọi thao tác của bạn trong Git.
Nhưng git reflog chỉ dùng cục bộ và không hoạt động trên kho từ xa. Nếu bạn làm việc với kho từ xa, tốt hơn là dùng git log -- file.txt để theo dõi lịch sử của tệp đó.
Khi đã tìm được thời điểm tệp còn tồn tại, khôi phục nó bằng git checkout hoặc git restore như trước.
Sửa tệp thiếu trong Git
Đôi khi tệp bị xóa trực tiếp từ hệ thống—có thể qua trình quản lý tệp, lệnh rm trong terminal, hoặc vô tình. Khi điều này xảy ra, Git không tự động dọn dẹp. Thay vào đó, nó đánh dấu các tệp đó là thiếu và chờ bạn xử lý việc xóa đúng cách.
git ls-files --deleted liệt kê tất cả tệp Git đang theo dõi nhưng giờ đã thiếu.
xargs -0 git rm truyền các tên tệp đó cho git rm và xóa chúng khỏi index của Git.
Điều này hữu ích khi bạn làm việc trên dự án lớn và muốn dọn nhanh.
Lưu ý: Tôi nhận thông báo này vì không có tệp nào đang được theo dõi bị thiếu trên đĩa của bạn.
Xóa tệp nâng cao trong Git
Sau khi đã nắm cơ bản, hãy xem các tình huống nâng cao hơn khi xóa tệp khỏi Git không chỉ đơn giản chạy git rm. Đây là các trường hợp có dữ liệu nhạy cảm hoặc cần dọn dẹp tệp chưa theo dõi một cách cẩn thận.
Gỡ dữ liệu nhạy cảm khỏi Git
Đôi khi một tệp chứa dữ liệu riêng tư, như khóa API hoặc mật khẩu, bị commit nhầm. Xóa thông thường sẽ không giúp được. Vì Git lưu toàn bộ lịch sử, và tệp vẫn tồn tại trong các commit trước.
Để xóa sạch hoàn toàn, bạn có thể dùng lệnh git filter-repo: git filter-repo (khuyến nghị)
Đây là lựa chọn mới và tốt hơn filter-branch. Nhanh hơn, an toàn hơn, và dễ dùng hơn.
Sau đó thông báo cho đồng đội. Họ sẽ cần re-clone hoặc reset bản sao cục bộ để tránh lỗi.
Dọn tệp chưa theo dõi với git clean
Tóm lại:
Các tệp đã theo dõi nằm trong lịch sử Git. Để xóa, dùng git rm, sau đó commit.
Các tệp chưa theo dõi không nằm trong Git. Chúng có thể tích tụ và làm rối dự án.
Để xóa tệp hoặc thư mục chưa theo dõi, dùng git clean.
Các tùy chọn hữu ích nhất:
git clean -n # Show which untracked files will be removedgit clean -nd # Show which untracked folders will be removedgit clean -fd # Delete all untracked files and folders. It is destructive.Được hỗ trợ bởi
Cụ thể:
-n nghĩa là chỉ xem trước.
-f nghĩa là xóa cưỡng bức.
-d bao gồm thư mục trong quá trình dọn dẹp.
Lưu ý: git clean sẽ không động đến tệp đã theo dõi. Nhưng nó sẽ xóa mọi thứ chưa theo dõi, kể cả tệp bạn muốn giữ. Vì vậy, luôn dùng -n trước để xem nó sẽ xóa gì.
Xóa tệp trong GitHub & công cụ GUI
Hầu hết những gì ta đã đề cập đến nay dùng dòng lệnh. Nhưng không phải ai cũng làm vậy và điều đó hoàn toàn ổn. Một số lập trình viên dùng công cụ trực quan khi làm việc trực tiếp trên GitHub.
Vì vậy, hãy xem cách xóa tệp hoạt động trên giao diện web của GitHub và các công cụ GUI khác, và so sánh với dòng lệnh.
Xóa tệp trên trang web GitHub
Nếu bạn làm việc trong giao diện trình duyệt của GitHub, bạn có thể xóa tệp mà không cần terminal.
Cách thực hiện trên giao diện năm 2025:
Mở tệp bạn muốn xóa.
Nhấp vào biểu tượng ba chấm ở góc trên bên phải.
Chọn Delete file trong menu thả xuống.
GitHub sau đó sẽ hiển thị ô thông điệp commit. Thêm một thông điệp ngắn như:
Hoặc tạo một nhánh mới và mở pull request (khuyến nghị cho quy trình làm việc nhóm)
Nhấp Commit changes, và GitHub sẽ xóa tệp và lưu việc xóa như một commit, tương tự như git rm trên dòng lệnh.
Xóa tệp bằng công cụ Git GUI
Nếu bạn dùng Git GUI như GitHub Desktop, Sourcetree hoặc Tower, quy trình cũng đơn giản:
Xóa tệp trong trình quản lý tệp hoặc ngay trong ứng dụng.
Ứng dụng sẽ hiển thị việc xóa dưới mục “Changes” hoặc “File Status”.
Xem lại, stage và commit thay đổi.
Mỗi công cụ trông hơi khác nhau, nhưng quy trình tương tự: Bạn theo dõi thay đổi trực quan và commit khi sẵn sàng.
Thực hành tốt nhất theo nền tảng
Sau đây là cái nhìn nhanh về cách xóa tệp hoạt động trên các nền tảng khác nhau, và khi nào mỗi nền tảng hữu ích nhất:
GitHub (Web): Phù hợp cho các sửa lỗi nhanh và cập nhật nhỏ. Tránh dùng cho dọn dẹp lớn hoặc tệp nhạy cảm.
Công cụ Git GUI: Tuyệt vời cho công việc hằng ngày. Dễ xem thay đổi và commit an toàn.
Dòng lệnh: Linh hoạt và hữu dụng nhất. Tốt nhất cho tác vụ nâng cao như chỉnh sửa hàng loạt hoặc thay đổi lịch sử.
Thực hành tốt nhất khi xóa tệp trong Git
Xóa tệp trong Git có vẻ đơn giản, nhưng một bước sai có thể làm hỏng mã của bạn. Dưới đây là vài mẹo thực tế tôi dùng để đảm bảo xóa an toàn và có kiểm soát, đặc biệt với dự án dùng chung hoặc dài hạn.
Luôn xác minh trước khi xóa
Trước khi xóa tệp, dành chút thời gian xác nhận vai trò của nó:
Chạy git status để xem nó đã được stage hay sửa đổi chưa.
Dùng git log -- <filename> để xem lịch sử commit của tệp.
Bước kiểm tra nhanh này giúp tôi tiết kiệm hàng giờ khôi phục sau này.
Dùng commit nguyên tử
Commit nguyên tử nghĩa là một commit cho mỗi thay đổi logic.
Ví dụ, nếu tôi đang xóa các tệp không dùng, tôi chỉ commit những việc xóa đó, tách biệt với chỉnh sửa mã.
Lý do vì sao hữu ích:
Dễ debug hơn. Công cụ như git bisect hoạt động tốt hơn khi commit nhỏ và tập trung.
Lịch sử commit rõ ràng, sạch sẽ.
Code review nhanh hơn.
Hợp tác cẩn thận khi viết lại lịch sử
Việc viết lại lịch sử bằng công cụ như git filter-repo ảnh hưởng đến mọi người trong nhóm. Để tránh hỗn loạn:
Trao đổi trước khi viết lại các nhánh dùng chung.
Cẩn thận khi dùng git push --force vì nó viết lại lịch sử từ xa.
Báo đồng đội re-clone hoặc reset kho cục bộ sau đó.
Lệnh này đưa tất cả tệp về trạng thái đã commit gần nhất.
Lời kết
Khi xóa tệp trong Git, rất dễ mắc lỗi nếu bạn không chú ý. Một sai sót nhỏ có thể dẫn đến vấn đề lớn hơn: mã hỏng, mất việc, hoặc gây rối trong nhóm. Vì vậy, hãy dành một chút để kiểm tra kỹ những gì bạn đang làm.
Dùng đúng lệnh cho đúng tình huống. Nếu chưa chắc lệnh sẽ làm gì, hãy thử dry run trước. Và nếu bạn làm việc nhóm, đảm bảo mọi người hiểu và thống nhất.
Git còn làm được nhiều điều hơn là xóa tệp. Bạn có thể xóa nhánh, hoàn tác lỗi bằng reset và revert, hoặc xem chính xác những gì đã thay đổi với git diff. Càng học, quy trình làm việc của bạn càng mượt.
Hãy tiến từng bước. Đó là cách để bạn thành thạo.
Git Remove File FAQs
“Staging the removal” nghĩa là gì?⌄
Staging nghĩa là chuẩn bị thay đổi cho lần commit tiếp theo. Khi bạn chạy git rm filename, Git xóa tệp khỏi thư mục và chuẩn bị việc xóa đó để được lưu trong commit kế tiếp. Đây gọi là staging việc xóa. Thay đổi chưa trở thành vĩnh viễn cho đến khi bạn chạy git commit.
Sự khác nhau giữa git rm và rm là gì?⌄
rm chỉ xóa tệp khỏi thư mục cục bộ của bạn. Git sẽ không theo dõi thay đổi này cho đến khi bạn chỉ định.
git rm xóa tệp và stage việc xóa cho lần commit tiếp theo, vì vậy Git cũng xóa nó khỏi kho.
Khi nào nên dùng git push origin so với git push?⌄
Khi nào dùng mỗi lệnh:
Dùng git push nếu nhánh của bạn đã kết nối với remote.
Dùng git push origin khi bạn muốn chỉ rõ remote sẽ push đến, như khi push một nhánh mới hoặc có nhiều remote.
git pull làm gì?⌄
git pull cập nhật nhánh cục bộ của bạn với những thay đổi mới nhất từ remote. Nó fetch các commit mới từ remote rồi merge chúng vào nhánh hiện tại của bạn.
Tôi là một chiến lược gia nội dung, yêu thích việc đơn giản hóa các chủ đề phức tạp. Tôi đã giúp các công ty như Splunk, Hackernoon và Tiiny Host tạo nội dung hấp dẫn và giàu thông tin cho khán giả của họ.
Xóa tệp trong Git không phải lúc nào cũng đơn giản như tưởng. Bạn xóa một tệp khỏi hệ thống của mình, nhưng điều đó không có nghĩa là nó đã biến mất khỏi kho. Nó có thể vẫn tồn tại trong lịch sử, hoặc tệ hơn, bị commit nhầm, như một tệp cấu hình hoặc khóa API.
Trong hướng dẫn này, bạn sẽ học cách xóa tệp khỏi Git. Chúng ta sẽ bắt đầu với các lệnh cơ bản như
git rm, rồi đi vào các phương pháp nâng cao hơn như dọn dẹp tệp chưa được theo dõi và chỉnh sửa lịch sử commit.Yêu cầu tiên quyết
Trước khi xóa tệp bằng Git, hãy đảm bảo mọi thứ đã được thiết lập.
Trước tiên, kiểm tra xem Git đã được cài đặt chưa. Mở terminal và chạy:
Nếu bạn thấy số phiên bản, bạn có thể bắt đầu.
Nếu bạn thấy số phiên bản, bạn có thể bắt đầu.
Bạn cũng có thể cài một Git GUI như GitHub Desktop, Sourcetree hoặc GitKraken nếu thích giao diện trực quan. Nhưng trong hướng dẫn này, tôi sẽ dùng dòng lệnh (Git Bash).
Hãy chắc chắn bạn có quyền thay đổi kho, đặc biệt nếu bạn là thành viên nhóm hoặc làm việc với kho từ xa như GitHub hay GitLab.
Lưu ý: Một số thao tác xóa tệp không thể hoàn tác. Vì vậy, tốt nhất là sao lưu dự án hoặc ít nhất kiểm tra kỹ trạng thái kho trước khi chạy bất kỳ lệnh nào xóa tệp.
Xong rồi thì bắt đầu nhé.
Xóa tệp cơ bản trong Git
Có vài cách khác nhau để xóa tệp trong Git, tùy vào mục đích của bạn. Hãy xem một số lựa chọn phổ biến:
Dùng git rm
Lệnh
git rmxóa tệp khỏi kho Git. Khi bạn chạy, hai việc xảy ra:Nhưng Git không chỉ xóa tệp. Nó ghi nhận việc xóa trong lịch sử. Khi bạn commit, tệp được chính thức gỡ khỏi dự án.
Bạn có thể xóa một tệp, nhiều tệp hoặc một nhóm tệp bằng wildcard.
Ví dụ, để xóa tất cả tệp log:
Điều này báo Git xóa mọi tệp trong thư mục kết thúc bằng
.log. Bạn có thể xác nhận thay đổi bằng:Xóa nhiều tệp chỉ với một lệnh git rm. Ảnh: Tác giả.
Muốn xóa mọi tệp trong một thư mục nhưng giữ nguyên thư mục? Dùng:
Lệnh này xóa mọi tệp trong thư mục temp mà không xóa chính thư mục.
Git cũng bổ sung một số kiểm tra an toàn. Nếu tệp có thay đổi chưa được commit, Git sẽ không xóa trừ khi bạn ép buộc. Chỉ dùng nếu bạn chắc chắn có thể loại bỏ các thay đổi đó:
Để xóa cả một thư mục và mọi thứ bên trong, thêm cờ
-r:Lệnh này xóa
testfoldervà tất cả tệp trong đó.Giờ để commit thay đổi, chạy lệnh sau:
Tùy chọn chính của git rm
Dưới đây là các tùy chọn thường dùng với
git rm:1. <filename>
Cách dùng cơ bản. Liệt kê các tệp bạn muốn xóa:
Bạn cũng có thể dùng wildcard để xóa nhiều tệp cùng loại. Ví dụ, để xóa tất cả tệp
.txt:(Ở đây,
*nghĩa là tất cả. Nó khớp mọi tên tệp kết thúc bằng.txt.)2. --cached
Tùy chọn này xóa tệp khỏi kho nhưng giữ lại trên máy của bạn. Giả sử tôi lỡ thêm một tệp nhạy cảm như config.env. Tôi không muốn nó trong kho, nhưng vẫn cần trên máy. Vậy tôi sẽ chạy:
Ở đây,
git rmsẽ xóa khỏi kho và thư mục làm việc. Còn--cachedngừng theo dõi tệp trong Git (nên sẽ không bị push), nhưng vẫn giữ tệp vật lý tại chỗ.Để tránh bị thêm lại, thêm nó vào
.gitignore:3. -r
Viết tắt của recursive. Thay vì một tệp, tùy chọn này xóa đệ quy thư mục và nội dung của nó. Nếu không có cờ này, Git sẽ báo lỗi khi bạn thử xóa thư mục.
Ở đây, tôi tạo một thư mục tên
testfoldervà hai tệp bên trong:a.txtvàb.txt.Sau đó tôi chạy lệnh:Lệnh này xóa thư mục cùng toàn bộ nội dung bên trong
4.
--dry-runNếu bạn chưa chắc điều gì sẽ xảy ra khi xóa tệp, hãy dùng
git rmvới tùy chọn--dry-runnhư sau:Đây là cách an toàn để xem trước những gì sẽ bị xóa.
Hoặc nếu bạn đang dọn dẹp tệp chưa được theo dõi và muốn kiểm tra kỹ những gì sẽ bị xóa, dùng:
Lệnh này chỉ hiển thị những gì sẽ bị xóa.
Phân tích quy trình so sánh
Có nhiều cách để xóa tệp trong Git. Các phương pháp có vẻ giống nhau, nhưng cách chúng hoạt động thì không.
git rm so với xóa thủ công
Giả sử có tệp
file.txt. Tôi không cần nó nữa.Một cách xóa là xóa trực tiếp từ hệ thống.
Trên Linux, macOS, hoặc Git Bash:
Trên Windows (command prompt):
Cách này xóa tệp khỏi thư mục của bạn. Nhưng Git chưa biết điều đó. Vì vậy bạn phải báo cho Git rằng tệp đã bị xóa:
Lệnh này stage việc xóa để được đưa vào lần commit tiếp theo.
Nếu bạn xóa vài tệp và không nhớ hết, có thể chạy:
Lệnh này stage tất cả tệp đã theo dõi bị thay đổi hoặc xóa. Nó sẽ không bao gồm tệp chưa được theo dõi.
Giờ bạn commit thay đổi:
Nếu bạn dùng
git rm, nó xử lý mọi thứ trong một bước. Nó xóa tệp và stage thay đổi ngay lập tức:Không cần chạy
git addriêng. Cách này gọn hơn và tránh quên stage việc xóa.Tóm lại:
git rmgọn gàng và an toàn hơn khi bạn chủ đích xóa các tệp đã được theo dõi.Khôi phục tệp đã xóa trong Git
Nếu bạn xóa tệp rồi mới nhận ra vẫn cần nó thì sao? Không vấn đề. Git cung cấp vài cách để khôi phục tùy vào thời điểm bạn phát hiện lỗi.
Nếu bạn chưa commit:
Giả sử bạn đã xóa tệp nhưng chưa commit thay đổi. Bạn có thể khôi phục từ lần commit gần nhất như sau:
Lệnh này đưa tệp trở lại thư mục làm việc từ commit mới nhất.
Nếu bạn đã commit việc xóa:
Cũng ổn. Trước hết, tìm commit cuối cùng nơi tệp vẫn tồn tại:
Xem log và sao chép hash commit nơi tệp vẫn còn. Sau đó chạy:
Trong các phiên bản Git cũ, bạn có thể dùng lệnh trên. Lệnh này khôi phục tệp từ một commit cụ thể, nhưng cũng có thể chuyển nhánh.
Từ Git 2.23, lệnh này được tách thành hai lệnh rõ ràng hơn:
git switch(để chuyển nhánh)git restore(để khôi phục tệp)Nếu bạn chỉ muốn khôi phục một tệp từ một commit, dùng:
Lệnh này lấy tệp từ commit đó và đặt lại vào thư mục làm việc của bạn.
Nếu bạn không chắc tệp bị xóa khi nào:
Có thể bạn đã thay đổi khá nhiều và không nhớ khi nào tệp biến mất. Khi đó, dùng git reflog hoặc reference log:
Lệnh này hiển thị lịch sử đầy đủ các commit, checkout, reset, và mọi thao tác của bạn trong Git.
Nhưng
git reflogchỉ dùng cục bộ và không hoạt động trên kho từ xa. Nếu bạn làm việc với kho từ xa, tốt hơn là dùnggit log -- file.txtđể theo dõi lịch sử của tệp đó.Khi đã tìm được thời điểm tệp còn tồn tại, khôi phục nó bằng
git checkouthoặcgit restorenhư trước.Sửa tệp thiếu trong Git
Đôi khi tệp bị xóa trực tiếp từ hệ thống—có thể qua trình quản lý tệp, lệnh rm trong terminal, hoặc vô tình. Khi điều này xảy ra, Git không tự động dọn dẹp. Thay vào đó, nó đánh dấu các tệp đó là thiếu và chờ bạn xử lý việc xóa đúng cách.
Hãy xem cách xử lý tình huống này theo từng bước.
Bước 1: Kiểm tra tệp thiếu
Chạy lệnh này trong thư mục dự án:
Nếu Git báo tệp bị xóa, nghĩa là nó đã biến mất khỏi hệ thống của bạn, nhưng thay đổi chưa được stage.
Bước 2: Stage việc xóa
Để báo cho Git stage mọi thay đổi (bao gồm tệp bị xóa), chạy:
Lệnh này stage mọi thay đổi tệp: mới, sửa, và xóa. Sau đó commit cập nhật:
Đây là cách an toàn nhất để dọn dẹp vì nó bao quát mọi thay đổi trong một lượt.
Bước 3: Push lên kho từ xa
Nếu bạn làm việc với kho từ xa, hãy push commit:
Thay
<branch-name>bằng nhánh đang làm việc, nhưmainhoặcdev.Bước 4: Cách khác
Giả sử bạn đã xóa thủ công một loạt tệp, có thể do nhầm lẫn, hoặc khi dọn dẹp. Git vẫn nghĩ các tệp đó tồn tại cho đến khi bạn báo ngược lại.
Nếu bạn không muốn xóa từng tệp bằng
git rm, có cách nhanh hơn để dọn dẹp.Chạy lệnh này trong terminal:
Cụ thể:
git ls-files --deletedliệt kê tất cả tệp Git đang theo dõi nhưng giờ đã thiếu.xargs -0 git rmtruyền các tên tệp đó chogit rmvà xóa chúng khỏi index của Git.Điều này hữu ích khi bạn làm việc trên dự án lớn và muốn dọn nhanh.
Lưu ý: Tôi nhận thông báo này vì không có tệp nào đang được theo dõi bị thiếu trên đĩa của bạn.
Xóa tệp nâng cao trong Git
Sau khi đã nắm cơ bản, hãy xem các tình huống nâng cao hơn khi xóa tệp khỏi Git không chỉ đơn giản chạy
git rm. Đây là các trường hợp có dữ liệu nhạy cảm hoặc cần dọn dẹp tệp chưa theo dõi một cách cẩn thận.Gỡ dữ liệu nhạy cảm khỏi Git
Đôi khi một tệp chứa dữ liệu riêng tư, như khóa API hoặc mật khẩu, bị commit nhầm. Xóa thông thường sẽ không giúp được. Vì Git lưu toàn bộ lịch sử, và tệp vẫn tồn tại trong các commit trước.
Để xóa sạch hoàn toàn, bạn có thể dùng lệnh
git filter-repo: git filter-repo (khuyến nghị)Đây là lựa chọn mới và tốt hơn
filter-branch. Nhanh hơn, an toàn hơn, và dễ dùng hơn.Trước tiên, cài đặt (bạn cần Python và pip):
Sau đó chạy:
Lệnh này xóa tệp
hide.txtkhỏi mọi commit trong lịch sử kho của bạn.Để xác nhận, chạy:
Nếu tệp đã biến mất, thêm nó vào
.gitignoređể không bị theo dõi lại:Nếu bạn làm việc theo nhóm, hãy dọn lịch sử đã viết lại và force-push thay đổi:
Sau đó thông báo cho đồng đội. Họ sẽ cần re-clone hoặc reset bản sao cục bộ để tránh lỗi.
Dọn tệp chưa theo dõi với git clean
Tóm lại:
git rm, sau đó commit.Để xóa tệp hoặc thư mục chưa theo dõi, dùng
git clean.Các tùy chọn hữu ích nhất:
Cụ thể:
-nnghĩa là chỉ xem trước.-fnghĩa là xóa cưỡng bức.-dbao gồm thư mục trong quá trình dọn dẹp.Lưu ý:
git cleansẽ không động đến tệp đã theo dõi. Nhưng nó sẽ xóa mọi thứ chưa theo dõi, kể cả tệp bạn muốn giữ. Vì vậy, luôn dùng-ntrước để xem nó sẽ xóa gì.Xóa tệp trong GitHub & công cụ GUI
Hầu hết những gì ta đã đề cập đến nay dùng dòng lệnh. Nhưng không phải ai cũng làm vậy và điều đó hoàn toàn ổn. Một số lập trình viên dùng công cụ trực quan khi làm việc trực tiếp trên GitHub.
Vì vậy, hãy xem cách xóa tệp hoạt động trên giao diện web của GitHub và các công cụ GUI khác, và so sánh với dòng lệnh.
Xóa tệp trên trang web GitHub
Nếu bạn làm việc trong giao diện trình duyệt của GitHub, bạn có thể xóa tệp mà không cần terminal.
Cách thực hiện trên giao diện năm 2025:
GitHub sau đó sẽ hiển thị ô thông điệp commit. Thêm một thông điệp ngắn như:
Bạn cũng có thể viết mô tả tùy chọn.
Tiếp theo, chọn cách lưu thay đổi:
mainNhấp Commit changes, và GitHub sẽ xóa tệp và lưu việc xóa như một commit, tương tự như
git rmtrên dòng lệnh.Xóa tệp bằng công cụ Git GUI
Nếu bạn dùng Git GUI như GitHub Desktop, Sourcetree hoặc Tower, quy trình cũng đơn giản:
Mỗi công cụ trông hơi khác nhau, nhưng quy trình tương tự: Bạn theo dõi thay đổi trực quan và commit khi sẵn sàng.
Thực hành tốt nhất theo nền tảng
Sau đây là cái nhìn nhanh về cách xóa tệp hoạt động trên các nền tảng khác nhau, và khi nào mỗi nền tảng hữu ích nhất:
Thực hành tốt nhất khi xóa tệp trong Git
Xóa tệp trong Git có vẻ đơn giản, nhưng một bước sai có thể làm hỏng mã của bạn. Dưới đây là vài mẹo thực tế tôi dùng để đảm bảo xóa an toàn và có kiểm soát, đặc biệt với dự án dùng chung hoặc dài hạn.
Luôn xác minh trước khi xóa
Trước khi xóa tệp, dành chút thời gian xác nhận vai trò của nó:
git statusđể xem nó đã được stage hay sửa đổi chưa.git log -- <filename>để xem lịch sử commit của tệp.Bước kiểm tra nhanh này giúp tôi tiết kiệm hàng giờ khôi phục sau này.
Dùng commit nguyên tử
Commit nguyên tử nghĩa là một commit cho mỗi thay đổi logic.
Ví dụ, nếu tôi đang xóa các tệp không dùng, tôi chỉ commit những việc xóa đó, tách biệt với chỉnh sửa mã.
Lý do vì sao hữu ích:
git bisecthoạt động tốt hơn khi commit nhỏ và tập trung.Hợp tác cẩn thận khi viết lại lịch sử
Việc viết lại lịch sử bằng công cụ như
git filter-repoảnh hưởng đến mọi người trong nhóm. Để tránh hỗn loạn:git push --forcevì nó viết lại lịch sử từ xa.Dùng --dry-run trước lệnh phá hủy
Trước khi chạy lệnh xóa tệp, luôn thử trước:
Lệnh này hiển thị những gì sẽ bị xóa mà không xóa gì cả. Lý do tôi nghĩ bạn luôn nên làm vậy:
Kết hợp git rm --cached với .gitignore
Nếu bạn lỡ commit thứ không nên có trong kho (như tệp cấu hình hoặc log), hãy sửa trong hai bước:
Lệnh này báo Git ngừng theo dõi tệp nhưng giữ nó trên máy của bạn.
gitignore:Vì sao hữu ích:
.env,.log, hoặcnode_modules) ngoài kho.Các trường hợp biên với Git: Staging & thư mục trống
Đôi khi việc xóa tệp không như mong đợi. Bạn có thể stage nhầm tệp hoặc gặp vấn đề với thư mục trống.
Đây là cách tôi xử lý các trường hợp thường gặp.
Bỏ stage một tệp mà không mất thay đổi
Giả sử tôi chạy
git add .và vô tình stage một tệp không định stage. Tôi không muốn mất thay đổi—tôi chỉ muốn bỏ stage nó.Để sửa, tôi chạy:
Lệnh này bỏ stage tệp nhưng giữ nguyên các chỉnh sửa.
Để xác nhận, tôi dùng:
Giờ tệp sẽ hiển thị là "modified" thay vì "staged."
Giữ thư mục trống trong kho
Mặc định, Git bỏ qua thư mục trống. Nếu tôi cố commit một thư mục không có tệp bên trong, Git sẽ bỏ qua.
Nhưng đôi khi tôi muốn giữ thư mục đó trong kho cho log hoặc tải lên sau này. Cách phổ biến là thêm tệp giữ chỗ tên
.gitkeep.Cách làm:
Điều này khiến thư mục không còn “trống”, nên Git sẽ theo dõi nó.
Lưu ý:
.gitkeepkhông phải tính năng sẵn có của Git. Nó chỉ là quy ước. Bạn có thể đặt tên khác, nhưng.gitkeepgiúp người khác hiểu mục đích.Khắc phục sự cố khi xóa tệp trong Git
Dưới đây là vài vấn đề phổ biến tôi từng gặp khi xóa tệp trong Git và cách khắc phục.
Tệp vẫn xuất hiện trên kho từ xa
Bạn đã xóa tệp, commit thay đổi, nhưng nó vẫn còn trên kho từ xa. Có thể bạn quên push.
Vì vậy hãy nhớ chạy:
Ngoài ra kiểm tra:
Vấn đề với submodule
Submodule là các kho Git bên trong những kho Git khác. Chúng không hoạt động như thư mục bình thường.
Nếu bạn xóa tệp bên trong submodule:
Nếu bạn gỡ hoàn toàn submodule:
.gitmodulesvà.git/configTrạng thái HEAD tách rời (Detached HEAD)
Trong Git,
HEADthường trỏ đến nhánh hiện tại. Nhưng đôi khi nó trỏ đến một commit cụ thể, gọi là detached HEAD.Điều này xảy ra nếu bạn:
Kiểm tra trạng thái:
Nếu bạn thấy:
Bạn không ở trên một nhánh, và mọi thay đổi mới có thể mất khi bạn chuyển đi.
Cách khắc phục:
Nếu bạn đã có thay đổi và muốn giữ lại, chạy:
Lệnh này đặt công việc của bạn lên một nhánh mới và lưu lại.
Nếu bạn đã commit thay đổi và muốn chuyển chúng sang nhánh khác sau, làm như sau:
Nếu bạn không tạo thay đổi nào và chỉ muốn thoát khỏi detached HEAD, chạy:
Xong. HEAD của bạn đã được gắn lại, mọi thứ trở về bình thường.
Lỗi quyền hoặc trạng thái
Đôi khi Git không thể xóa tệp, thường gặp trên Windows. Điều này xảy ra nếu:
Cách khắc phục:
Vấn đề khi merge hoặc rebase
Nếu thấy lỗi như:
Có thể bạn đang ở giữa quá trình merge hoặc rebase.
Để hoàn tất rebase sau khi giải quyết xung đột:
Để hủy toàn bộ rebase hoặc merge:
Lệnh này khôi phục kho về trạng thái trước khi bắt đầu merge.
Muốn loại bỏ mọi thay đổi cục bộ và reset thư mục làm việc?
Hãy thử:
Lệnh này đưa tất cả tệp về trạng thái đã commit gần nhất.
Lời kết
Khi xóa tệp trong Git, rất dễ mắc lỗi nếu bạn không chú ý. Một sai sót nhỏ có thể dẫn đến vấn đề lớn hơn: mã hỏng, mất việc, hoặc gây rối trong nhóm. Vì vậy, hãy dành một chút để kiểm tra kỹ những gì bạn đang làm.
Dùng đúng lệnh cho đúng tình huống. Nếu chưa chắc lệnh sẽ làm gì, hãy thử dry run trước. Và nếu bạn làm việc nhóm, đảm bảo mọi người hiểu và thống nhất.
Git còn làm được nhiều điều hơn là xóa tệp. Bạn có thể xóa nhánh, hoàn tác lỗi bằng reset và revert, hoặc xem chính xác những gì đã thay đổi với git diff. Càng học, quy trình làm việc của bạn càng mượt.
Hãy tiến từng bước. Đó là cách để bạn thành thạo.