Git으로 협업하기
공동 작업과 Contribute(fork)
Git을 사용한다면 다른 이용자와 코드를 공유하고 개발도 함께해봐야 하지 않겠는가?! 여러명의 이용자와 저장소를 공유하기 위해서는 크게 두 가지 방법이 있다. Collaborator 혹은 Contributor로 활동할 수 있다.
공동 작업 - Collaborator
Git 사용자가 프로젝트를 생성한 뒤 동료 개발자에게 Collaborator 권한을 준다면 이 동료는 저장소에 commit과 push를 자유롭게 할 수 있다. 작업에 참여하는 모든 이용자는 하나의 원격저장소에서 공동 작업을 할 수 있다. 하지만 권한에는 책임이 따르듯이, 다른 동료와 함께 사용하고 있는 저장소에 실수로 잘못된 코드를 merge하여 원본을 손상시킬 경우 매우 혼란스럽고 무섭고 손발이 줄줄인 상황이 올 수 있다. (물론 언제나 해결책은 존재하겠지만,,, )
그래서 이렇게 공동 작업을 할 때에는 충돌을 방지하기 위해 이용자가 각자 자신의 브랜치를 이용하여 작업하는 경우가 많다. 개별 이용자는 자신의 로컬 작업물을 master 브랜치가 아닌 자신의 원격 브랜치로 push한 뒤, 공동 작업 저장소에 pull request를 보내고 이후 문제가 없을 것으로 판단되면 main 브랜치로 merge를 하여 충돌을 예방할 수 있다.
기여 작업(fork) - Contributor
자신이 참여하고 있는 프로젝트가 아닌 경우, 혹은 참여하고 있다고 할지라도 충돌을 예방하기 위해 원본 저장소를 자신만의 공간에 그대로 복제해와서 작업하는 것을 기여 작업(Contribution)이라고 한다. fork를 한 이용자는 원본 프로젝트의 공동 작업자가 아니므로 원본 프로젝트에 직접 push할 수 없다. 따라서 공동 작업보다 충돌이 발생할 위험이 적고 더 많은 이용자가 부담 없이 프로젝트에 기여하고 협업할 수 있다.
그렇다면 기여 작업을 하는 이용자는 원본 프로젝트에 직접 push할 수도 없는데 어떻게 협업을 한다는 것일까? 여기서도 역시 공동 작업과 같이 pull request를 보내게 된다. 우선 기여 작업을 하는 이용자는 fork를 통해 생성된 자신만의 복제 프로젝트에 변경 내용을 push한 뒤 이를 원본 프로젝트 이용자에게 pull request로 보낸다. 원본 프로젝트 소유자는 이를 확인하여 기여 작업자와 Github 내에서 토론을 할 수도 있고, 코드를 리뷰하며 원본 프로젝트로 merge할 것을 결정할 수 있다.
Git 명령어 - 여러명의 사용자와 협업할 때 사용할 경우
fork
- Github 페이지 내에서 기여 작업을 희망하는 프로젝트로 이동하여 프로젝트를
Fork
해옴. - 자신의 Github에 원본 프로젝트가 그대로 복제된 복제 프로젝트가 생성됨.
- 만약 공동 작업자라서 원본 프로젝트에 직접 push할 권한이 있다면 fork할 필요 없음.
clone
- 사용 :
git clone 원격저장소주소
- 다수의 사용자와 다른 프로젝트에 참여하거나(Contribute) git 저장소를 복제하고 싶을 때 사용. 프로젝트 히스토리를 모두 받아옴.
-
clone 명령어 입력 시 해당 디렉토리에 저장소를 복제해올 뿐만 아니라,
git remote add 원격저장소별칭 원격저장소주소
명령어 효과를 볼 수도 있음.- 기존 워킹 디렉토리에 원격 저장소를 추가하는 명령어
branch and checkout
- 사용 :
git checkout -b 토픽브랜치별칭
- 브랜치를 생성하는 명령어인
git branch 브랜치별칭
와 특정 브랜치로 이동하는 명령어인git checkout 브랜치별칭
를 혼합함. - 브랜치에서 작업함으로써 원본 작업과의 충돌을 방지
add, commit and push
- 여기서부터는 내 로컬 저장소에 내가 작성한 변경 내역이 생겼다는 것을 의미함. 따라서 나의 변경 내역을 원격에 반영하기 전, 꼭 Github에서 Fetch and merge 버튼이 활성화 되었는지 확인하여 복제된 프로젝트가 원본 프로젝트의 가장 최신 버전을 따라가도록 설정해야함.
- Git 시작하기 포스트의 단독 작업을 위한 Git 메뉴얼과 같이 add, commit, push를 해줌.
- 단, push 시
git push 원격저장소별칭 토픽브랜치별칭
명령어를 이용해 복제된 저장소(fork된 저장소)의 특정 브랜치로 push함. - 이 작업 결과, 변경 내역은 원본 저장소가 아닌 복제된 나만의 저장소의 브랜치에 반영됨.
pull request
- Github로 이동하여 나만의 복제된 저장소에 변경 내역이 잘 반영되었는지 확인함.
- 잘 반영되었다면
Open pull request
를 통해 원본 프로젝트 소유자에게 나의 변경 사항(push 내역)을 반영하고 업데이트해줄 것을 요청함. - 원본 프로젝트 소유자는 pull request로 생성된 토론에 코멘트를 달거나 코드 리뷰를 통해 merge 여부를 결정함.
pull
- 사용 :
git pull 원격저장소별칭 브랜치명
- 원격 저장소의 내용을 로컬 저장소에 반영(원격에서 변경이 이루어지거나, 다른 사용자의 로컬에서 변경한 내용이 원격으로 보내져 원격이 바뀐 경우 이를 로컬에 반영해야 할 때)
- fetch(원격 저장소 내용을 로컬로 가져오기) 명령어와 merge(가져온 원격 저장소 내용을 로컬에 병합하기) 명령어를 혼합함.