[Git 완전정복] merge, rebase로 인한 충돌을 해결하는 방법

Yellowtoast·2023년 2월 15일
0

Git 완전정복

목록 보기
2/3
post-thumbnail

Merge로 발생한 충돌 해결하기

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로 열어보면 파일 자체에도 '>>>>>>>' 가 추가되어 있습니다.

- 발생한 충돌 처리하기

1. 충돌이 발생했을 경우 진행하고 있던 merge를 취소하고 싶다면

git merge --abort 

2. 특정 conflict에 대해 main의 값을 계속 유지하고 싶다면

conflict 위에 있는 Accept Current Change를 클릭하면 됩니다.

3. 특정 conflict에 대해 conflict-1 브랜치의 값으로 덮어쓰고 싶다면

conflict 위에 있는 Accept Incoming Change를 클릭하면 됩니다.

4. 특정 conflict에 대해 두 값을 모두 받고 싶다면

conflict 위에 있는 Accept Both Changes를 클릭하면 됩니다.

5. 특정 conflict에 대해 완전히 새로운 값으로 대체하고 싶다면

conflict가 발생한 부분의 코드를 지우고, 완전히 새로운 값으로 써넣으면 됩니다.

- 충돌된 코드를 수정한 후에는?

충돌된 코드를 수정한 후에는 해당 변경사항을 저장하고 커밋해야 합니다.
커밋 메세지를 입력하지 않아도 자동으로 'Merge conflict-1'메세지가 입력되어 있습니다. 이후에는 :wq를 입력하여 종료해 줍니다.

git add .
git commit

Rebase로 발생한 충돌 해결하기

rebase의 경우 브랜치를 통째로 합치는 것이 아니라, 브랜치 내에서 발생한 모든 commit들을 하나하나 짐을 싸들고 main으로 옮기는 작업이기 때문에, commit 하나하나를 옮길때마다 발생하는 conflict에 대한 처리를 해주어야 합니다.

merge는 집을 통째로 들고가 합치는 것이기 때문에 공통적으로 가지고 있는 것들 때문에 발생하는 conflict를 한번에 처리하는 반면,

rebase는 한집에 있는 짐을 하나 하나씩 들고 이사를 들어가는 셈이기 때문에 짐이 하나씩 들어갈 때마다 공통적으로 가지고 있는 짐들을 어떻게 처리할지 일일이 논의해야 한다는 것이죠.

먼저, conflict-2 브랜치의 짐들을 main으로 한번 옮겨보겠습니다.

1. conflict-2 브랜치로 이동합니다.

git switch conflict-2

2. conflict-2 브랜치의 base를 main으로 옮깁니다.

git rebase main

위와 같은 코드를 실행하면, 브랜치별 다른 코드로 인해 conflict가 발생하게 됩니다.

- 발생한 충돌 처리하기

1. 충돌이 발생했을 경우 진행하고 있던 rebase를 취소하고 싶다면

git rebase --abort 

2. 특정 conflict에 대해 main의 값을 계속 유지하고 싶다면

conflict 위에 있는 Accept Current Change를 클릭하면 됩니다.

3. 특정 conflict에 대해 conflict-2 브랜치의 값으로 덮어쓰고 싶다면

conflict 위에 있는 Accept Incoming Change를 클릭하면 됩니다.

4. 특정 conflict에 대해 두 값을 모두 받고 싶다면

conflict 위에 있는 Accept Both Changes를 클릭하면 됩니다.

5. 특정 conflict에 대해 완전히 새로운 값으로 대체하고 싶다면

conflict가 발생한 부분의 코드를 지우고, 완전히 새로운 값으로 써넣으면 됩니다.

- 충돌된 코드를 수정한 후에는?

rebase에서 충돌된 코드를 수정하고 난 뒤에는,

1. merge때와 동일하게 add를 해주어야 합니다.

git add .

하지만 그 다음 과정은 조금 다릅니다. 앞전에 말했듯이, rebase는 짐을 하나하나 옮기는 것이기 때문에 commit 마다 발생하는 conflict 에 대해 처리해 주어야 합니다.

2. 따라서 계속 rebase를 진행합니다.

git rebase --continue

이후에 뜨는 자동 commit message vim 에 대해서는 :wq 입력해줍니다.

이렇게 되면 conflict-2 브랜치는 main에 성공적으로 rebase 됩니다.

3. 마지막으로 main 브랜치로 이동하여 뒤쳐져 있는 브랜치를 rebase된 최신 브랜치의 commit사항들로 업데이트 해줍니다.

git switch main
git merge conflict-2
profile
Flutter App Developer

0개의 댓글