Git Force Push
Cập nhật lần cuối
Một lệnh git push bình thường sẽ bị từ chối khi nhánh local của bạn đã rẽ khác so với remote, vì Git không ghi đè những commit mà có thể bạn chưa thấy. Force push bỏ qua bước kiểm tra đó và buộc nhánh trên remote khớp với nhánh local. Bạn cần nó sau khi viết lại lịch sử (rebase hoặc amend), nhưng nó có thể xóa mất commit của người khác, nên hãy dùng --force-with-lease an toàn hơn.
Thử các lệnh này trong playground terminal: một shell thật ngay trên trình duyệt, không cần cài đặt gì.
Cú pháp
| Lệnh | Tác dụng |
|---|---|
git push --force | Ghi đè nhánh remote, không kiểm tra an toàn |
git push -f | Dạng ngắn của --force |
git push --force-with-lease | Chỉ ghi đè nếu trong lúc đó không ai push |
git push --force-with-lease origin feature | Force push an toàn hơn lên một nhánh chỉ định |
--force và --force-with-lease
| Hành vi | --force | --force-with-lease |
|---|---|---|
| Ghi đè remote | Luôn luôn | Chỉ khi không đổi kể từ lần fetch gần nhất |
| Có thể xóa commit của người khác | Có | Từ chối, trừ khi một lần fetch đã làm mới lease |
| Khuyên dùng cho nhóm | Không | Có |
Câu hỏi thường gặp về git force push
Khi nào cần force push?
git rebase, git commit --amend hoặc một lần rebase tương tác để squash commit. Nhánh local không còn khớp với lịch sử trên remote, nên push bình thường bị từ chối và chỉ force push mới cập nhật được.--force và --force-with-lease khác nhau thế nào?
--force ghi đè nhánh remote vô điều kiện, có thể âm thầm xóa những commit mà đồng đội đã push sau lần fetch gần nhất của bạn. --force-with-lease chỉ ghi đè nếu remote vẫn đang ở commit bạn thấy lần cuối; nếu có người khác push trong lúc đó, lệnh sẽ từ chối và bảo vệ công sức của họ. Một lưu ý: bất kỳ lần fetch nào (kể cả fetch tự động chạy nền của IDE) cũng làm mới lease, nên hãy push ngay sau khi kiểm tra remote. Dù vậy, vẫn nên dùng nó thay cho --force trên mọi nhánh dùng chung.Force push có nguy hiểm không?
--force đơn thuần có thể ghi đè những commit người khác đã push, coi như xóa công sức của họ khỏi remote. Force push an toàn trên nhánh chỉ mình bạn dùng. Khi không chắc, hãy dùng --force-with-lease, lệnh này thất bại một cách an toàn thay vì đè lên những thay đổi bạn chưa thấy.Làm sao để hoàn tác một lần force push?
git reflog, bạn có thể reset nhánh về chúng rồi force push lần nữa để khôi phục trạng thái trước. Đây thêm một lý do để dùng --force-with-lease: ngay từ đầu, nó khiến việc ghi đè ngoài ý muốn ít xảy ra hơn nhiều.Có thể luyện tập lệnh này online không?
Có. Mở playground terminal để chạy các lệnh git push trong một shell thật ngay trên trình duyệt, không cần cài đặt gì. Khóa học Git tương tác miễn phí của Coddy cũng hướng dẫn làm việc với remote từng bước.