상세 컨텐츠

본문 제목

github: repository fork 후 협업하기

git

by lazz 2021. 9. 3. 00:31

본문

반응형

협업을 위해 fork한 repository를 클론해 로컬에서 작업하는 경우,

  • 로컬의 수정 내역을 원본 repository에 PR 보내기
  • 원본 repository로 로컬 환경을 동기화하는 과정을 알아보자.

 

Pull Request 보내기

로컬에서 작업한 내용을 원본 repository에 반영하려면 PR(pull request)를 보내야 한다.

  • 로컬에서 작업한 내용을 fork한 repository에 push한다.

git add . git commit -m "{커밋 메시지}" git push origin {브랜치}

  • 해당 repo의 github 페이지로 가서 새로운 PR을 생성한다.

  • PR의 대상이 되는 repository와 브랜치, PR을 보내는 repository와 브랜치를 선택한다. 충돌이 없다면 아래와 같이 PR 메시지를 작성해서 보낼 수 있다.

이후 원본 repository에서 PR을 merge하면 로컬의 변경 내용을 담은 커밋이 원본에도 반영되게 된다.

항상 이렇게 쉽다면 얼마나 좋을까?...

Can't automatically merge

원본 repo와 fork한 repo 사이에 충돌하는 커밋이 존재하면 자동으로 merge 할 수 없고 원본 repo owner가 직접 conflict를 해결해야 한다.

처음에 의아했던 점은 나만 특정 브랜치에 PR을 보내고 있었는데도 충돌이 났다는 것이다.

알고 보니 내가 보낸 PR의 커밋들이 merge되면서 commit의 주체가 변경되었고, commit의 해쉬값도 변경되어 원본 repository에 들어가서 생기는 문제였다.

기존 커밋과 변경된 커밋

 

 

Upstream과 Rebase

이 문제는 rebase로 간단?하게 해결할 수 있다.

핵심은 원본 repository의 커밋 히스토리와 로컬 repository의 커밋 히스토리를 동기화하는 것이다.

위에서 파란색과 초록색 선에 해당하는 내용을 설명했다.

이제 변경된 원본 repo 내용으로 local을 동기화하는 주황색 선을 설명한다.

  • 먼저 로컬에 원본 repo를 등록해야 한다.

git remote add -t {브랜치} upstream {주소}

upstream은 원본 repo를 등록하는 이름이기 때문에 upstream 이 아니어도 된다. 근데 그냥 upstream 해라.

  • 이후 commit을 동기화하기 위해 rebase

git fetch upstream {브랜치}
git rebase upstream/{브랜치}

이렇게 하면 원본의 커밋 히스토리와 로컬의 히스토리가 동기화된다. 이 상태에서 새로운 기능을 개발해 커밋하고 PR을 날리면 커밋 히스토리가 동일하기 때문에 위에서 본 can't automatically merge 에러를 안 볼 수 있다!!

하나 주의할 점은 로컬에서 rebase로 동기화하는 master 브랜치를 두고, 개발은 새로운 브랜치를 파서 하고 commit을 해야 한다는 점이다. 만약 rebase하고 같은 브랜치에서 commit을 하면 PR이 merge된 후 다시 rebase 할 때 에러가 생긴다.

 

 

Can't automatically merge 해결하는 방법

이미 can't automatically merge가 나와서 이 글을 읽고 있다면,

  • 로컬에 원본 repo를 등록한다
  • 새로운 브랜치를 만든 뒤 원본 내용과 동기화시킨다
    • 아래 명령을 이용하면 강제로 동기화할 수 있다. 복구할 수 없으니 조심해서 사용하자.
    git reset —hard HEAD git clean -f -d git pull
  • 기존에 작업 중이던 브랜치의 수정 사항을 동기화시킨 브랜치에 덮어 씌운다. (노가다)
  • 다시 푸시하고 PR을 날린다

이렇게 하면 해결할 수 있다.

틀린 내용이 있거나 더 똑똑한 방법이 있다면 댓글 부탁드립니다!

 

 

 

Reference

https://stackoverflow.com/questions/1125968/git-how-do-i-force-git-pull-to-overwrite-local-files?rq=1

반응형

댓글 영역