컴퓨터는 잘못이 없다..
[GIT]Forking Workflow 로 협업하기 본문
[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해가기!!!!!
방법은 아래 링크로 확인!
[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이 되었다.