Vũ Văn HảiFull-stack · AI-native
Hướng dẫnBlog
Trao đổi dự án

© 2026 Vũ Văn Hải · Viết từ kinh nghiệm triển khai thật.

Trang chủHướng dẫnBlogRSS
  1. Hướng dẫn
  2. /Công cụ dev
  3. /Quay ngược commit Git và cập nhật an toàn trên VPS

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.

Cập nhật: 21 thg 9, 20262 phút đọc
GitVPSDocker
Mục lục
  • Trên máy local
  • Trên VPS (remote)
  • Rebuild và restart service
  • Lưu ý về cache
  • Xử lý sự cố

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 --force

Nế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/main

Rebuild 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 build

PM2 (quản lý tiến trình):

pm2 restart myapp
# hoặc
pm2 reload all

Docker Compose:

docker compose down
docker compose up -d --build

Ứng dụng .NET:

dotnet publish -c Release
# Sau đó restart service, ví dụ: systemctl restart myapp

Lư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ứngCách xử lý
VPS báo merge conflict khi cập nhậtKhô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ốiKiểm tra quyền trên remote và tên branch; đảm bảo đúng origin main
Bài tiếp theoDebug và bypass SSL pinning của app Android trên giả lập

Bài liên quan

  • Đặt app ở đâu trên VPS? Cấu trúc thư mục chuẩn /opt/apps

    Quy ước đặt mỗi app trong một thư mục con của /opt/apps trên VPS: chown thư mục cha một lần duy nhất, từ đó git clone, git pull và sửa .env đều không cần sudo.

    VPS

    VPS
  • Trang bảo trì tự động với Caddy khi deploy Docker

    Dùng handle_errors của Caddy để bắt lỗi 502 Bad Gateway lúc container đang rebuild và tự động hiển thị một trang HTML bảo trì, không cần bật tắt thủ công.

    VPS

    VPS
  • Cài Caddy làm reverse proxy trên VPS bằng Docker

    Dựng Caddy làm reverse proxy bằng Docker trên VPS mới: tạo network dùng chung, viết Caddyfile và docker-compose, tự động có HTTPS, rồi thêm domain mới chỉ bằng một lệnh reload không downtime.

    VPS

    VPS

Viết bởi Vũ Văn Hải

Tôi là Hải, full-stack developer ở TP. Hồ Chí Minh. Các bài ở đây đúc kết từ những hệ thống tôi tự dựng và vận hành. Cần dựng hoặc gỡ rối một hệ thống tương tự? Cứ nhắn tôi.

Trao đổi dự ánXem thêm hướng dẫn

Thấy sai sót hoặc lệnh không còn chạy? Báo cho tôi

Mục lục

  • Trên máy local
  • Trên VPS (remote)
  • Rebuild và restart service
  • Lưu ý về cache
  • Xử lý sự cố