0

Bắt bệnh Git: Lỗi "non-fast-forward" (failed to push some refs)

Dấu hiệu nhận biết

Khi bạn thực hiện thao tác đẩy code (git push), Git từ chối thực thi và trả về thông báo lỗi có chứa đoạn sau:

! [rejected]        qc -> qc (non-fast-forward)
error: failed to push some refs to '...'
hint: Updates were rejected because the tip of your current branch is behind its remote counterpart.

Nguyên nhân gốc rễ

Trong lúc bạn đang cặm cụi gõ code và tạo commit ở máy tính của mình (Local), thì trên server (Remote - ví dụ: Bitbucket, GitHub, GitLab), một thành viên khác trong team đã nhanh tay push các commit mới của họ lên chính nhánh qc này.

Lúc này, nhánh qc trên server đã có những thay đổi mới và "đi trước" (ahead) nhánh qc dưới máy bạn. Git báo lỗi non-fast-forward để chặn bạn lại. Mục đích là ngăn không cho bạn push đè code cũ của mình lên server, giúp bảo vệ công sức của người đồng nghiệp kia khỏi bị xóa sổ.

Các phương án "chữa bệnh"

Tùy vào quy trình làm việc của team (Git workflow) và tình huống cụ thể, bạn có thể chọn một trong các cách sau:

Cách 1: Git Pull - Gộp code an toàn (Khuyên dùng)

Đây là cách phổ biến và an toàn nhất trong đa số trường hợp. Bạn sẽ "kéo" code mới nhất từ server về máy, gộp chung với phần code bạn đang làm, rồi mới đẩy tất cả lên lại.

  1. Thực thi lệnh:

    git pull origin qc
    

    (Hoặc nhấn nút Pull trên các phần mềm như Fork, SourceTree).

  2. Xử lý:

    • Nếu không có xung đột (conflict): Git sẽ tự động tạo ra một merge commit.
    • Nếu có xung đột: Bạn cần mở file code lên, giải quyết conflict (như cách bạn vừa xử lý khéo léo với file ProvinceV2Select.php), sau đó chạy git add .git commit.
  3. Đẩy code lên server:

    git push origin qc
    

Cách 2: Git Pull Rebase - Giữ lịch sử Git thẳng tắp

Nếu team bạn có nguyên tắc không thích các "merge commit" lộn xộn và muốn lịch sử nhánh Git luôn là một đường thẳng đẹp đẽ, hãy dùng Rebase. Phương pháp này sẽ tạm cất các commit của bạn đi, tải các commit mới trên server về, rồi khéo léo đặt commit của bạn lên trên cùng.

  1. Thực thi lệnh:

    git pull --rebase origin qc
    
  2. Xử lý conflict (nếu có): Khác với cách 1, rebase sẽ yêu cầu bạn giải quyết conflict theo từng commit một. Sau khi sửa xong, bạn chạy:

    git add <tên-file>
    git rebase --continue
    

    (Lưu ý: Tuyệt đối không dùng lệnh git commit ở bước này).

  3. Đẩy code lên server:

    git push origin qc
    

Cách 3: Push Force - Ghi đè bất chấp (Sử dụng cực kỳ cẩn thận)

Chỉ dùng cách này khi bạn chắc chắn 100% rằng những commit mới trên server là sai, hoặc bạn vừa chủ ý dùng các lệnh viết lại lịch sử Git (như git commit --amend, git reset) và muốn áp đặt lịch sử mới này lên server.

  • Thực thi lệnh:
    git push --force origin qc
    
  • Hậu quả: Toàn bộ commit mới trên server (của người khác) sẽ bốc hơi vĩnh viễn và bị thay thế hoàn toàn bằng bộ code trên máy bạn. Hãy luôn cân nhắc kỹ hoặc hỏi ý kiến team trước khi gõ phím Enter!

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí