파일의 같은 위치에 다른 내용이 입력이 되어있는 상황이라면 브랜츠 간 충돌이 일어날 수 있습니다. 이것을 해결해보겠습니다.
0. 상황 만들기
- conflict-1, conflict-2 브랜치 생성하기
- main 브랜치
- Cheong의 manager를 Kenneth로 변경하기
- apeach의 coach를 Nicholas로 변경하기
- Friend의 coach를 Shirley로 변경하기
- 커밋 메세지 : Edit Cheong, apeach, Friend
- conflict-1 브랜채
- Cheong의 manager를 Deborah로 변경
- 커밋 메세지 : Edit Cheong
- conflict-2 브랜치 1차
- apeach의 coach를 Melissa로 변경
- 커밋 메세지 : Edit apeach
- conflict-2 브랜치 2차
- Friend의 coach를 Raymond로 변경
- 커밋 메세지 : Edit Friend
1. merge 충돌 해결
main 브랜치로 이동하여 git merge conflict-1을 이용해 병합을 시도해보겠습니다.


병합을 시도하게 된다면 충돌이 일어나는 파일에 저렇게 표시가 되며 터미널 창에 어째서 실패하였는지가 나오게 됩니다.
<<<<<< HEAD의 밑부분이 현재 들어와 있는 브랜치의 내용이고 >>>>conflict-1의 윗부분이 merge가 되는 브랜치 명에서 충돌을 일으키는 것을 가르킵니다.
해결하는 방법은 두 가지 정도가 있습니다.
첫 번째, 3~7행 까지 모두 지운 후 자신이 직접 다시 작성한 후 입력하고서 merge를 진행시키는 방법
두 번째, 3행 위에 나와있는 영어를 누르는 방법
이렇게 두 가지가 존재하는데 그 중 두 번째 방법이 또 4가지로 나눠집니다.
Accept Current Change | 현재 메인 브랜치에 있는 것을 사용함 |
Accept Incoming Change | merge 하려는 브랜치에 있는 것을 사용함 |
Accept Both Changes | 둘 다 사용함 (두개 다 남음) |
Compare Changes | 변경 사항을 비교함 |
우리는 conflict-1의 변경사항을 사용할 것이기 때문에 Accept Incoming Change를 눌러주도록 하겠습니다.
이렇게 문제의 해결이 가능하다면 충돌 부분을 수정해주고서 'git add . '과 'git commit'을 터미널 창에 쳐주도록 하겠습니다.
git commit을 작성하면 자동으로 Vi입력모드로 들어가짐과 동시에 커밋 메세지가 적혀있는 것을 확인할 수 있습니다.

만일 저 커밋 메세지를 그대로 사용할 것이라면 저장을 해주시면 되고, 직접 수정을 하고 저장을 하셔도 상관이 없습니다.
저장을 완료한다면 아래와 같이 (main|MERGIMG)이 다시 main으로 돌아오며 완료된 것을 확인할 수 있습니다.

※ 만일 충돌이 일어나는 파일이 많아 당장 해결이 어렵다고 생각되어 merge를 중단하고 싶다면 다음과 같은 명령어를 사용면 됩니다.
git merge --abort
2. rebase 충돌 해결
rebase를 사용해주기 위해서 main브랜치에서 conflict-2브랜치로 이동하겠습니다. 이후 rebase를 사용해보겠습니다.

rebase를 하려고 해보니 터미널 창에 어째서 이렇게 되는지와 힌트가 나오고 (conflict-2|REBASE 1/2) 로 알 수 있듯이 rebase를 하기 위해 2가지 커밋에서 수정을 해야하는 것을 볼 수 있습니다.
이번에는 git status를 이용하여 상태를 확인해보겠습니다.

both modified 즉 양쪽의 파일에서 apeach.yaml이란 파일에서 충돌이 일어난다고 말하고 있습니다. 그렇기에 컴퓨터는 해결을 할 수 없으니 제작자(개발자)에게 수정을 요구하는 것입니다.

이번에도 역시 merge와 다를 바 없는 문제가 뜨는 것을 확인할 수 있습니다. 이번에는 Melissa를 받아오도록 하겠습니다. 선택을 해주었다면 git add . 을 전부 속해주게 한 후 아래의 명령어를 적어주도록 하겠습니다.
git rebase --continue
continue를 사용하는 이유는 오류가 수정 한번으로 끝나지 않을 수 있기 때문입니다.

그렇다면 이와 같이 일단 커밋을 하라고 나옵니다. 커밋 메세지는 그대로 사용할 것이기 때문에 :wq를 이용하여 저장해주도록 하겠습니다.
저장을 하였는데도 이번에도 마찬가지로 오류가 나타나는 것을 확인할 수 있습니다. 그렇다면 다시금 오류가 난 파일을 찾아 오류가 발생된 부분을 수정해주도록 하겠습니다. Friend.yaml 에서 오류가 나타났으며 이번에는 Shirley를 사용해주도록 하겠습니다. 그러고서 다시 git add . 과 git rebasse --continue를 사용해주겠습니다.

사용해준다면 Successfully rebase 어쩌고 하는 영어와 함께 완료가 되었다고 나타나게 됩니다.
※ 만일 rebase를 사용하던 도중 당장에 충돌의 해결이 어렵다면 아래의 명령어로 rebase를 중단할 수 있습니다.
git rebase --abort
모두 완료가 되었다면 main 브랜치로 이동하여 main 브랜치를 가장 위의 커밋으로 옮겨준 후 conflict-1과 conflict-2 브랜치는 지워주도록 하겠습니다.
마지막으로 소스트리로 보여지는 커밋들입니다.

참고사항
rebase를 사용하였다면 브랜치가 두 개가 딸려와야하는데 위와 같은 형식으로 한다면 하나만 추가될 것입니다. 그 이유는 충돌을 해결하는 도중에 currunt, 즉 main 브랜치의 것을 채택했기 때문입니다. main 브랜치의 것을 채택하게 된다면 rebase의 의미가 사라져 커밋으로 추가할 필요가 없어집니다.
'Git & GitHUB' 카테고리의 다른 글
[Git] Branch 합치기 (0) | 2022.07.08 |
---|---|
[Git] Branch 만들기 (0) | 2022.07.08 |
[Git] 과거의 프로젝트로 돌아가기(SourceTree) (0) | 2022.07.01 |
[Git] 과거의 프로젝트로 돌아가기(Revert) (0) | 2022.06.30 |
[Git] 과거의 프로젝트로 돌아가기(Reset) (0) | 2022.06.29 |