Sửa lỗi 'fatal: refusing to merge unrelated histories' trong Git

beginner📦 Git2026-03-18| Git 2.9+ trên Linux, macOS, Windows — xảy ra khi chạy git merge, git pull, hoặc git rebase

Error Message

fatal: refusing to merge unrelated histories
#git#merge#history#unrelated

Mô tả lỗi

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

fatal: refusing to merge unrelated histories

Hai branch không có commit tổ tiên chung — lịch sử của chúng hoàn toàn tách biệt. Git 2.9 đã thêm kiểm tra bảo vệ này để ngăn bạn vô tình gộp hai project không liên quan lại với nhau.

Khi nào xảy ra lỗi này?

  • Bạn chạy git init trên máy và sau đó thêm remote đã có sẵn commit (ví dụ: GitHub repo được khởi tạo kèm README)
  • Bạn đang cố tình gộp hai repository riêng biệt lại với nhau
  • Lịch sử .git đã bị xóa và khởi tạo lại ở một phía
  • Bạn đã clone một shallow repository và đang cố merge với một repo đầy đủ

Cách sửa 1: Cho phép merge lịch sử không liên quan (Phổ biến nhất)

Thêm flag --allow-unrelated-histories. Chỉ vậy thôi. Flag này báo cho Git biết bạn đã hiểu tình huống và muốn tiếp tục:

# Nếu lỗi xảy ra khi chạy git merge
git merge origin/main --allow-unrelated-histories

# Nếu lỗi xảy ra khi chạy git pull
git pull origin main --allow-unrelated-histories

Git sẽ mở trình soạn thảo đã cấu hình để nhập nội dung merge commit. Lưu và đóng lại để hoàn tất.

Merge branch nội bộ thay vì remote? Dùng cùng flag:

git merge feature-branch --allow-unrelated-histories

Cách sửa 2: Rebase với lịch sử không liên quan

Muốn giữ lịch sử tuyến tính không có merge commit? Dùng rebase:

git rebase origin/main --allow-unrelated-histories

Lưu ý: rebase sẽ viết lại hash của các commit. Đừng dùng cách này trên các branch dùng chung mà đồng đội đã pull về — sẽ gây rắc rối cho tất cả mọi người.

Cách sửa 3: Tình huống "Repo local mới + Remote đã có sẵn"

Chín phần mười là tình huống này: bạn chạy git init, tạo vài commit, rồi cố pull từ GitHub repo đã được tạo kèm README hoặc LICENSE.

# Bước 1: Thêm remote (nếu chưa thêm)
git remote add origin https://github.com/username/repo.git

# Bước 2: Fetch các ref từ remote
git fetch origin

# Bước 3: Merge cho phép lịch sử không liên quan
git merge origin/main --allow-unrelated-histories

# Bước 4: Push lịch sử đã gộp lên remote
git push -u origin main

Cách sửa 4: Gộp hai repository riêng biệt lại

Muốn hợp nhất hai repo thành một — theo kiểu monorepo? Thêm repo thứ hai làm remote, pull vào, rồi dọn dẹp:

# Trong repo đích, thêm repo kia làm remote
git remote add other-repo https://github.com/username/other-repo.git
git fetch other-repo

# Merge vào
git merge other-repo/main --allow-unrelated-histories

# Xóa tham chiếu remote sau khi dùng xong
git remote remove other-repo

Chuyển các file được import vào một thư mục con ngay lập tức để giữ mọi thứ gọn gàng:

mkdir imported-project
git mv file1.txt file2.txt imported-project/
git commit -m "Move imported files into subdirectory"

Kiểm tra xem đã sửa thành công chưa

Chạy hai lệnh sau để xác nhận mọi thứ đã đúng:

# Kiểm tra merge commit xuất hiện trong log
git log --oneline --graph --all

# Xác nhận working tree sạch
git status

Log sẽ hiển thị merge commit ở đầu, kết nối cả hai lịch sử lại. Chạy git status sẽ trả về working tree sạch — hoặc chỉ hiển thị các thay đổi chưa commit mà bạn đã biết.

Push lên để xác nhận không có vấn đề gì ở upstream:

git push origin main

Phòng tránh lỗi

Nguyên nhân gốc rễ luôn giống nhau: cả hai phía đều bắt đầu với các commit độc lập riêng. Loại bỏ điều đó, và bạn sẽ không bao giờ gặp lỗi này nữa.

  • Tạo remote repo trống — trên GitHub hoặc GitLab, bỏ chọn "Initialize this repository with a README." Lần git push đầu tiên sẽ hoạt động ngay.
  • Clone trước, thêm file sau — bỏ qua git init hoàn toàn. Clone remote repo và đưa file của bạn vào thư mục đã clone.
  • Nếu bắt buộc phải init trên máy — thêm remote, fetch, và merge trước khi tạo bất kỳ commit nội bộ nào.
# Quy trình an toàn khi bắt đầu mới với remote đã có sẵn
git clone https://github.com/username/repo.git
cd repo
# Thêm các file project của bạn vào đây
git add .
git commit -m "Initial project files"
git push

Related Error Notes