IT SW 지식 및 기타/git

git study note (16) branch 5 - 가지를 합칠 때 주의할 점

혀니쌤1 2022. 3. 18. 14:57

브랜치간 병합을 할 때 충돌에 대해서도 조심해보자.

 

충돌이 없었던 합치기 :

사실 이전에 했던 branch 병합은 서로 conflict되는 부분이 없었다. 변경 사항이 아래와 같았으니까...

  • main branch : 타이거, 레오파드, 팬더 3개 파일에 팀멤버 1명씩 추가 
  • add-coach branch : 타이거, 레오파드, 팬더 3개 파일에 코치 정보 추가
  • new-team branch : 퓨마와 재규어라는 2개 yaml파일이 생성됨

 

도착 브랜치인 main 브랜치 기준 시점에서 볼 때, 새로운 퓨마, 재규어 파일이 생겨나고, 새로운 코치 정보가 추가되는 것이니까 말이다. 다 추가의 개념이었다. 하지만 아래와 같은 경우라면 어떨까?

 

충돌 있는 합치기 : MERGE의 경우

 

Conflict1 및 Conflict2 브랜치를 만들어 두고...

메인 브랜치는 Tigers, Leopards, Panthers의 코치 또는 매니저 이름을 다 바꾸고 커밋 1번

Conflict1 로 이동하여 Tigers 매니저만 다르게 변경, Conflict2 로 이동하여 Leopards의 매니저만 다르게 변경

이 겨우 서로 다른 브랜치에서, 같은 파일, 같은 줄에서 (매니저는 위에서 3번째 줄) 서로 다른 내용이 있게 된다.

이런 경우 병합할 때 누구 것을 누구 것에게 덮어 씌울까?

main에서 conflict1을 병합하면 tigers의 매니저는? 컴퓨터는 헷갈리기 때문에 프로그래머에게 직접 알려달라고 되묻는다.

그래서 merge후 찜찜한 사항을 변경사항을 저장하지 못한채 자동 커밋을 하지 못하고 남아있는다.

그 것이 소스트리에서 uncommitted changes라고 보이는 이유! (정상적인 merge라면 커밋 시점을 하나 더 만들어서 자동 합체가 되어야겠지만..)

위에 경우에는 conflict가 manager 한 부분이라서 간단하지만, 만약 충돌 사항이 너무 많아 어찌할 바를 모르겠다면 간단히 merge를 취소해버리면 된다. 그럼 uncommited changes가 사라진다.

git merge --abort

 

 

conflict 된 부분을 보수 했다고 끝난 것이 아니다. 아직은, uncommited changes이기 때문에 추가 커밋이 필요하다.

git add .  + git commit 를 잊지 말자.

 

 

 

 

충돌 있는 합치기 : REBASE의 경우

 

rebase의 경우를 살펴보자. merge의 경우엔 추가 커밋을 통하여 main branch 및 conflict branch를 합쳤다면 (어찌보면 두 개 모두 소스),

rebase의 경우 복사해서 붙여넣기 / 옮겨 심기 개념이다. (소스는 conflict2고 목적지는 main)

만약에 옮겨지는 브랜치에 달린 열매(커밋)가 2개라면 2개 모두 순차적으로 충돌 여부를 확인해야 할 것이다.

 

이를 더 잘 확인하기 위하여 Conflict2 브랜치에서 (기존엔 레오파드의 매니저만 수정된 상태) 팬더 코치를 추가로 수정하였다.

이제 레오파드 코치 Melissa와, 팬더 코치 Raymond를 고려하면서, 현 main branch 매니저와 충돌이 안되게 병합해보자.

conflict2로 이동하여 git rebase main을 외치면:

 

VS Code 기준 panthers 파일을 열면 클릭으로 충돌 된 부분을 유저가 직접 보수할 수 있다. 일단 이번의 경우는 팬더팀의 코치는 셜리로 해보자. 

(만약 당장 충돌 해결이 어려우면,  rebase 취소를 해야 하는데, merge 때 git merge --abort라고 외쳤던 것과 같다.

git rebase --abort 라고 외치면 된다.)

 

여기서 부터 집중하자.

merge때에는 충돌 해결 후, uncommited change로 남아있는 것을 git add 및 git commit으로 최종 저장하였다.

하지만, rebase의 경우 커밋을 한 알 한 알 복사하여 옮겨심는 것이기 때문에, 추가 충돌이 발생할 것을 고려하여 계속 점검한다라는 코맨드가 필요하다.

rebase때는 다음과 같이 선언한다 :   git add .  + git rebase --continue  

현재 상황이라면 팬더팀의 충돌만 고치고 레오파드팀의 충돌은 아직 손보지 않아서, 레오파드팀 conflict 메세지가 바로 뜰 것이다.

만약 레오파드팀 충돌까지 모두 완료한 후 다시 한 번 git add + git rebase --continue를 한다면, 추가 git commit 메세지 없이도 병합이 완료된다.

 

위에 소스트리를 보면 main은 아직 시점이 한단계 전에 있다. 충돌 2 해결 시, Conflict2의 Melissa를 택했기 때문이다.

마무리도 깔끔하게~ 아래와 같이 해주자. 

main 브랜치로 이동하여 git merge conflict2

git branch -d conflict1, git branch -d conflict2로 브랜치 삭제