GitHub로 협업하기

728x90
반응형

GitHub로 협업하는 방법

팀장이 깃허브에 새로운 레포지토리를 파서 그것을 팀원들과 공유하여 협업한다.

각 팀원들(팀장 포함)은 자신의 branch를 생성하여 자신이 맡은 기능을 구현하고 push한 후, Pull Request를 작성하여 Conflict가 발생하지 않으면 Confirm Merge를 통해 master과 합병한다.Conflict가 발생하면 해당 부분을 팀원들과 협의를 통해 수정 후 다시 올린다.

 

1. 팀장/팀원 설정 ▷ 팀장이 GitHub에 새로운 repository를 파서 그것을 공유


팀장이 기본 설정을 완료한 프로젝트 폴더를 공유할 깃허브 저장소와 연결하고 파일들을 push하고 나서 팀원들을 초대한다.

 

 

[레포지토리 공유 방법]


공유할 레포지토리 → Settings → Manage access → Invite a collaborator 클릭 → 사용자 이름, 깃허브 아이디, 또는 이메일 입력 → 초대를 완료하면 초대한 팀원에게 초대 이메일이 가고, 초대를 수락하면 해당 레포지토리에 접근할 수 있게 된다. 

 

2.    팀원들은 그 저장소의 주소를 clone하여 자신의 컴퓨터에 저장한다.

- 자신의 컴퓨터에서 새로운 폴더 생성 → 폴더로 이동 → 폴더와 저장소 연결 

$ git clone [저장소 주소]

git clone 명령은 아래의 명령들을 포함한 작업이다.

$ git init

// 현재 작업 중인 git 저장소에 팀의 중앙 원격 저장소를 origin(기본값) 이름의 remote로 추가하고 
// origin을 저장소 주소(URL) 대신 사용한다. (origin == 중앙 remote repository URL)

$ git remote add origin [저장소 주소]

($ git remote -v                   //설정한 remote 목록 확인)

 

3. 팀원 branch 생성 후 코드 수정


팀원들은 자신들의 branch를 생성하여 코드를 수정하면 branch로 commit, push해서 자신의 branch에 업로드한 후 팀장에게 자신의 코드를 master에 병합해 달라고 pull request를 요청한다.

 

* branch

중앙 원격 저장소에는 master branch가 있고, 자신의 로컬 저장소에는 master branch와 기능을 구현할 branch가 있다.

기능 개발 ▷ 새로운 branch를 만들어서 작업 수행

내 로컬에서 새로운 작업을 하는 경우: master에서 그 작업에 대한 브랜치를 생성 후 이동한다.

 

branch 생성 명령어:

$ git checkout -b [branch name]

// 위의 명령어는 아래의 두 명령어를 합친 것

$ git branch [branch name]            // [branch name] 이름으로 branch 생성

$ git checkout [branch name]         // [branch name]으로 branch 작업 위치 이동

 

4. 로컬 저장소의 새로운 기능 브랜치를 저장소에 push


새로 만든 branch에 새로운 기능에 대한 내용을 commit한다.

$ git commit -a -m "commit message"

// 위의 명령어는 아래의 두 명령어를 합친 것

$ git add .                             // 변경된 모든 파일을 스테이징 영역에 추가

$ git add [some-file]         // 스테이징 영역에 some-file 추가

$ git commit -m "commit message"             // local 작업폴더에 history 하나를 쌓는 것

 

- commit 완료 후, 내가 작업한 내용을 포함한 branch를 중앙 원격 저장소에 올린다.

→ 로컬 저장소의 백업 역할 + 다른 팀 구성원들이 나의 작업 내용과 진도 확인 가능

 

// -u 옵션: 새로운 기능 브랜치와 동일한 이름으로 중앙 원격 저장소의 브랜치로 추가한다.

// 로컬의 기능 브랜치를 중앙 원격 저장소 (origin)에 올린다.

$ git push -u origin [branch name]

// -u 옵션으로 한 번 연결한 후에는 옵션 없이 아래의 명령만으로 기능 브랜치를 올릴 수 있다.

$ git push -origin [branch name]

 

5. 깃허브 저장소에서 Pull Request


push한 후, 깃허브 저장소 페이지로 이동하면 페이지 윗부분에 생긴 Pull Request 버튼을 볼 수 있을 것이다.

이 버튼을 눌러 프로젝트 관리자에게 자신이 작업한 코드를 반영해달라는 Pull Request를 작성한다. 

어느 부분을 수정했는지, 어느 기능을 구현했는지 간단한 설명을 쓰면 된다. 

 

* Pull Request (PR이라고 함)

: 기능 개발을 끝내고 master에 바로 병합(merge)하지 않고, 브랜치를 중앙 원격 저장소에 올리고 master에 병합(merge)해달라고 요청하는 것

 

<conflict 발생 시>

1. 충돌이 발생하면 master계정에서 pull request를 할 때 충돌이 발생한 부분을 보여준다.

2. 충돌이 발생한 코드의 작성자들과 상의를 하여 최종코드를 합의한 후 수정하여 master에 merge한다.

3. 코드 작성자는 깃을 fetch하여 합의 수정된 코드를 pull한 후, 자신의 branch 저장소에 다시 push하여 최신화한다.

 

6.    Pull Request 확인하여 리뷰 후 수락하여 master와 병합(Confirm Merge)


모든 팀원이 변경된 코드 내용을 확인 후 마지막으로 확인한 팀원이 변경 내용을 master branch에 merge한다.

Pull requests -> File changed 탭: 변경내용 확인 -> Conversation 탭: "Confirm merge"를 하면 중앙 원격 코드 베이스에 병합(merge)된다.

 

7.   업데이트된 내용 반영


다른 팀원들은 병합된 master를 자신의 branch에 merge하여 업데이트된 내용을 자신의 브랜치에 반영한다.

$ git pull origin master

 

* fetch 와 pull 의 차이

fetch: 원격 저장소의 데이터를 로컬에 가져오기만 하기

pull: 원격 저장소의 내용을 가져와 자동으로 병합 작업 실행

즉, 단순히 원격 저장소의 내용을 확인만 하고 로컬 데이터와 병합은 하고 싶지 않은 경우에는 fetch 명령어를 사용한다.

pull = fetch + merge

 

 

** 업데이트된 중앙 원격 저장소의 코드 내용을 적용해서 내가 맡은 기능을 추가로 구현할 때

업데이트된 저장소 내용을 반영하려면 먼저 자신의 branch로 이동 후, master 브랜치의 내용을 가져오면 된다.

Conflict가 발생하는 것을 방지하기 위해, 자신이 맡은 기능을 구현하기 전에 pull을 하고, push하기 전에도 다시 한번 pull하고 나서 push한다.

$ git pull origin master

 

8. 다시 새로운 작업을 하는 경우 master에서 그 작업에 대한 branch를 생성하여 작업한다.


중앙 원격 저장소와 동기화된 로컬 저장소의 master branch에서 새로운 작업에 대한 branch를 생성하여 작업을 시작한다.

- 이 때, local에서 완성한 이전 작업 브랜치를 삭제해도 내 remote에는 남아있다.

 

협업 시 권장 순서: pull -> coding -> commit -> pull -> push

 

728x90
반응형