[Github]branch 삭제하기_ error: The branch is not fully merged.

IT것이 알고싶다/GitHub · 2023. 2. 21. 16:36

서론

우여곡절 git에 입문하고 사용하던 중

하나의 branch로 커밋을 여러 번 하다 보니 이래저래 꼬여버렸다.

branch는 한번 쓰고 없애고 다시 만드는 게 좋다더라..

 

branch 삭제

git branch -d <branch name>

하려하니

$ git branch -d ule
error: The branch 'ule' is not fully merged.
If you are sure you want to delete it, run 'git branch -D ule'.

에러가 뜨더라

 

밑에 친절하게 대안까지 알려주어서 해당 명령어면 삭제가 되겠지만

일단 원인을 알아보자

-d를 사용한 branch 삭제는 branch 가 "fully merge"되었는지 여부를 결정할 때 현재 HEAD만 고려합니다. branch 가 다른 branch와 merge 되더라도 불평합니다 . 이와 관련하여 오류 메시지는 확실히 더 명확할 수 있습니다... 삭제하기 전에 병합된 branch를 체크아웃하거나 git branch -D를 사용할 수 있습니다. 대문자 -D는 검사를 완전히 무시합니다.

즉 에러보다는 경고성 메시지이고 현재 HEAD기준으로 도달할 수 없는 commit이 있고, 해당 branch를 삭제했을 때 커밋을 잃을 가능성이 있을 수도 있다는.. 내용 같다.

 

git을 봤을 때는 다 제대로 올라간 것 같긴 한데..

그럼 사실 아래 명령어로 쓱-싹 삭제해 주면 노 프라블럼이다.

git branch -D <branch name>

본론

but..ㅠ

직업특성상(디비디딥) 데이터 유실을 두고 볼 수 없었기에 좀 더 확실하게 알아봤다.

 

의문: branch를 삭제 시 의사결정을 어떻게 내릴까?

 

1. merge 되지 않은 commit이 있는가?

git log <branch name> ^main --no-merges
  • git log
    git 버전 제어 시스템에서 repository에서 수행된 모든 commit 목록을 표시하는 데 사용
    • ^
      git에서 통상적으로 commit의 부모의미
      git log에서는 지정된 commit에서 도달할 수 있는 commit을 제외
      → git log ^main : main branch에서 도달할 수 없는 모든 commit을 보여줘
    • no-merges 옵션
      출력에서 merge commit을 제외

 

2. --no-merges에서 log가 안 나오면 되는 걸까?
아니요..
해당 merge commit이 변경사항이나 수정사항을 가지고 있음을 의미할 수도 있기에

변경사항 또는 수정사항이 있는 모든 merge commit을 제외하기

$ git log <branch name> ^main --no-merges --first-parent 
  • -first-parent
    merge commit의 첫 번째 부모만 따르도록 Git에 지시
    merge과 관련 없는 변경 사항이 포함된 merge commit을 표시하지 않음

결론

💡 branch에서 더 이상 commit 할 것이 없고 git log에서 모든 변경 사항이 main branch로 merge 되었다면 삭제해도 됨!

 

branch 삭제 전 merge 되지 않은 변경 사항 확인하자

merge 되지 않은 branch를 삭제하면 변경 사항도 삭제되기 때문에, 제대로 병합되었는지 확인 필요

 

정 불안하면 branch를 백업해 두자

삭제하려는 branch와 동일한 commit을 가리키는 새 branch를 생성하여 백업 생성

 

git 백업

git branch <new branch> <delete branch>

그러면 delete branch와 동일한 commit을 가리키는 new branch가 생성

 

내 경우엔 commit 은 되었는데 merge 가 덜 되어있었다.

merge 해주고 삭제하니 경고 없이 잘 진행되는 것을 볼 수 있었다.

$ git merge --no-ff ule
Merge made by the 'ort' strategy.
....

$ git branch --merged main
* main
  ule

$ git branch -d ule
Deleted branch ule (was e013c92).

$ git branch
* main

++

뭐든 log 보는 게 중요한 것 같다.. git log 보는 법을 공부해야겠다..

반응형