Git từ chối hợp nhất lịch sử không liên quan vào rebase


2150

Trong git rebase origin/developmentthông báo lỗi sau được hiển thị từ Git:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Phiên bản Git của tôi là 2.9.0. Nó được sử dụng để hoạt động tốt trong phiên bản trước.

Làm thế nào tôi có thể tiếp tục cuộc nổi loạn này cho phép lịch sử không liên quan với cờ bắt buộc được giới thiệu trong bản phát hành mới?


12
@Shishya Với tất cả sự tôn trọng, câu trả lời được bình chọn nhiều nhất không giải quyết được câu hỏi này một cách trực tiếp. Câu hỏi đặt ra cho git-rebasetình huống trong khi câu trả lời đưa ra một lá cờ chogit-merge
Shubham Chaudhary

13
@AsifMohammed không phải là câu trả lời được chấp nhận . Mọi người sẽ tự động tìm câu trả lời có nhiều phiếu nhất vì sắp xếp mặc định theo phiếu.
Glorfindel

2
Trong trường hợp người khác mắc lỗi tương tự, tôi đã gặp lỗi này sau khi vô tình sử dụng git pull [repo URL]thay vìgit clone [repo URL]
rupten


35
Một mớ hỗn độn đã được tạo ra ở đây bởi thực tế là tiêu đề không xác định rằng đây là trong bối cảnh của một cuộc nổi loạn, vì vậy câu hỏi của bạn là trong các nhân viên Google đang nhận được lỗi này trong các bối cảnh khác nhau và đưa ra một câu trả lời không thực sự áp dụng cho câu hỏi bạn đã hỏi. Hiện tại không thể dễ dàng xóa sạch, vì vậy, cặp Hỏi & Đáp không liên tục sẽ vẫn còn trên trang web và có kết quả tìm kiếm cao trong Google mãi mãi. Đạo đức của câu chuyện là vấn đề tiêu đề!
Đánh dấu Amery

Câu trả lời:


2616

Hành vi mặc định đã thay đổi kể từ Git 2.9:

"Git merge" được sử dụng để cho phép hợp nhất hai nhánh không có cơ sở chung theo mặc định, dẫn đến một lịch sử hoàn toàn mới của một dự án hiện có được tạo ra và sau đó được kéo bởi một người bảo trì không nghi ngờ, cho phép một lịch sử song song không cần thiết được sáp nhập vào dự án hiện có . Lệnh đã được dạy không cho phép điều này theo mặc định , với --allow-unrelated-historiestùy chọn hatch hatch được sử dụng trong một sự kiện hiếm hoi hợp nhất lịch sử của hai dự án bắt đầu cuộc sống của chúng một cách độc lập.

Xem thay đổi phát hành Git để biết thêm thông tin.

Bạn có thể sử dụng --allow-unrelated-historiesđể buộc hợp nhất xảy ra.


18
Biết thay đổi hợp nhất nhưng tùy chọn này sẽ không hoạt động với rebase
Shubham Chaudhary

3
Có tùy chọn nào sẽ bật --allow-unrelated-historiesvĩnh viễn không?
jmarceli

4
@jmarceli "Vì" hợp nhất hai dự án "như vậy là một sự kiện hiếm gặp, nên một tùy chọn cấu hình để luôn cho phép hợp nhất như vậy không được thêm vào.". Vì vậy, không.
blue112

2
Tôi đã cố gắng hợp nhất một chi nhánh cho một repo khác theo cách này nhưng nó đã tạo ra một cam kết mới trên chi nhánh hiện tại của tôi và không giữ lịch sử từ các repo khác. Sau đó, tôi đã kiểm tra một chi nhánh địa phương từ repo khác và chỉ sau đó hợp nhất nó và đột nhiên một cam kết hợp nhất bình thường xuất hiện. Kỳ dị.
mgol

13
Tuyệt vời, làm việc với git pulllà tốt. Đó là trong "sự kiện hiếm hoi hợp nhất lịch sử của hai dự án bắt đầu cuộc sống của họ một cách độc lập". git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia

1189

Trong trường hợp của tôi, lỗi chỉ xảy ra fatal: refusing to merge unrelated historiestrong mỗi lần thử, đặc biệt là yêu cầu kéo đầu tiên sau khi thêm kho Git từ xa.

Sử dụng --allow-unrelated-historiescờ làm việc với yêu cầu kéo theo cách này:

git pull origin branchname --allow-unrelated-histories

231
Tôi luôn thấy lỗi này nếu khi tôi tạo một kho lưu trữ Github mới với README.md, sau đó kéo nó đến một kho lưu trữ cục bộ vào lần đầu tiên. Rất khó chịu.
Tiến Đỗ

29
Đối với repos mới, lần kéo đầu tiên, tốt hơn là bắt đầu bằng a git clone.
Ô


2
Điều này đã khiến tôi dừng lại trong vài giờ, trước khi tôi nhận ra rằng phải có một giải pháp rõ ràng cho việc hợp nhất các tệp như thế này nếu nó xảy ra đối với các tệp mặc định - Tôi rất vui vì tôi không phải là người duy nhất gặp vấn đề này ít nhất!
Zibbobz

3
Trong trường hợp của tôi, điều đó xảy ra vì tôi đã thêm tệp giấy phép tại github. Lệnh được đề cập ở trên (và bên dưới, chúng giống nhau) đã làm việc.
uyddy 16/03/19

580

Hãy thử lệnh sau:

git pull origin master --allow-unrelated-histories

Điều này sẽ giải quyết vấn đề của bạn.


265

Tôi đã gặp lỗi này khi tôi thiết lập một kho lưu trữ cục bộ đầu tiên. Sau đó, tôi đã đi đến GitHub và tạo một kho lưu trữ mới. Sau đó tôi chạy

git remote add origin <repository url>

Khi tôi cố gắng đẩy hoặc kéo, tôi cũng fatal: unrelated_historiesgặp lỗi tương tự .

Đây là cách tôi sửa nó:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master

Tôi nghĩ rằng chúng tôi đã ở trong cùng một chiếc thuyền. Để thêm một cái gì đó: Vấn đề của tôi là đã có một cái gì đó trên repo từ xa. Vì vậy, trong thư mục của tôi, nó đã xóa .gitthư mục, chạy git initvà làm những gì Adithya nói, ngoại trừ phần hợp nhất.
codepleb

1
Làm cách nào để nhấn nút INSERT trên mac? Trên thực tế, tôi phải gõ thông điệp cam kết và hợp nhất từ ​​dòng lệnh, nhưng tôi không biết làm thế nào để thực hiện nó từ dòng lệnh.
Shajeel Afzal

Nó có mở vim không? Nếu có, đó chỉ là SHIFT +:
Adithya Bhat

Ngay cả tôi đã tạo ra repo GitHub đầu tiên và đã trải qua các lệnh thêm repo đó.
Ông Suryaa Jha

1
Đây là một câu trả lời thực sự tốt. Vấn đề là bạn phải buộc kéo sau đó hợp nhất repo cục bộ và từ xa.
alanwsx


135
git pull origin <branch> --allow-unrelated-histories

Bạn sẽ được chuyển đến cửa sổ chỉnh sửa Vim:

  • Chèn thông điệp cam kết
  • Sau đó nhấn Esc(để thoát chế độ "Chèn"), sau đó :(dấu hai chấm), sau đó x("x" nhỏ) và cuối cùng nhấn Enterđể thoát khỏi Vim
  • git push --set-upstream origin <branch>

5
Ctrl + X sẽ không đưa bạn ra khỏi Vim
Ruben

nhưng :x<Enter>sẽ
webKnjaZ

101

Tôi đã từng gặp vấn đề tương tự. Thử cái này:

git pull origin master --allow-unrelated-histories 

git push origin master

47

Thử git pull --rebase development


Điều này đã giải quyết vấn đề của tôi. Đây là cách vấn đề bắt đầu
Harlan Nelson

1
Điều này có lẽ nên là:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri

3
@RiccardoMurri Vừa mới thử nó, tôi sẽ không làm điều đó một lần nữa. Repo mới của tôi có một số tệp khởi tạo mẫu trong đó và các cam kết trị giá hàng tháng của repo cục bộ của tôi. Chạy này ( newOrigin branchthay vì development) đã thêm cam kết ban đầu vào đầu chi nhánh địa phương của tôi, loại bỏ hiệu quả hầu hết mọi thứ khỏi nó. Tôi muốn cam kết ban đầu từ điều khiển mới ở phía dưới.
redOc / 1013

42

Dành cho Android Studio và IntelliJ:

Đầu tiên, cam kết mọi thứ và giải quyết bất kỳ xung đột.

Sau đó mở terminal từ bên dưới IDE và nhập:

git pull origin master --allow-unrelated-histories

Bây giờ bạn có thể đẩy.


38

CẢNH BÁO NÀY S P TIỀM NĂNG QUÁ TUYỆT VỜI

Điều này làm việc cho tôi:

git push origin master --force

1
Nhưng những gì thực sự xảy ra với các tập tin địa phương và từ xa?
Prathamesh Thêm

Theo tôi biết và có kinh nghiệm, các tệp cục bộ vẫn còn nguyên vẹn. Các tập tin từ xa mà bạn muốn thêm vào trong một thư mục cụ thể sẽ được thêm vào.
Aniket Patil

5
Đừng làm điều này! Điều này ghi đè lên tất cả các tập tin từ xa .
Finomni

Chỉ cần bao gồm từ chối trách nhiệm rằng lệnh này sẽ ghi đè tất cả các tệp trong nhánh chính . Làm việc tốt cho tôi. Cảm ơn.
Flavio

1
Nó hoạt động nhưng khá khắc nghiệt, lịch sử --allow-unrelad cụ thể và phù hợp hơn
bdulac

32

Vì tất cả các câu trả lời khác không thực sự trả lời câu hỏi, đây là một giải pháp lấy cảm hứng từ câu trả lời này cho một câu hỏi liên quan.

Vì vậy, bạn nhận được lỗi của bạn làm git rebase:

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Lỗi này không thực sự hủy bỏ rebase, nhưng bạn hiện đang ở giữa nó:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

Vì vậy, bây giờ bạn có thể làm hợp nhất bằng tay. Tìm hiểu các cam kết gốc của cam kết hợp nhất ban đầu:

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

Tìm ra cái nào trong hai cha mẹ hợp nhất là cái được hợp nhất vào cái hiện tại (có thể là cái thứ hai, xác minh với git log 222222222), sau đó thực hiện hợp nhất bằng tay, sao chép thông điệp cam kết của cam kết hợp nhất ban đầu:

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.

28

Tôi đã từng gặp vấn đề tương tự. Vấn đề là từ xa đã có một cái gì đó ngăn chặn điều này.

Lần đầu tiên tôi tạo ra một kho lưu trữ cục bộ. Tôi đã thêm một LICENSEREADME.mdtập tin vào địa phương của tôi và cam kết.

Sau đó, tôi muốn có một kho lưu trữ từ xa vì vậy tôi đã tạo một kho lưu trữ trên GitHub. Ở đây tôi đã mắc lỗi khi kiểm tra "Khởi tạo kho lưu trữ này bằng README" , điều này cũng tạo ra README.md trong điều khiển từ xa.

Vì vậy, bây giờ khi tôi chạy

git push --set-upstream origin master

Tôi đã nhận:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.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.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Bây giờ để khắc phục điều này tôi đã làm

git pull origin master

Điều này dẫn đến lỗi dưới đây:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

Tôi đã thử:

git pull origin master --allow-unrelated-histories

Kết quả:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

Giải pháp:

Tôi đã xóa kho lưu trữ từ xa và tạo một tệp mới (tôi nghĩ rằng chỉ xóa tệp mới READMEcó thể hoạt động được) và sau đó, phần dưới đây đã hoạt động:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master

25
tạo một kho lưu trữ mới không phải là một giải pháp
Zach

3
git pull master master --allow-không liên quan đến lịch sử làm việc cho tôi .. Cảm ơn
SKalariya

git push --force ... sẽ là một giải pháp thích hợp ở bước 1 trong trường hợp cụ thể này
Konstantin Pelepelin

2
Đây không phải là một giải pháp. Nếu bạn là người mới bắt đầu, thì bạn có thể làm điều đó, nhưng nếu bạn đang làm việc với một số dự án thực tế, bạn nên phải đối phó với cách thức phù hợp.
Prathamesh Thêm

27

Điều này thường xảy ra khi bạn cam kết lần đầu tiên vào kho lưu trữ từ xa. Vì lỗi rõ ràng là "từ chối hợp nhất các lịch sử không liên quan", chúng ta cần sử dụng cờ --allow-không liên quan đến lịch sử.

git pull origin master  --allow-unrelated-histories

Bây giờ sẽ có một số xung đột mà chúng ta phải giải quyết bằng tay. Sau đó chỉ cần cam kết mã và đẩy nó.


Như đã đề cập trong câu hỏi, tôi đang cố gắng thực hiện git-rebase và không phải là git-pull, git-rebase không có --allow-unrelated-historiescờ.
Shubham Chaudhary

24

Hai khả năng khi điều này có thể xảy ra -

  1. Bạn đã nhân bản một dự án và, bằng cách nào đó, thư mục .git đã bị xóa hoặc bị hỏng. Điều này dẫn đến Git không biết về lịch sử địa phương của bạn và do đó, sẽ khiến nó gây ra lỗi này khi bạn cố gắng đẩy hoặc kéo từ kho lưu trữ từ xa.

  2. Bạn đã tạo một kho lưu trữ mới, thêm một vài cam kết vào nó và bây giờ bạn đang cố gắng lấy từ một kho lưu trữ từ xa đã có một số cam kết của riêng nó. Git cũng sẽ đưa ra lỗi trong trường hợp này, vì nó không biết hai dự án có liên quan như thế nào.

GIẢI PHÁP

git pull master master --allow-không liên quan-lịch sử

Tham khảo - https://www.educative.io/edpresso/the-firth-refuses-to-merge-unrelated-histories-git-error


12

Tôi đã vật lộn với điều này là tốt, nhưng tôi đã tìm được cách giải quyết.

Khi bạn gặp phải lỗi ở trên, chỉ cần chọn cherry xác nhận hợp nhất và sau đó tiếp tục rebase:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue

3
Trong máy bay tiếng anh xin vui lòng?
Đặc vụ Zebra

@AgentZebra Đối với bất kỳ đĩa nào trong mặt phẳng phức, tích phân đường dẫn đóng liên tục là 0.
Addem

12

Trước tiên, kéo các thay đổi từ xa đến địa phương của bạn bằng cách sử dụng lệnh sau:

git pull origin branchname --allow-unrelated-histories

** tên nhánh là chủ trong trường hợp của tôi.

Khi lệnh kéo thực hiện, xung đột xảy ra. Bạn nên giải quyết các xung đột. Tôi sử dụng Android Studio để giải quyết xung đột. nhập mô tả hình ảnh ở đây

Khi xung đột được giải quyết, hợp nhất là xong!

Bây giờ bạn có thể đẩy một cách an toàn.


Tôi đã tìm kiếm nút Resolve Conflicttrong AS. Đôi khi cửa sổ bật lên / ballon dưới cùng bên phải biến mất và tôi không thể làm gì. Cảm ơn @oiyio
mochadwi


7

Khi thực hiện git pull, tôi nhận được thông báo này fatal: refusing to merge unrelated histories cho một mô-đun repo nơi tôi đã không cập nhật bản sao cục bộ trong một thời gian.

Tôi chạy lệnh này chỉ để làm mới địa phương từ nguồn gốc. Tôi chỉ muốn mới nhất từ ​​xa và không cần bất kỳ thay đổi cục bộ nào.

git reset --hard origin/master

Điều này đã sửa nó trong trường hợp của tôi.


12
CẢNH BÁO: Điều này đã xóa TẤT CẢ các tập tin của tôi. Hãy cẩn thận nếu bạn không biết những gì bạn đang làm!
Salvi Pascual

2
Điều này sẽ xóa tất cả các thay đổi đang chờ xử lý!
Orestis P.


1

Tôi đang sử dụng rebase trong nhiều năm và tôi chưa bao giờ gặp phải vấn đề như vậy. Tuy nhiên, vấn đề đầu tiên của bạn là, bạn cố gắng thực hiện nó trực tiếp trên nhánh developmenttừ xa từ kho lưu trữ từ xa, được gọi origin. Điều đó đúng theo nghĩa đen bởi vì rebase là một lệnh nguy hiểm, tái cấu trúc lịch sử git. Đã nói rằng, trước tiên bạn nên thử trên kho lưu trữ cục bộ của bạn và chỉ đẩy nó, nếu nó hoạt động cho bạn như mong đợi.

Vì vậy, quy trình làm việc rebase thông thường của tôi trông giống như sau (nhưng xin lưu ý rằng bạn không nên sử dụng rebase trên các chi nhánh, mà bạn không phải là một ủy ban duy nhất.

  1. đảm bảo bạn có một cây làm việc sạch sẽ (không có thay đổi không phổ biến)
  2. kiểm tra chi nhánh bạn muốn khởi động lại (ví dụ: giả sử nó là masterlệnh một dòng):git checkout master && git pull origin master && git checkout development
  3. Thực hiện rebase thực tế: git rebase master
  4. Nếu nó được thực hiện và mọi thứ hoạt động như mong đợi, đẩy nó vào điều khiển từ xa của bạn. Để làm như vậy, bạn cần buộc nó, bởi vì máy chủ từ xa đã có lịch sử theo thứ tự khác, điều khiển từ xa sẽ trả lời mà không có gì để đẩy. Vì vậy, chúng ta cần nói "phiên bản lịch sử địa phương của tôi là chính xác, ghi đè lên mọi thứ trên nhánh từ xa đó bằng phiên bản lịch sử địa phương của tôi":git push -f origin development

Như tôi đã đề cập, hãy nhớ rằng, cuộc nổi loạn đó thao túng lịch sử git, đó thường là một điều xấu. Tuy nhiên, có thể làm điều đó trên các chi nhánh, nơi không có ai cam kết. Để giữ chi nhánh có thể kéo cho các nhà phát triển khác, hãy sử dụng một chiến lược hợp nhất khác như hợp nhất chính nó, squash hoặc cherrypick. Vì vậy, nói cách khác: Rebase không nên là công cụ của bạn trong phát triển phân tán. Nó hoạt động tốt cho bạn nếu bạn là người duy nhất làm việc trên kho lưu trữ này.

Chúng tôi sử dụng chiến lược chi nhánh tính năng. Trong phần này, tôi thường sử dụng rebase để nhận "bản cập nhật" từ các nhà phát triển khác, điều đó đã xảy ra trong thời gian đó trên nhánh chính. Làm như vậy, nó làm giảm kích thước của các xác nhận có thể nhìn thấy trong yêu cầu kéo. Do đó, nó giúp người đánh giá mã dễ dàng thấy các thay đổi của tôi được thực hiện trong nhánh tính năng này.


Trong trường hợp này, tôi thực sự muốn tiếp tục với rebase và câu trả lời không giải quyết được điều đó. Tôi biết những rủi ro của việc nổi loạn và khi nào tôi không nên sử dụng git-rebase. Đây là một hướng dẫn chung (có ý kiến) cho quy trình công việc git và không trả lời trực tiếp câu hỏi. Theo như sử dụng rebase trong nhiều năm, lỗi cụ thể này đã được thêm vào v2.9.0 của git và luồng được sử dụng để hoạt động tốt trước khi phát hành. Những gì bạn đã đăng trong câu trả lời này ở đây đã được trả lời trong các câu hỏi cũ hơn nhiều như stackoverflow.com/a/11566503/2670370git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.