마스터 브랜치에서 사용한 명령은 다음과 같습니다.
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은 저장소의 다른 모든 분기를 검사하지는 않습니다. 단지 두 :
- 현재 지점 (HEAD)
- 업스트림 지점 (있는 경우)
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).
어디 xxxxxxxx
A가 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.
그 후 마스터로 다시 전환하여 분기를 삭제하려고했는데 문제 (경고 메시지)가 사라지고 분기가 성공적으로 삭제되었습니다.