힘내와 “지점 ‘x’가 완전히 병합되지 않았습니다”오류 변경 사항을 GitHub로 푸시했습니다. git push

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

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에 익숙하지 않은 오류 메시지가 표시 되어 두 분기를 병합 할 수있는 정도를 모릅니다. 내가 여기서 무엇을 놓치고 있습니까?



답변

참고 문구에 대한 응답으로 문구가 변경되었습니다. 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명령은 모든 분기 의 개정 트리를 검사하지 않습니다 . 경고는 명백한 실수를 피하기 위해 존재합니다.

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


답변

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


답변

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

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

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

답변

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


답변

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

브랜치 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이 완전히 병합 된 상태를 확인하도록하십시오.


답변

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

git checkout experiment
git merge --no-commit master

git diff --cached

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

다음을 잊지 마십시오 :

git merge --abort

당신이보고 완료되면.


답변

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

문제는 :

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.

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