Sửa lỗi Git Push Bị Từ Chối: Updates Were Rejected Because the Tip of Your Current Branch Is Behind

beginner📦 Git2026-03-24| Git 2.x, mọi hệ điều hành (Linux, macOS, Windows), mọi remote (GitHub, GitLab, Bitbucket)

Error Message

error: failed to push some refs - Updates were rejected because the tip of your current branch is behind
#git#push#remote

Chuyện Gì Vừa Xảy Ra

Bạn chạy git push và nhận được thông báo này:

$ git push origin main
To https://github.com/your-org/your-repo.git
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/your-org/your-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.

Branch local của bạn đang bị tụt hậu so với remote. Một đồng nghiệp đã push commit mới sau lần pull cuối cùng của bạn, và Git từ chối cho phép bạn ghi đè công việc của họ bằng cách push lên trên lịch sử cũ hơn của bạn.

Git đang bảo vệ remote khỏi việc mất đi những commit mới hơn đó. Tương tự như xung đột file, chỉ là ở cấp độ commit.

Tại Sao Lỗi Này Xảy Ra

Đây là chuỗi sự kiện dẫn đến lỗi này:

  • Bạn clone hoặc pull repo tại commit A.
  • Một đồng nghiệp push commit B lên remote.
  • Bạn tạo commit C của riêng mình ở local — cũng dựa trên A.
  • Bạn cố push C, nhưng remote đã ở tại B. Push của bạn sẽ xóa hoàn toàn B.

Git gọi tình huống này là non-fast-forward. Branch của bạn không thể đơn giản tiến lên theo đường thẳng — nó sẽ phải bỏ qua công việc của người khác.

Cách Sửa Nhanh: Pull và Merge

Trong hầu hết các tình huống hàng ngày trên branch dùng chung, hãy pull trước và để Git merge:

# Bước 1: Pull các thay đổi mới nhất từ remote
git pull origin main

# Bước 2: Nếu có xung đột merge, hãy giải quyết chúng
# (Chỉnh sửa các file xung đột, sau đó:)
git add .
git commit -m "Merge remote changes"

# Bước 3: Push lại
git push origin main

Git sẽ yêu cầu bạn nhập thông điệp merge commit, hoặc tự tạo một thông điệp. Sau khi merge thành công, push của bạn sẽ đi qua mà không gặp vấn đề gì.

Cách Sửa Thay Thế: Pull với Rebase (Lịch Sử Gọn Hơn)

Muốn có lịch sử commit thẳng mà không có merge commit? Dùng --rebase:

# Pull và rebase các commit local của bạn lên trên remote
git pull --rebase origin main

# Nếu có xung đột rebase:
# 1. Sửa các file xung đột
# 2. Stage chúng
git add 
# 3. Tiếp tục rebase
git rebase --continue

# Push sau khi rebase hoàn tất
git push origin main

Rebase phát lại các commit của bạn lên trên các commit remote. Kết quả trông như thể bạn thực hiện các thay đổi sau những commit remote — không có nhánh rẽ trong lịch sử.

Đặt Rebase Làm Chiến Lược Pull Mặc Định

Để mỗi lần git pull đều rebase thay vì merge, chạy lệnh này một lần:

git config --global pull.rebase true

Làm Việc Một Mình Trên Branch Này?

Đôi khi lỗi này xảy ra khi bạn push từ máy khác và bản local hiện tại chỉ đơn giản là đã cũ. Một lệnh pull thông thường là đủ:

git pull origin main
git push origin main

Nếu các commit local của bạn chỉ là bản nháp mà bạn không còn cần nữa — chẳng hạn, bạn đã push phiên bản thực từ máy khác — bạn có thể xóa chúng và reset về remote:

# Reset branch local để khớp chính xác với remote
git fetch origin
git reset --hard origin/main

Cảnh báo: --hard sẽ xóa vĩnh viễn tất cả các thay đổi local chưa commit và mọi commit chưa có trên remote. Chỉ dùng lệnh này khi bạn chắc chắn rằng công việc local có thể bỏ đi được.

Force Push — Khi Nào và Cách Dùng (Cần Thận Trọng)

Force push có những trường hợp sử dụng hợp lệ: dọn dẹp lịch sử commit lộn xộn trước PR, hoặc push sau khi rebase một feature branch mà chỉ mình bạn làm việc.

# Force push (ghi đè lịch sử remote)
git push --force origin feature/my-branch

Một tùy chọn an toàn hơn là --force-with-lease. Nó từ chối push nếu người khác đã push kể từ lần fetch cuối của bạn — một lưới an toàn hữu ích:

git push --force-with-lease origin feature/my-branch

Không bao giờ force push lên main, master, hoặc bất kỳ branch dùng chung nào trừ khi cả nhóm biết điều đó đang xảy ra. Force push ghi đè lịch sử. Bất kỳ ai đã dựa công việc của họ trên những commit đó sẽ gặp phải vấn đề phân kỳ nghiêm trọng, và không có cách hoàn tác dễ dàng khi đã xong.

Kiểm Tra Xem Đã Sửa Được Chưa

Sau khi push thành công, xác nhận local và remote đã đồng bộ:

# Kiểm tra trạng thái remote tracking
git status
# Dự kiến: "Your branch is up to date with 'origin/main'."

# Xem các commit gần đây bao gồm cả remote
git log --oneline -10

# So sánh trực tiếp local với remote
git fetch origin
git log HEAD..origin/main --oneline
# Không có output = đã đồng bộ hoàn toàn

Danh Sách Kiểm Tra: Nên Dùng Cách Sửa Nào

  • Branch dùng chung (main, develop)git pull hoặc git pull --rebase. Không bao giờ force push.
  • Feature branch của riêng bạn, không có đồng đội → Force push chấp nhận được sau khi rebase.
  • Commit local có thể bỏ đigit fetch + git reset --hard origin/main.
  • Muốn lịch sử tuyến tính gọn gànggit pull --rebase.

Ngăn Lỗi Này Tái Diễn

Hãy pull trước khi bắt đầu code mỗi phiên làm việc. Chỉ mất năm giây và tránh được toàn bộ tình huống này:

# Bắt đầu mỗi phiên làm việc bằng:
git pull origin main

# Hoặc chỉ fetch để xem có gì thay đổi mà chưa merge:
git fetch origin
git log HEAD..origin/main --oneline  # Xem có gì mới trên remote

Trong các nhóm dùng feature branch, xung đột trên main rất hiếm gặp. Mối nguy thực sự là khi hai người làm việc trên cùng một feature branch mà không trao đổi trước. Giữ branch ngắn gọn, giao tiếp trước khi push, và lỗi này sẽ trở nên hiếm gặp.

Related Error Notes