GitHub&Git

[Git] Git Rebase로 Conflict 해결

findTheValue 2022. 10. 2. 18:14

협업을 진행하다보면 conflct가 당연히 발생합니다.

 

PR을 밀어 넣었을 때 기존 코드와 내 코드가 비교되는 과정에서 다른 코드가 원본에 Merge되면 비교과정이 올바르지 않게 되기 때문에 conflict가 발생하는데 이는 3-way-merge 방법 또는 rebase를 이용해 해결이 가능하다.

  • 3-way-merge : base + 내 branch + upstrem의 최신버전
  • rebase : 내 branch + rebase 한 내용

 

rebase는 말 그대로 re + base로 내가 머지하려는 브랜치가 갈라져 나온 branch의 base를 바꾸겠다는 것이다.

이 과정을 통해 내 코드는 새로이 만들어진 base와 코드 대사과정을 하게되므로 Merge하는데 문제가 없게된다.

 

원리는 내 branch가 지속적으로 기록한 commit에 대한 diff를 기존의 base가 아닌 새로이 rebase하고 싶은 브랜치와 비교하게되고 rebse는 기존에 존재하는 commit이 아닌 새로운 commit(new commit hash)을 만들어 base 브랜치에 붙이게 됩니다.

 

주의할 점은 develop - branch A - branch B 의 분기에서 branch A에 rebase를 하게되면 branch B에서 더 큰 conflict가 일어날 수 있습니다.

 

내 PR에 해당 메세지가 뜨며 Merge 버튼이 막힌다면 다음과 같은 순서를 따릅니다.

git fetch upstream/develop

git rebase develop

git rebase upstream/develop

develop은 base branch입니다.

git status

를 통해 문제가 있는 파일을 찾은 후 conflict를 직접 해결해줍니다.

직접 코드를 수정해도 되고 vscode는 해당 지점을 스크롤부분에 표시해주고 해결도구도 제시해줍니다.

 

코드 수정 후에는 git add, git rebase --continue를 통해 지속적으로 발생하는 conflict를 해결해줍니다.

(rebase는 아까 말했다시피 commit이므로 추가 commit이 필요하지 x)

 

이후 

git push origin HEAD --force-with-lease

를 통해 강제로 밀어넣으면 conflict가 해결된다.

--force-with-lease

는 작업 도중 새로운 commit 이 있어 기대한 값과 다르면 force push를 막는다.