Git은 관련이없는 이력을 rebase에 병합하지 않습니다.


2144

동안 git rebase origin/development다음과 같은 오류 메시지가 힘내에서 표시됩니다 :

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

내 힘내 버전은 2.9.0입니다. 이전 버전에서는 정상적으로 작동했습니다.

새 릴리스에 도입 된 강제 플래그를 사용하여 관련이없는 기록을 허용하는이 리베이스를 어떻게 계속할 수 있습니까?


12
@Shishya 모든 투표에서 가장 많이 투표 된 답변은이 질문을 직접적인 방식으로 해결하지 못합니다. git-rebase답변에 대한 플래그를 제공하는 동안 질문이 상황을 묻습니다git-merge
Shubham Chaudhary

13
@AsifMohammed 그건 받아 들일 만한 대답 이 아닙니다 . 투표별로 기본 정렬되어 있기 때문에 사람들은 가장 많은 표를 얻은 답변을 자동으로 찾습니다.
Glorfindel

2
다른 사람이 같은 실수를 한 경우 실수로 git pull [repo URL]대신 사용하여이 오류가 발생했습니다.git clone [repo URL]
rsoren


35
제목 에 이것이 rebase의 맥락에 있다고 명시하지 않았기 때문에 여기에서 엉망이되었습니다 . 따라서 다른 맥락 에서이 오류가 발생하고 실제로는 그렇지 않은 답변을 반대하는 Google 직원에게 귀하의 질문이 그려지고 있습니다. 요청한 질문에 적용하십시오. 현재 쉽게 정리할 수 없으므로 불일치 한 Q & A 쌍이 사이트에 계속 남아 있고 Google 검색 결과에서 영원히 높아질 것입니다. 이야기의 교훈은 질문 제목이 중요하다는 것입니다!
Mark Amery

답변:


2613

Git 2.9 이후 기본 동작이 변경되었습니다.

"git merge"는 기본적으로 공통 기반이없는 두 개의 브랜치를 병합하는 데 사용되었으며, 기존 프로젝트의 새로운 히스토리를 생성 한 후 의심받지 않는 관리자가 가져 와서 불필요한 병렬 히스토리를 기존 프로젝트에 병합했습니다. . 이 명령은 기본적으로이 기능을 허용하지 말고 , 탈출구 --allow-unrelated-histories옵션을 사용하여 삶을 독립적으로 시작한 두 프로젝트의 기록을 병합하는 드문 경우에 사용하도록 지시했습니다.

자세한 내용은 Git 릴리스 변경 로그 를 참조하십시오.

--allow-unrelated-histories병합을 강제로 수행하는 데 사용할 수 있습니다 .


18
병합 변화를 알고 있지만이 옵션은 REBASE 작동하지 않습니다
하기 Shubham Chaudhary에게

3
--allow-unrelated-histories영구적으로 켜지는 옵션이 있습니까?
jmarceli

4
@jmarceli "이러한"두 개의 프로젝트 병합 "은 드문 경우이므로 항상 이러한 병합을 허용하는 구성 옵션이 추가되지 않습니다." 그래서 아니야.
blue112

2
이 방법으로 다른 리포지토리의 브랜치를 병합하려고 시도했지만 현재 브랜치에서 새로운 커밋을 만들었고 다른 리포지토리에서 기록을 유지하지 않았습니다. 그런 다음 다른 리포지토리에서 로컬 지점을 체크 아웃 한 다음 병합하여 갑자기 정상적인 병합 커밋이 나타났습니다. 기묘한.
mgol

13
훌륭 git pull합니다. "독립적으로 삶을 시작한 두 프로젝트의 역사를 합친 희귀 이벤트"였습니다. git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia

1188

필자의 경우 오류는 fatal: refusing to merge unrelated histories모든 시도, 특히 Git 저장소를 원격으로 추가 한 후 첫 번째 풀 요청에서 발생했습니다.

--allow-unrelated-histories이 방법으로 플래그를 사용하여 풀 요청을 수행했습니다.

git pull origin branchname --allow-unrelated-histories

231
README.md를 사용하여 새 Github 리포지토리를 생성 한 다음 처음으로 로컬 리포지토리로 가져 오면 항상이 오류가 표시됩니다. 너무 짜증나.
Tien Do

29
새로운 리포지토리의 경우 먼저 잡아 당기면 일반적으로로 시작하는 것이 git clone좋습니다.
우산


2
나는 "적어도 유일한했다 하나이 문제 기쁜 I하고 있지 않다 해요 - 내가 실현하기 전에 기본 파일 발생하면 다음과 같은 파일을 병합에 대한 명백한 해상도가있을 한, 몇 시간 동안 저를 중단!
Zibbobz

3
제 경우에는 github에 라이센스 파일을 추가했기 때문에 발생했습니다. 위에서 언급 한 명령은 동일합니다.
uudaddy


264

로컬 저장소를 먼저 설정할 때이 오류가 발생했습니다. 그런 다음 GitHub에 가서 새로운 저장소를 만들었습니다. 그런 다음 나는 달렸다

git remote add origin <repository url>

밀거나 당기려고 할 때 fatal: unrelated_histories마다 매번 같은 오류가 발생했습니다.

내가 고 쳤던 방법은 다음과 같습니다.

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

우리는 같은 배에 있다고 생각합니다. 무언가를 추가하려면 : 내 문제는 이미 원격 저장소에 무언가가 있다는 것입니다. 그래서 내 폴더에서 폴더를 삭제 하고 병합 부분을 제외하고 Adithya가 말한 것을 .git실행했습니다 git init.
codepleb

1
Mac에서 INSERT 버튼을 누르는 방법은 무엇입니까? 실제로 커밋 메시지를 입력하고 명령 줄에서 병합해야하지만 명령 줄에서 수행하는 방법을 모르겠습니다.
Shajeel Afzal

Vim을 열 수 있습니까? 만약 그렇다면, 그것은 단지 SHIFT + :
Adithya Bhat

심지어 GitHub 리포지토리를 먼저 만들었으며 리포지토리 추가 명령을 수행했습니다.
Mr. Suryaa Jha

1
이것은 정말 좋은 대답입니다. 요점은 로컬 및 원격 저장소를 강제로 당겨서 병합해야한다는 것입니다.
alanwsx

151

이를 위해 다음 명령을 입력하십시오.

git pull origin branchname --allow-unrelated-histories

예를 들어

git pull origin master --allow-unrelated-histories

참고:

GitHub 관련이없는 내역 문제


처음으로 감사 나 "자식 끌어 오기 원산지 마스터 --allow-관련이없는-역사"에 대한 자사의 작품을 당겨
Ankitkumar Makwana

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

Vim 편집 창으로 라우팅됩니다 :

  • 커밋 메시지 삽입
  • 그런 다음 Esc( "삽입"모드를 종료하려면), :(콜론), x(작은 "x") Enter를 차례로 눌러 Vim에서 나오십시오.
  • git push --set-upstream origin <branch>

5
Ctrl + X는 Vim에서 나오지 않습니다
Ruben

하지만 :x<Enter>의지
webKnjaZ

101

나는 같은 문제가 있었다. 이 시도:

git pull origin master --allow-unrelated-histories 

git push origin master

47

시험 git pull --rebase development


이것은 내 문제를 해결했습니다. 여기에 문제가 어떻게 시작입니다
할란 넬슨

1
이것은 아마도해야합니다 :git pull --rebase=preserve --allow-unrelated-histories development
리카르도 Murri 지역을

3
@RiccardoMurri 방금 시도했지만 다시는 그렇게하지 않을 것입니다. 내 새로운 저장소에는 샘플 초기화 파일이 있었고 로컬 저장소에는 몇 달 동안 커밋했습니다. 이것을 (가 newOrigin branch아니라 development) 실행 하면 초기 커밋이 로컬 분기의 상단에 추가되어 거의 모든 것을 효과적으로 제거했습니다. 새 리모컨의 초기 커밋이 맨 아래에 있기를 원했습니다.
redOctober13

41

Android Studio 및 IntelliJ의 경우 :

먼저 모든 것을 커밋 하고 충돌을 해결하십시오.

그런 다음 IDE 아래에서 터미널을 열고 다음을 입력하십시오.

git pull origin master --allow-unrelated-histories

이제 밀 수 있습니다.


38

경고 이것은 잠재적으로 원격 저장소를 덮어 씁니다.

이것은 나를 위해 일했다 :

git push origin master --force

1
그러나 실제로 로컬 및 원격 파일은 어떻게됩니까?
Prathamesh 더

내가 알고 경험 한대로 로컬 파일은 손상되지 않았습니다. 특정 폴더에 추가하려는 원격 파일이 추가됩니다.
Aniket Patil 2018 년


이 명령이 마스터 브랜치의 모든 파일을 무시 한다는 면책 조항 만 포함하십시오 . 나를 위해 일했다. 감사.
Flavio

1
그것은 작동하지만 다소 가혹합니다.-허용되지 않는 역사는 더 구체적이고 적절합니다
bdulac

32

다른 모든 답변은 실제로 질문에 답변하지 않으므로 다음은 관련 질문에 대한 답변 에서 영감을 얻은 솔루션 입니다.

따라서 오류가 발생합니다 git rebase.

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

이 오류는 실제로 리베이스를 취소하지 않지만 이제는 중간에 있습니다.

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

이제 손으로 병합을 수행 할 수 있습니다. 원래 병합 커밋의 부모 커밋을 찾으십시오.

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

    test merge commit

두 개의 병합 부모 중 현재 부모로 병합 된 부모를 찾으십시오 (아마 두 번째 부모로 확인하십시오 git log 222222222). 그런 다음 원래 병합 커밋의 커밋 메시지를 복사하여 직접 병합하십시오.

$ 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

나는 같은 문제가 있었다. 문제는 원격으로 인해 이것을 막는 것입니다.

먼저 로컬 리포지토리를 만들었습니다. 나는 추가 LICENSE하고 README.md내 로컬과 헌신에 파일을.

그런 다음 원격 저장소를 원했기 때문에 GitHub에서 원격 저장소를 만들었습니다. 여기서는 "README를 사용하여이 저장소를 초기화합니다"를 확인하는 실수를 저질렀 습니다.

그래서 지금 내가 달렸을 때

git push --set-upstream origin master

나는 얻었다 :

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.

이제 이걸 극복하기 위해

git pull origin master

아래 오류가 발생했습니다.

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

나는 시도했다 :

git pull origin master --allow-unrelated-histories

결과:

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.

해결책:

원격 저장소를 제거하고 새 파일을 만들었습니다 (파일을 제거하는 README것이 효과가 있다고 생각합니다 ). 그 후 아래가 작동했습니다.

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

25
새로운 저장소를 만드는 것은 해결책이 아닙니다
Zach

3
자식 끌어 오기 원산지 마스터 --allow-관련이없는-역사는 .. 나를 위해 감사 일
SKalariya

git push --force ... 이 특별한 경우에 1 단계에서 적절한 해결책이 될 것입니다
Konstantin Pelepelin

2
이것은 해결책이 아닙니다. 초보자라면 그렇게 할 수 있지만 실제 프로젝트로 작업하는 경우 적절한 방법을 사용해야합니다.
Prathamesh 더 많은

27

일반적으로 원격 저장소에 처음 커밋 할 때 발생합니다. 오류에 "관련이없는 기록을 병합하지 않음"이 명확하게 표시되어 있으므로 --allow-unrelated-histories 플래그를 사용해야합니다.

git pull origin master  --allow-unrelated-histories

이제 수동으로 해결해야 할 충돌이 있습니다. 그런 다음 코드를 커밋하고 푸시하십시오.


질문에서 언급했듯이 git-rebase가 아닌 git-rebase를 수행하려고하는데 git-rebase에는 --allow-unrelated-histories플래그 가 없습니다 .
Shubham Chaudhary

24

이것이 일어날 수있는 두 가지 가능성-

  1. 프로젝트를 복제했으며 어떻게 든 .git 디렉토리가 삭제되었거나 손상되었습니다. 이로 인해 Git은 로컬 히스토리를 인식하지 못하므로 원격 저장소로 밀거나 가져 오려고 할 때이 오류가 발생합니다.

  2. 새 저장소를 작성하고 여기에 몇 가지 커밋을 추가했으며, 이미 자체 커밋이있는 원격 저장소에서 가져 오려고합니다. 이 경우 Git은 두 프로젝트가 어떻게 관련되어 있는지 알 수 없으므로 오류를 발생시킵니다.

해결책

git pull origin master-관련이없는 기록 허용

참조-https: //www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error


12

나는 이것으로도 어려움을 겪었지만 해결 방법을 찾았습니다.

위의 오류가 발생하면 병합 커밋을 체리 선택하고 리베이스를 계속하십시오.

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

3
비행기 영어로 제발?
에이전트 Zebra

@AgentZebra 복잡한 평면의 모든 디스크에서 연속 폐쇄 경로 적분은 0입니다.
Addem

12

먼저 다음 명령을 사용하여 원격 변경 사항을 로컬로 가져옵니다.

git pull origin branchname --allow-unrelated-histories

** 내 경우에는 branchname이 마스터입니다.

pull 명령이 완료되면 충돌이 발생합니다. 갈등을 해결해야합니다. 충돌을 해결하기 위해 Android Studio를 사용합니다. 여기에 이미지 설명을 입력하십시오

충돌이 해결되면 병합이 완료됩니다!

이제 안전하게 밀 수 있습니다.


Resolve ConflictAS 에서 버튼을 검색했습니다 . 때때로 오른쪽 하단 팝업 / 풍선이 사라지고 아무 것도 할 수 없습니다. 감사합니다 @oiyio
mochadwi


7

을 할 git pull때이 메시지를 받았습니다fatal: refusing to merge unrelated histories 로컬 복사본을 한동안 업데이트하지 않은 repo 모듈에 대한 가 나타납니다.

이 명령을 실행하여 로컬에서 로컬을 새로 고칩니다. 방금 리모컨에서 최신을 원했고 로컬 변경이 필요하지 않았습니다.

git reset --hard origin/master

이것은 내 경우에 그것을 고쳤다.


12
경고 : 파일이 모두 삭제되었습니다. 하고있는 일을 모르는 경우주의하십시오!
Salvi Pascual

2
보류중인 모든 변경 사항이 삭제됩니다!
Orestis P.

1

나는 몇 년 동안 rebase를 사용하고 있으며 그런 문제가 발생하지 않았습니다. 그러나 첫 번째 문제는 development이라는 원격 저장소 의 원격 지점 에서 직접 수행하려고한다는 것 origin입니다. rebase가 위험한 명령이기 때문에 문자 그대로 잘못되어 git 기록을 재구성합니다. 말했듯이, 먼저 로컬 저장소에서 시도하고 예상대로 작동하는 경우에만 밀어 넣으십시오.

따라서 일반적인 리베이스 워크 플로는 다음과 같습니다 (단, 하나의위원회가 아닌 브랜치에서 리베이스를 사용해서는 안됨을 명심하십시오). 이러한 브랜치의 경우 해당되는 경우 단순히 병합을 사용하여 충돌을 해결하십시오.

  1. 깨끗한 작업 트리가 있는지 확인하십시오 (커밋하지 않은 변경 사항 없음)
  2. 리베이스하려는 지점으로 체크 아웃하십시오 (예를 들어, master한 줄 명령으로; 라고 가정하십시오 ).git checkout master && git pull origin master && git checkout development
  3. 실제 리베이스를 수행하십시오. git rebase master
  4. 완료되고 모든 것이 예상대로 작동하면 리모컨으로 밉니다. 원격 호스트는 이미 다른 순서로 히스토리를 가지고 있기 때문에 원격으로 푸시 할 응답이 없습니다. 따라서 "내 로컬 버전의 히스토리가 정확합니다. 로컬 버전의 히스토리를 사용하여 해당 원격 브랜치의 모든 것을 덮어 쓰십시오"라고 말해야합니다.git push -f origin development

내가 이미 언급했듯이 rebase는 git history를 조작한다는 것을 명심하십시오. 보통 나쁜 일입니다. 그러나 아무도 약속하지 않는 지점에서 그렇게 할 수 있습니다. 다른 개발자가 분기를 풀링 할 수있게하려면 병합 자체, 스쿼시 또는 체리 픽과 같은 다른 병합 전략을 사용하십시오. 다시 말해, Rebase가 분산 개발 도구가되어서는 안됩니다. 이 저장소에서 일하는 유일한 사람이라면 잘 작동합니다.

기능 분기 전략을 사용합니다. 여기서는 보통 다른 개발자들로부터 "업데이트"를 얻기 위해 리베이스를 사용합니다. 그 동안 마스터 브랜치에서 발생했습니다. 이렇게하면 끌어 오기 요청에 표시되는 커밋 크기가 줄어 듭니다. 따라서 코드 검토자가이 기능 분기에서 변경 한 내용을보다 쉽게 ​​볼 수 있습니다.


이 경우 실제로 리베이스를 계속하고 싶었지만 대답이 해결되지 않았습니다. 나는 rebasing의 위험과 git-rebase를 사용하지 않아야 할 때를 알고 있습니다. 이것은 git 워크 플로에 대한 일반적인 지침으로, 질문에 직접 대답하지는 않습니다. 몇 년 동안 rebase를 사용하는 한이 특정 오류는 git v2.9.0에서 추가되었으며 흐름은 해당 릴리스 이전에 정상적으로 작동하는 데 사용되었습니다. 당신이 여기이 답변에 게시 한 것은 같은 훨씬 나이 질문에 이미 답한다 stackoverflow.com/a/11566503/2670370git-scm.com/book/en/v2/Git-Branching-Rebasing
하기 Shubham Chaudhary

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.