main 브랜치와, conflict-1 브랜치 를 합친다고 생각해 보겠습니다.
main 브랜치의 tigers 파일에 있는 내용은 이와 같습니다.
team: Tigers
manager: Kenneth
coach: Grace
members:
- Linda
- William
- David
- George
conflict-1 브랜치의 tigers 파일에 있는 내용은 이와 같습니다.
team: Tigers
manager: Deborah
coach: Grace
members:
- Linda
- William
- David
- George
두 파일을 비교해보면 같은 위치에 있는 manager의 이름이 다르다는 것을 알 수 있습니다.
# main
manager: Kenneth
# conflict-1
manager: Deborah
이 경우, main이 conflict-1과의 merge를 시도한다면 어떻게 될까요?
git merge conflict-1
바로 conflict가 발생하게 됩니다.
해당 파일을 text로 열어보면 파일 자체에도 '>>>>>>>' 가 추가되어 있습니다.
git merge --abort
conflict 위에 있는 Accept Current Change를 클릭하면 됩니다.
conflict 위에 있는 Accept Incoming Change를 클릭하면 됩니다.
conflict 위에 있는 Accept Both Changes를 클릭하면 됩니다.
conflict가 발생한 부분의 코드를 지우고, 완전히 새로운 값으로 써넣으면 됩니다.
충돌된 코드를 수정한 후에는 해당 변경사항을 저장하고 커밋해야 합니다.
커밋 메세지를 입력하지 않아도 자동으로 'Merge conflict-1'메세지가 입력되어 있습니다. 이후에는 :wq를 입력하여 종료해 줍니다.
git add .
git commit
rebase의 경우 브랜치를 통째로 합치는 것이 아니라, 브랜치 내에서 발생한 모든 commit들을 하나하나 짐을 싸들고 main으로 옮기는 작업이기 때문에, commit 하나하나를 옮길때마다 발생하는 conflict에 대한 처리를 해주어야 합니다.
merge는 집을 통째로 들고가 합치는 것이기 때문에 공통적으로 가지고 있는 것들 때문에 발생하는 conflict를 한번에 처리하는 반면,
rebase는 한집에 있는 짐을 하나 하나씩 들고 이사를 들어가는 셈이기 때문에 짐이 하나씩 들어갈 때마다 공통적으로 가지고 있는 짐들을 어떻게 처리할지 일일이 논의해야 한다는 것이죠.
먼저, conflict-2 브랜치의 짐들을 main으로 한번 옮겨보겠습니다.
git switch conflict-2
git rebase main
위와 같은 코드를 실행하면, 브랜치별 다른 코드로 인해 conflict가 발생하게 됩니다.
git rebase --abort
conflict 위에 있는 Accept Current Change를 클릭하면 됩니다.
conflict 위에 있는 Accept Incoming Change를 클릭하면 됩니다.
conflict 위에 있는 Accept Both Changes를 클릭하면 됩니다.
conflict가 발생한 부분의 코드를 지우고, 완전히 새로운 값으로 써넣으면 됩니다.
rebase에서 충돌된 코드를 수정하고 난 뒤에는,
git add .
하지만 그 다음 과정은 조금 다릅니다. 앞전에 말했듯이, rebase는 짐을 하나하나 옮기는 것이기 때문에 commit 마다 발생하는 conflict 에 대해 처리해 주어야 합니다.
git rebase --continue
이후에 뜨는 자동 commit message vim 에 대해서는 :wq 입력해줍니다.
이렇게 되면 conflict-2 브랜치는 main에 성공적으로 rebase 됩니다.
git switch main
git merge conflict-2