Quay ngược commit Git và cập nhật an toàn trên VPS
Cách đưa dự án về một commit cũ, force push lên remote, rồi reset code trên VPS cho khớp mà không dính merge conflict, sau đó rebuild service và xử lý cache.
Khi code mới bị lỗi và bạn muốn quay về một commit đã chạy ổn, quy trình an toàn gồm ba
bước: reset ở máy local rồi force push, reset ở VPS cho khớp remote (KHÔNG dùng git pull),
rồi rebuild service đang chạy. Bài này đi lần lượt kèm lệnh copy-paste.
Thay <commit-hash> bằng mã commit bạn muốn quay về, /opt/apps/myapp bằng đường dẫn
project trên VPS, và myapp bằng tên app/service của bạn.
Trên máy local
Nếu code bị lỗi và bạn muốn hủy các commit gần đây để về trạng thái của một commit cũ:
# 1. Reset nhánh hiện tại về đúng commit cũ (bỏ các thay đổi sau đó)
git reset --hard <commit-hash>
# 2. Ghi đè lịch sử remote bằng lịch sử hiện tại (force push)
git push origin main --forceNếu làm việc nhóm, force push có thể xóa mất code của người khác. Hãy báo team trước khi thực hiện.
Trên VPS (remote)
Sau khi force push từ local, code trên VPS vẫn là bản trước rollback. Tuyệt đối KHÔNG dùng
git pull lúc này vì cây lịch sử đã rẽ nhánh (diverged), dễ gây merge conflict. Cách an
toàn nhất là reset cho khớp 100% với branch remote:
# SSH vào VPS rồi chuyển tới thư mục project
cd /opt/apps/myapp
# 1. Lấy thông tin mới nhất từ origin (không tự động merge)
git fetch origin
# 2. Hard reset nhánh hiện tại theo đúng main trên origin
git reset --hard origin/mainRebuild và restart service
Sau khi code trên VPS đã về đúng bản cũ, chạy lại/build lại để cập nhật ứng dụng đang chạy.
Next.js, React, Node.js nói chung:
npm install
npm run buildPM2 (quản lý tiến trình):
pm2 restart myapp
# hoặc
pm2 reload allDocker Compose:
docker compose down
docker compose up -d --buildỨng dụng .NET:
dotnet publish -c Release
# Sau đó restart service, ví dụ: systemctl restart myappLưu ý về cache
Nếu đã rollback và restart service nhưng tải lại trang vẫn thấy giao diện/tính năng cũ, 99% là do cache. Kiểm tra và xóa các loại cache sau:
- Trình duyệt (mở cửa sổ ẩn danh, hoặc bật Disable cache trong tab Network)
- CDN (ví dụ Cloudflare)
- Service Worker (tab Application trên Chrome)
- Next.js hay các framework SSR (xóa thư mục build
.next,dist...)
Xử lý sự cố
| Triệu chứng | Cách xử lý |
|---|---|
| VPS báo merge conflict khi cập nhật | Không dùng git pull; chạy git fetch origin rồi git reset --hard origin/main |
| Đã rollback nhưng trang vẫn hiện bản cũ | Xóa cache trình duyệt, CDN, Service Worker và thư mục build |
force push bị từ chối | Kiểm tra quyền trên remote và tên branch; đảm bảo đúng origin main |