협업을 위해 fork한 repository를 클론해 로컬에서 작업하는 경우,
로컬에서 작업한 내용을 원본 repository에 반영하려면 PR(pull request)를 보내야 한다.
git add . git commit -m "{커밋 메시지}" git push origin {브랜치}
이후 원본 repository에서 PR을 merge하면 로컬의 변경 내용을 담은 커밋이 원본에도 반영되게 된다.
항상 이렇게 쉽다면 얼마나 좋을까?...
원본 repo와 fork한 repo 사이에 충돌하는 커밋이 존재하면 자동으로 merge 할 수 없고 원본 repo owner가 직접 conflict를 해결해야 한다.
처음에 의아했던 점은 나만 특정 브랜치에 PR을 보내고 있었는데도 충돌이 났다는 것이다.
알고 보니 내가 보낸 PR의 커밋들이 merge되면서 commit의 주체가 변경되었고, commit의 해쉬값도 변경되어 원본 repository에 들어가서 생기는 문제였다.
기존 커밋과 변경된 커밋
이 문제는 rebase로 간단?하게 해결할 수 있다.
핵심은 원본 repository의 커밋 히스토리와 로컬 repository의 커밋 히스토리를 동기화하는 것이다.
위에서 파란색과 초록색 선에 해당하는 내용을 설명했다.
이제 변경된 원본 repo 내용으로 local을 동기화하는 주황색 선을 설명한다.
git remote add -t {브랜치} upstream {주소}
upstream은 원본 repo를 등록하는 이름이기 때문에 upstream 이 아니어도 된다. 근데 그냥 upstream 해라.
git fetch upstream {브랜치}
git rebase upstream/{브랜치}
이렇게 하면 원본의 커밋 히스토리와 로컬의 히스토리가 동기화된다. 이 상태에서 새로운 기능을 개발해 커밋하고 PR을 날리면 커밋 히스토리가 동일하기 때문에 위에서 본 can't automatically merge 에러를 안 볼 수 있다!!
하나 주의할 점은 로컬에서 rebase로 동기화하는 master 브랜치를 두고, 개발은 새로운 브랜치를 파서 하고 commit을 해야 한다는 점이다. 만약 rebase하고 같은 브랜치에서 commit을 하면 PR이 merge된 후 다시 rebase 할 때 에러가 생긴다.
이미 can't automatically merge가 나와서 이 글을 읽고 있다면,
이렇게 하면 해결할 수 있다.
틀린 내용이 있거나 더 똑똑한 방법이 있다면 댓글 부탁드립니다!
Reference
댓글 영역