힘내와 "지점 'x'가 완전히 병합되지 않았습니다"오류


294

마스터 브랜치에서 사용한 명령은 다음과 같습니다.

git branch experiment
git checkout experiment

그런 다음 파일을 변경하고 변경 사항을 커밋하고 새 지점을 GitHub로 푸시했습니다.

git commit . -m 'changed files'
git push -u origin experiment

나중에 실험 브랜치를 마스터 브랜치로 병합하기로 결정했습니다.

git checkout master
git merge experiment

마지막으로 변경 사항을 GitHub로 푸시했습니다.

git push -u origin master

를 사용하여 실험 분기를 삭제하려고 할 때까지 모두 잘 진행되었습니다.

git branch -d experiment

error: The branch 'experiment' is not fully merged.git에 익숙하지 않은 오류 메시지가 표시 되어 두 분기를 병합 할 수있는 정도를 모릅니다. 내가 여기서 무엇을 놓치고 있습니까?


2
이 게시물이 도움이 되나요? stackoverflow.com/questions/1710894/…
Chrisdigital

2
내가 한 때 가끔 나타납니다git commit --amend
Arcolye

12
또한-이 메시지는 다음에 나타날 것입니다 squash: stackoverflow.com/q/41946475/109941
Jim G.

가장 일반적인 시나리오는 분기를 로컬로 삭제하기 전에 새로 병합 된 변경 사항을 가져와야한다는 것입니다.
RaisinBranCrunch

답변:


313

참고 문구에 대한 응답으로 문구가 변경되었습니다. Thanks @slekse
오류가 아닙니다. 경고입니다. 삭제하려는 브랜치에 업스트림 브랜치 또는 HEAD (현재 체크 아웃 된 개정판)에서 도달 할 수없는 커밋이 포함되어 있음을 의미합니다. 즉, 커밋을 잃을 수있는 경우 ¹.

실제로 이것은 아마도 커밋을 수정, 재 기반 또는 필터링했으며 일치 하지 않는 같습니다.

따라서 다른 분기를 삭제하여 참조 해제 에 대한 커밋이 포함 된 분기를 체크 아웃 하면 경고피할 수 있습니다 .²

실제로 중요한 커밋이 누락되지 않았는지 확인하고 싶을 것입니다.

git log --graph --left-right --cherry-pick --oneline master...experiment

그러면 브랜치 사이의 비공유 목록이 표시됩니다. 궁금한 점이 없으면 --cherry-pick차이가있을 수 있으며이 차이는 경고의 원인 일 수 있습니다.

--cherry-pick

커밋 세트가 대칭 차이로 제한되는 경우 "다른 쪽"에서 다른 커밋과 동일한 변경을 일으키는 커밋은 생략하십시오. 예를 들어, A와 B라는 두 개의 분기가있는 경우 해당 옵션의 설명에있는 위의 예와 같이 한쪽에 만 모든 커밋을 나열하는 일반적인 방법은 --left-right입니다. 그러나 다른 브랜치에서 체리 피킹 된 커밋을 보여줍니다 (예 : "b의 3rd"는 브랜치 A에서 체리 피킹 될 수 있음). 이 옵션을 사용하면 이러한 커밋 쌍이 출력에서 ​​제외됩니다.


¹ 기본적으로 시간이 지나면 실제로 가비지 수집 만됩니다. 또한이 git-branch명령은 모든 분기 의 개정 트리를 검사하지 않습니다 . 경고는 명백한 실수를 피하기 위해 존재합니다.

² (여기서 선호하는 것은 삭제를 강제하는 것이지만 추가 보장을 원할 수도 있습니다).


24
감사. 핵심 문구는 "다른 심판장이 접근 할 수없는 커밋을 포함한다"는 것이었다. 더 이상 실험 브랜치가 필요없고 이미 마스터로 병합하고 원점에서 삭제하려고 계획했지만 git은 실험 변경 사항을 원점으로 푸시 할 때까지 행복하지 않았습니다. 이 경고는 일종의 온전한 점검이었다고 생각합니다.
mellowsoon

35
-1 "삭제하려는 브랜치에 다른 참조 헤드에서 도달 할 수없는 커밋이 포함되어 있음을 의미합니다." 이것은 정확하지 않습니다. 경고는 지점이 업스트림 (있는 경우) 또는 현재 HEAD에서 분기에 도달 할 수 없음을 의미합니다. git-branch의 맨 페이지를 참조하십시오.
sleske

3
@TachyonVortex 니스 링크. git branch -vv 명령은 실제로 나에게 무슨 일이 일어나고 있는지 분명히했습니다.
Jason Massey

11
@sleske 의견에 감사드립니다-이 답변은 실제로 편집해야합니다. 주요 설명문이 잘못되어 높은 평가를받는 것은 부끄러운 일입니다. 방금이 문제가 있었고 문제가 무엇인지 알아 내려고 귀찮게 오랜 시간을 보냈으며 원격 추적 분기가 풀 요청의 일부로 삭제되었고 마스터에서 변경 사항을 가져온 후 시간이 지났습니다. 현지 지점에서. 유일한 '문제'는 삭제 된 원격 추적 분기를 찾지 못했습니다 (그리고 같은 이유로 로컬 분기를 삭제하려고했습니다).
ely

3
예, 지점을 만들 때와 다른 지점에있는 경우 로컬 지점을 삭제하려고 할 때만 발생할 수 있습니다. "다른 심판들에게 다가 갈 수없는 커밋"은 틀렸고 불필요하게 무섭다!
Amalgovinus

80

Drew Taylor가 지적했듯이 -d를 사용한 브랜치 삭제 는 브랜치가 "완전히 병합되었는지"를 판단 할 때 현재 HEAD 만 고려합니다 . 지점 다른 지점과 병합 되더라도 불평 합니다. 오류 메시지는 이와 관련하여 분명히 명확해질 수 있습니다 ... 삭제하기 전에 병합 된 분기를 체크 아웃하거나 git branch -D를 사용할 수 있습니다. 대문자 -D는 수표를 완전히 무시합니다.


2
현재 HEAD에 대한 부분이 나를 위해 수정했습니다. 내 주인은 내가 충돌하는 지점을 만든 기능 지점과 다릅니다 : D
viki.omega9

1
자식을 배우는 사람에게 "현재"라는 단어가 "HEAD"와 중복되는 것 같습니까? 현재 HEAD와 같은 것은 없습니다 . 정의 의한 HEAD 는 현재 분기입니다. 뭔가 빠졌습니까? "현재 분기"또는 "HEAD"라고 말할 수 있지만 "현재 HEAD"는 말할 수 없습니다.
Mark Lakata

이것을 변경 / 구성 할 수있는 방법이 있습니까 (예 : 항상 확인 origin/master합니까?) origin/master먼저 체크 아웃하는 것이 너무 번거롭지 않지만 이상한 흐름처럼 느껴집니다. 왜 origin/master로컬 에서 체크 아웃해야합니까? 내 변경 사항이 여기에 병합되었는지 확인하기 위해?
Alec

15

나는 sehe의 대답을 시도했지만 작동하지 않았습니다.

병합되지 않은 커밋을 찾으려면 다음을 사용하십시오.

git log feature-branch ^master --no-merges

14

첫 번째 기능 지점을 다시 마스터로 병합하면서 오늘이 일이 발생했습니다. 일부가 SO의 다른 스레드에서 말했듯이 분기를 삭제하려고 시도하기 전에 트릭이 마스터로 다시 전환되었습니다. 다시 마스터로 돌아 왔을 때 git은 경고없이 분기를 삭제하게되어 기뻤습니다.


7
이것이 특정 문제인 것처럼 보이지 않지만 지금 설명하는 문제에 부딪 쳤으므로 감사합니다!
Daniel Buckmaster

4

힘내는이 지점을 삭제하여 기록을 잃을 수 있음을 경고합니다. 실제로 커밋을 즉시 삭제하지는 않지만 브랜치의 커밋 중 일부 또는 전부가 다른 브랜치에도 속하지 않으면 도달 할 수 없게됩니다.

브랜치 experiment를 다른 브랜치로 "완전히 병합"하려면 해당 팁 커밋이 다른 브랜치 팁의 조상이어야하며 커밋을 다른 브랜치의 experiment하위 집합으로 만들어야합니다 . experiment모든 커밋이 다른 분기를 통해 리포지토리 기록의 일부로 남아 있기 때문에 삭제하는 것이 안전합니다 . 이미 여러 번 병합되었을 수 있기 때문에“완전히”병합되어야하지만 다른 분기에 포함되지 않은 마지막 병합 이후 커밋이 추가되었습니다.

Git은 저장소의 다른 모든 분기를 검사하지는 않습니다. 단지 두 :

  1. 현재 지점 (HEAD)
  2. 업스트림 지점 (있는 경우)

experiment귀하의 경우와 같이 "업스트림 지점" 은 아마도입니다 origin/experiment. experiment현재 지점에 완전히 병합 된 경우 Git은 불만없이 삭제합니다. 그렇지 않지만 업스트림 브랜치에 완전히 병합되면 Git은 다음과 같은 경고로 진행됩니다.

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

어디 xxxxxxxxA가 ID를 커밋을 나타냅니다. 업스트림에 완전히 병합되면 커밋 experiment이 원본 리포지토리로 푸시되었으므로 여기서 커밋 을하더라도 적어도 다른 곳에 저장 될 수 있습니다.

Git은 다른 브랜치를 확인하지 않기 때문에 브랜치가 다른 브랜치와 완전히 통합되어 있다는 것을 알고 있기 때문에 브랜치를 삭제하는 것이 안전 할 수 있습니다. -D표시된 옵션을 사용 하여이 작업을 수행 하거나 먼저 해당 지점으로 전환하여 Git이 완전히 병합 된 상태를 확인하도록하십시오.


1
키가 " 현재 분기 에 완전히 병합되었습니다 ". X의 지점 X '가 X로 완전히 병합되어 이미 origin / X'를 삭제했습니다. 그러나 Y가 체크 아웃되면이 경고가 나타납니다. 내가 XI를 체크 아웃했을 때 X '를 삭제할 수있었습니다. 오히려 바보 같아요.
Lawrence Dol

2
이 답변은 여기에 기여없이 표절로 표시됩니다. chimera.labs.oreilly.com/books/1230000000561/…
Mark Lakata

3

병합되지 않은 변경 사항을 확인하려면 다음을 수행하십시오.

git checkout experiment
git merge --no-commit master

git diff --cached

참고 : master에없는 변경 사항이 표시됩니다 experiment.

다음을 잊지 마십시오 :

git merge --abort

당신이보고 완료되면.


@IgorGanapolsky Dunno는 정확하지만 일반적으로 man git-resetgit reset 명령은 상태 문제를 복구하기에 충분합니다.
ThorSummoner

3

설명이있는 가장 쉬운 솔루션 (이중 확인 된 솔루션) (이전에 문제가 발생 함)

문제는 :

1- 지점을 삭제할 수 없습니다

2- 터미널은 아직 승인되지 않은 커밋이 있다는 경고 메시지를 표시합니다.

3- 마스터와 지사를 확인했는데 모두 동일하다는 것을 알고 있습니다 (최신)

해결책:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

설명:

브랜치가 업스트림 원격 브랜치 (Github, 비트 버킷 또는 기타)에 연결된 경우이를 마스터로 병합 (푸시)해야하며 새로운 변경 사항 (커밋)을 원격 리포지토리 (Github, 비트 버킷 또는 지점에서)

내 코드에서 내가 한 일은 master로 전환 한 다음 분기를 병합하여 로컬 컴퓨터에서 동일하게 유지 한 다음 분기로 다시 전환하고 업데이트 또는 변경 사항을 원격 온라인으로 푸시하는 것입니다. "git push"를 사용하여 repo.

그 후 마스터로 다시 전환하여 분기를 삭제하려고했는데 문제 (경고 메시지)가 사라지고 분기가 성공적으로 삭제되었습니다.


3

간단히 알아낼 수 있습니다.

자식 로그-체리 마스터 ... 실험

--cherry 옵션은의 동의어입니다 --right-only --cherry-mark --no-merges

git-log 맨 페이지가 말했다

출력을 우리 측의 커밋으로 제한하고 git log --cherry upstream ... mybranch를 사용하여 분기 기록의 다른쪽에 적용된 것을 표시하는 것이 유용합니다 .git cherry upstream mybranch와 유사합니다.

참고로 --cherry-pick동등한 커밋을 생략하지만 --cherry-marks그렇지 않습니다. 업스트림과 공동 작업 퍼블릭 브랜치 간의 리베이스 및 강제 업데이트 업데이트를 찾는 것이 유용합니다.


1

내 로컬 자식에 업스트림 분기가 없었습니다. master git checkout -b mybranch에서 로컬 브랜치를 만들었습니다. 업스트림 git에서 bitbucket GUI가있는 브랜치를 만들고 로컬 브랜치 (mybranch)를 해당 업스트림 브랜치로 푸시했습니다. 업스트림 분기를 검색하기 위해 로컬 git에서 git fetch를 수행하면 git branch -d mybranch를 수행 할 수 있습니다.


0

나는 --force당신이 정말로 찾고 있는 깃발이라고 생각합니다 . 그냥 사용 git branch -d --force <branch_name>강제 지점을 삭제합니다.

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