Domain 2 · 7 phút đọc

Sửa commit cuối với git commit --amend

Fixing the Last Commit with git commit --amend

Vừa commit xong thì phát hiện gõ sai message, hoặc quên thêm một file? Không cần tạo commit mới lủng củng — git commit --amend cho phép bạn sửa lại commit gần nhất. Nhưng nó viết lại lịch sử, nên có một cảnh báo quan trọng.

Sửa commit message

Trường hợp đơn giản nhất: commit cuối có message sai chính tả hoặc thiếu thông tin.

# Mở editor để sửa lại message của commit cuối
git commit --amend

# Hoặc đặt message mới trực tiếp
git commit --amend -m "feat: thêm xác thực người dùng"

Thêm file quên vào commit cuối

Nếu bạn commit nhưng quên git add một file, hãy stage nó rồi amend:

# Stage file bị quên
git add config.js

# Gộp nó vào commit cuối, giữ nguyên message
git commit --amend --no-edit

Cờ --no-edit giữ nguyên message cũ, chỉ cập nhật nội dung commit.

amend viết lại lịch sử

Điểm mấu chốt: --amend không sửa commit cũ tại chỗ. Nó tạo ra một commit hoàn toàn mới thay thế commit cũ, với một commit hash khác. Commit cũ bị bỏ lại (sẽ được dọn dẹp sau).

Vì hash thay đổi, đây là một dạng viết lại lịch sử (history rewriting) — giống như reset.

Đừng amend commit đã push

Nếu commit đã được push lên nhánh chung và người khác đã pull về, --amend sẽ làm lịch sử cục bộ của bạn lệch so với remote. Lần push tiếp theo bị từ chối, buộc bạn phải push --force — thao tác này có thể ghi đè và làm mất commit của người khác.

Nếu buộc phải amend commit đã push

Chỉ nên làm khi bạn chắc chắn không ai khác đang dùng nhánh đó (ví dụ nhánh feature cá nhân):

# An toàn hơn force thường: chỉ ghi đè nếu remote không có commit mới
git push --force-with-lease

--force-with-lease kiểm tra remote chưa thay đổi từ lần fetch cuối, giảm rủi ro xóa nhầm công việc của người khác so với --force trần.

Trọng tâm thi

git commit --amend thay thế commit cuối bằng một commit mới (hash mới) — đây là viết lại lịch sử. An toàn khi commit còn cục bộ; nguy hiểm khi đã push lên nhánh chia sẻ vì buộc phải force push.

Tóm tắt

  • git commit --amend sửa lại commit gần nhất: đổi message hoặc thêm file đã stage.
  • --amend -m "..." đặt message mới; --amend --no-edit giữ message, chỉ cập nhật nội dung.
  • amend tạo commit mới với hash mới — là một dạng viết lại lịch sử.
  • An toàn khi chưa push; nếu đã push lên nhánh chung thì tránh, hoặc cùng lắm dùng --force-with-lease.