컴퓨터는 잘못이 없다..

[GIT]Forking Workflow 로 협업하기 본문

공부/GIT

[GIT]Forking Workflow 로 협업하기

도토리까꿍v 2021. 2. 18. 00:11
Contents 접기

[Forking Workflow 방식으로 협업하기]

- 팀원들은 개인 로컬 저장소, 자신의 원격 저장소 이렇게 2개의 저장소를 가지고 협업을 한다.

- 모든 팀원들이 중앙 원격 저장소에 푸시하는 것이 아니라, 각자 자신의 원격 저장소에 push한다.  그 후 중앙 원격 저장소에 pull request한다. 그리고 팀장 혹은 프로젝트관리자는 pull request내용을 보고 병합을 결정하는 것이 특징이다.

 

 

[Step01] 팀장이 중앙 원격 저장소 만들기

 

ⓞ 팀장은 프로젝트를 만들어 원격저장소와 로컬 저장소를 만든다. 

1. 레파지토리 만들기
add readme.txt
add gitignore.txt
	none -> java

2. 이클립스
perspective -> git 

3. 왼쪽에서 clone a git repository 클릭

4. 깃헙에서 만든 레파지토리 주소복사

5. url 칸에 복붙
authentication칸이 git을 처음쓰면 빈칸이여서 써줘야함

6. destination 칸의 directory에서 폴더를 선택
내 로컬 저장소 위치를 지정함
나는 KICKIC > git repo

7. Java EE로 perspective 변경
프로젝트 우클릭 > team > share project
create 눌러서 6으로 만든 경로안의 .git있는 곳에서 폴더를 선택
난 KICKIC > git repo > Want (.git이 있는)
-> .git 있는 곳이 비어있었는데 Want 폴더 등이 생겨있음

8. 다시 perspective git으로 간다
Want 프로젝트 > .gitignore 수정

9. Java EE 로 와서 프로젝트 우클릭 > team > commit
하면 git staging 창이 열림
++로 staged changes로 다 옮긴 후 
commit message를 남겨야 commit가능
commit 후 unstaged changes, staged changes 모두 깨끗한지 확인해라!

10. 9번을 하면 프로젝트명에 ↑(커밋수) 가 나온다.
push를 하면 사라진다.

11. 프로젝트 우클릭 > team > push branch 'main'
여기의 remote 주소로 push 된다.





 

①팀장은 프로젝트를 중앙 원격 저장소에 push한다.

↓팀장의 화면

※step01 완료 후 상태

 

 

 

[Step02] 팀원은 중앙원격저장소 Fork 해오기(최초1회)

 

①우측 상단의 fork 버튼을 클릭하면 fork가 진행된다.

↓팀원의 화면

 

 

②fork버튼을 누르자마자 fork가 완료된 것을 확인할 수 있다. 

↓팀원의 화면

 

 

 

※step02 완료 후 상태

 

 

 

[step03]팀원은 git clone으로 로컬 저장소를 만든다.(최초1회)

-팀원은 자신의 원격 저장소(fork 해온 저장소)를 로컬 저장소에 git clone 해온다. (최초 1회)

-주의!!!!! 팀원 자신의 원격 저장소를 fork해가기!!!!!

 

방법은 아래 링크로 확인!

sjy1218vv.tistory.com/134

 

[Spring]깃헙 Clone하는 방법

- git hub 저장소 clone (Maven)

sjy1218vv.tistory.com

※step03 완료 후 상태

 

 

[step04] 팀원은 중앙 원격 저장소를 등록한다. (최초 1회)

-팀원은 중앙 원격 저장소 이름을 upstream으로 add해준다.

 

ⓛ로컬저장소로 지정한 폴더로 들어가서 빈곳에 우클릭 -> Git Bash Here 클릭

② 중앙원격저장소 등록하기

-저장소 add
git remote add [저장소이름 ex)upstream][중앙원격저장소 url] 

-add된 저장소 확인
git remote -v    

※step04완료 후 상태

 

 

 

[step05]팀원 자신이 구현할 기능 이름으로 브랜치 생성하고 그 브랜치로 이동 후 작업을 진행한다

-★주의!!!!!! 반드시 master 브랜치에서 브랜치를 생성해야한다!!!!!

-★주의2!!!!!! 브랜치 생성 후 반드시 checkout 작업을 진행해야한다.

(또 checkout하기 전 working tree 깨끗한지 반드시 확인해야함!!!)

-구현할 기능 이름으로 브랜치 이름을 짓는다.

-git 명령어로 하는 방법과 이클립스에서 하는 방법을 소개한다. 둘중에 하나를 선택해서 진행한다. 

 

[git 명령어로 하는 방법] 

-새로운 브랜치 생성
git branch [branch name]

-해당 브랜치로 작업 위치 이동
git checkout [branch name]

-새로운 브랜치 생성 + 해당 브랜치로 작업 위치 이동
git checkout -b [branch name]

 

[이클립스에서 하는 방법] 

① 프로젝트에 우클릭 -> Team -> Switch To -> New Branch

②Branch name입력 후 Finish

③gallery 로 브랜치가 잘 이동되었는 지 확인!★

※step05를 진행한 후 상태

 

 

[step06]로컬 저장소의 커밋이력을 팀원 자신의 원격 저장소로 push한다. 

-기능 구현을 다 끝냈으면 푸시할 때는 프로젝트 중앙 원격저장소가 아니라, clone해온 자신의 원격 저장소로 푸시한다. 

-push한 후 팀원 자신의 원격 저장소에 브랜치가 생긴다. 

 

①git staging창에서 변경된 부분 staged영역에 올린 후 commit msg와 함께 commit and push!

 

②origin인지 확인 후 next

③Finish클릭

 

※step06 완료 후 상태

 

 

[step07] 팀원은 팀장에게 pull request를 던진다.

 

①팀원 자신의 원격 저장소로 이동해 작업한 브랜치로 이동한다.

 

 ②pull request 버튼을 클릭한다. 

 

 

③적절한 메세지 입력 후 Create pull request 버튼을 클릭한다. 

 

④pull request탭에서는 pull request한 내역을 확인할 수 있다. 

 

※step07 완료 후 상태

 

 

 

[step08]팀장은 변경 내용을 확인한 후 중앙 원격 코드 베이스에 merge한다.

-팀장은 모든 팀원의 코드 내용을 확인하고 병합(merge)을 진행한다.

-충돌이 일어난 경우 충돌 내용을 수정한 후 병합(merge)를 진행한다.

-병합이 성공하면 중앙 원격 저장소의 main 브랜치에 새로운 내용이 갱신된다.

-★중앙 원격 저장소에 gallery branch가 생기는 것이 아닌, main branch에 gallery branch 내용이 갱신되는 것이다!

 

①팀장은 중앙 원격 저장소의 pull request탭을 클릭 해 각 pull request된 내용을 클릭해 들어간다. 

②base branch와 confilts된 내용이 있는 지 확인 후 Merge pull request 버튼을 클릭한다. 

③Confirm merge버튼을 클릭한다. 

④병합이 잘 되었는 지 확인한다. 

⑤실제로 main branch에 gallery branch의 내용이 갱신되는 것을 확인할 수 있다. 

※step08 진행 후 상태 

 

 

[step09]중앙 원격 저장소와 팀원 자신의 로컬 저장소를 동기화 하기 위해 작업 위치를 main branch로 옮긴다. 

-중앙 원격 저장소 코드 베이스에 변경내용이 있다면 팀원 자신의 로컬 저장소를 동기화 해서 최신상태로 만들어야한다.

-주의!!! 팀원은 중앙원격저장소와 자신의 로컬 저장소를 동기화 하기 위해 작업위치를 master branch로 이동한다. 

 

 

① 브랜치 이동 전 working tree가 클린 한지 항상 확인해야한다!

(가끔 왼쪽 상단의 저장버튼을 누르면 working tree에 변경된 내용이 찍힌다)

 

②main branch로 잘 이동이 되었는 지 항상 double check!

※step09 완료 후 상태

 

 

[step10]팀원은 중앙 원격 저장소 upstream에서 main에 pull 해서 로컬 저장소에 갱신한다.

-중앙 코드 베이스가 변경되었으므로, 모든 팀원들은 자신의 로컬 저장소를 동기화 해서 최신 상태로 만들어야 한다.

-주의!!!! 반드시 main branch에서 pull 해주어햐 한다!!!!!!

 

①프로젝트 우클릭 -> Teams -> pull...

(주의!!! pull버튼 누르면 안된당!!! pull.... 이 아련하게 생긴 pull버튼 눌러야한다!!)

반드시!! upstream(중앙 원격 저장소)로 변경 후 Finish를 누른다. 

③pull이 잘 진행되었으면 이런 화면이 뜬다! 이후 새로운 브랜치를 만들어 작업을 이어나가면 된다!

※step10 완료 후 상태

 

 

[step11]새로운 기능을 구현하기 위해 그 작업에 대한 branch를 생성해서 작업한다.

-새로운 기능을 표현하는 branch 이름을 지어 checkout 한 후 작업을 이어나간다.

 

※step11 완료 후 상태

 

 

 

[step12]반복한다.

기능 구현 완료 후 

팀원 자신의 원격저장소에 push한다. 

깃헙에서 팀원 자신의 원격저장소에 들어가 팀장에게 pull request를 보낸다.

중앙원격저장소에 새로운 커밋 내용이 있다면 브랜치를 main으로 옮긴 후 upstream에서 pull해온다.

 

팀원은 새로운 기능을 구현하기 위해 그 작업에 대한 branch를 생성하여 작업 한다.

기능 구현 완료 후 

팀원 자신의 원격저장소에 push한다. 

깃헙에서 팀원 자신의 원격저장소에 들어가 팀장에게 pull request를 보낸다.

중앙원격저장소에 새로운 커밋 내용이 있다면 브랜치를 main으로 옮긴 후 upstream에서 pull해온다.

 

팀원은 새로운 기능을 구현하기 위해 그 작업에 대한 branch를 생성하여 작업 한다.

기능 구현 완료 후 

팀원 자신의 원격저장소에 push한다. 

깃헙에서 팀원 자신의 원격저장소에 들어가 팀장에게 pull request를 보낸다.

중앙원격저장소에 새로운 커밋 내용이 있다면 브랜치를 main으로 옮긴 후 upstream에서 pull해온다.

.

.

.

반복해서 결과물을 만들어 낸다! 끝!

 

[참고] 충돌나는 경우는 무슨 경우가 있을까?

-충돌 나는 상황

list.jsp를 팀장이 만들어서 push했다. (v.1.0)

이걸 팀원이 fork 해가고 pull해갔다. (v.1.0)

그 사이에 팀장은 list.jsp를 수정해서 push했다. (v.1.1)

팀원은 그것도 모르고 list.jsp를 수정해서 자신의 원격저장소에 push하고 pull request를 던졌다. (v.1.1)

근데 두 내용은 다르다

 

팀원의 v.1.1로 할 것인가? 팀원의 v.1.1로 할 것인가? 둘을 합칠것인가?

 

 

 

-충돌 안나는 상황

list.jsp를 팀장이 만들어서 push했다. (v.1.0)

이걸 팀원이 fork 해가고 pull해갔다. (v.1.0)

팀원은 list.jsp를 수정해서 자신의 원격저장소에 push하고 pull request를 던졌다. (v.1.1)

 

팀장은 수락해서 팀원, 팀장 모두 v.1.1이 되었다. 

 

Comments