2023. 2. 6. 17:18ㆍ프로그래밍/Git
Github 로 협업하기
1. github collaborator (협업자) 로 등록하기
repo > Settings > Collaborators > add people
이름 또는 이메일 입력 후 초대하기
초대받은 사람이 이메일에서 초대를 수락 해야 협업자가 됨
해당 repo 에서 push, pull 등 가능
2. git clone 으로 프로젝트 시작하기
git clone [repo 주소]
git clone
- epo 를 그대로 내 컴퓨터로 가져오고 싶을 때 사용하는 명령어
- 단순한 다운로드와는 다르게 commit 기록, history 를 모두 가져옴
- git reset 명령어를 통해 이전 기록으로 돌아갈 수 있음
- pull, push 등을 통해 실제 repo 에 수정 사항을 반영하거나 내려받을 수 있음
clone 을 통한 협업 방법
- 팀장이 repo 를 생성함
- 팀원들을 해당 repo 의 collaborator 로 등록함
- 팀원들은 팀장의 repo 를 clone 받아서 사용함
- collaborator 로 등록되면 push, pull 권한이 있기 때문에 repo 를 함께 관리할 수 있음
git fetch 를 통해 수정사항 확인하기
git fetch
깃허브 상의 수정사항을 바로 내 컴퓨터에 반영하는 것이 아니라
우선 내 컴퓨터의 다른 branch 로 수정사항을 가져오고,
원할 경우 해당 branch 로 checkout 해서 수정사항을 받아오는 명령어 (브랜치 형태로 받아옴)
존재하는 브랜치 확인
git branch -r
브랜치 변경 (수정사항 반영)
git checkout [수정사항을 가져올 브랜치]
3. fork 로 원격 저장소 복제하기
fork
- 다른 사람의 repo 를 복제해서 내 repo 를 새로 만드는 기능
- clone 과 마찬가지로 파일 뿐만 아니라 commit 기록까지 모두 복제함
- fork 한 repo 는 내 소유이기 때문에 자유롭게 clone, push, pull 가능
clone vs fork
- clone : 다른 사람이 만든 repo 그 자체를 내 컴퓨터에 받아오는 기능
- fork : 다른 사람이 만든 repo 를 복제해서 새롭게 내 repo 를 만들고, 내 repo 를 내 컴퓨터로 받아오는 기능
연결되어 있는 repo 확인
git remote -v
// origin https://github....
원본 repo 를 upstream 이름으로 추가
git remote add upstream [원본 repo 주소]
원본 repo 수정사항을 내 컴퓨터에 반영
git pull upstream [브랜치 이름]
내 컴퓨터 수정사항을 내 repo 에 반영
git push origin [브랜치 이름]
pull request
- 내 컴퓨터 수정사항을 원본 repo 에 반영
- 해당 repo 의 관리자에게 내가 수정한 코드를 원본 repo 에 반영하는 것을 부탁하는 기능
- 보통 관리자가 코드 리뷰 진행 후, 반영 여부를 결정하고 실제로 반영함
수정사항 push > github repo 페이지 > Ctrate pull request 버튼클릭
- 무엇을 수정했는지 요약해서 작성함
- 작성한 pull request 에 대해서 사람들이 코드 리뷰를 comment 형태로 작성함
- 관리자가 해당 코드를 현재 프로젝트에 merge 함
fork 를 통한 협업 방법
큰 단위의 프로젝트일 경우 바로 원본 repo 에 대해서 clone 을 사용하지 않고
하나의 큰 repo 를 생성한 후, 팀/사람 별로 fork 를 해서
각자 팀마다 하나의 repo 를 관리하는 방식으로 협업이 이루어짐
팀 repo 에서 수정사항이 있다면
pull request 를 작성하여 원본 repo 에 해당 수정사항을 반영해 달라고 요청하게 됨
그 후 최종 관리자 / 코드 리뷰어가 해당 코드를 보고
합쳐도 된다고 판단이 될 경우 해당 코드를 원본 repo 에 반영시킴
소규모 스타트업에서는 fork 까지 사용하지 않고, 대부분 clone 으로 처리함
- 원본 repo 를 안전하게 관리할 수 있음
- 팀/사람 단위로 작업 사항을 관리할 수 있음
Github 에서 Branch 활용하기 (Pull Request)
1. Pull Request 의 개념과 목적
나의 담당 브랜치에서 작업이 완료되었으니
이 브랜치의 코드를 가져가서 병합해 달라고 요청을 보내는 것
현업의 git 관리 방식
1. main 브랜치
사용자가 이용할 서비스의 코드가 담기는 브랜치
2. develop 브랜치
사용자에게 서비스를 배포하기 이전에 모든 기능들이 통합되어서 테스트를 진행하는 브랜치
테스트 완료 시 main 브랜치에 코드를 통합해서 실제로 사용자가 이용하는 서비스에 코드가 반영됨
(보통 테스트용 브랜치가 따로 존재함)
3. feature ~ 브랜치
서비스의 기능을 분할해서 기능 하나를 구현하는 브랜치
하나의 기능 구현이 완료되면 develop 브랜치로 내 코드를 통합해달라고 요청을 보냄
Pull Request 를 하는 이유
- 내가 작성한 코드가 바로 merge 될 경우 발생할 수 있는 문제 미리 방지
- 현재 코드에 대한 코드 리뷰 진행
- 프로젝트에 대한 진행 상황 관리
2. Pull request 사용해보기
git add + commit + push 후
github repo 에서 Compare & pull request 버튼 클릭 후 내용 작성
Pull Request 작성 내용
- 현재 PR 요약
- 코드 변경 이유
- 관련 스크린샷
- 테스트 내용
- 리뷰 관련 요청사항
3. Pull Request 에서 코드 리뷰 작성 후 병합하기
add single comment: 바로 해당 코드 부분에 대해 코멘트를 달 수 있음
start a review: 코드의 여러 부분에 대해서 코멘트를 작성한 후 finish your review
- 바꿀 것이 없을 경우: approve (승인) 체크 후 submit review
- 바꿀 것이 있을 경우: request changes (수정 요청) 체크 후 submit review
코멘트 단 부분이 잘 수정되었으면 resolve conversation
리뷰 사항에 대한 수정이 모두 이루어졌을 경우 관리자가 merge 진행
Delete branch 버튼을 클릭하여 해당 브랜치 삭제 가능
이미 해당 브랜치에서 할 작업이 끝났기 때문에 작업중인 브랜치만 남기고 모두 삭제
pull request > closed 클릭 시 지금까지 진행된 작업 확인 가능
4. pull request 완료 후 로컬에 반영하기 (git fetch --prune)
git pull origin main
로컬 main 브랜치의 파일이 github 와 동일해짐
git fetch --prune
컴퓨터가 pull request 이후 github 상에서 삭제된 브랜치들을 인식함
git pull 과정에서 발생할 수 있는 오류 방지
git branch -D [삭제된 브랜치 이름]
pull request 가 merge 된 이후 로컬 브랜치 삭제
4. Pull request 시의 merge conflict 해결해보기
PR을 보낸 후 this branch has conflicts that must be resolved 라는 경고문이 뜸
바로 merge 할 수 없고 conflict 를 해결해야 한다는 뜻
여기서 resolve conflicts 버튼을 누르고 conflict 를해결하기 보다는
아래처럼 vscode 상에서 해결하는 것이 좋음
git switch [merge 하려는 브랜치]
git pull origin [merge 하려는 브랜치]
git switch [conflict 브랜치]
git merge [merge 하려는 브랜치]
// 충돌 해결
git add .
git commit -m "Etc: Merge ...."
git push origin [conflict 브랜치]
커밋 이력이 충돌나지 않게 정리된 상태로 github 에 올라감
이미 pull request 를 생성한 상황에서 해당 브랜치 내부 파일을 수정한 후에 push 하면
새롭게 pull request 를 생성하지 않아도 자동으로 해당 pull request 에 수정사항이 반영됨
Github 자체 기능 활용하기 (issue, milestone 등)
1. issue, label, milestone 의 개념
issue
앞으로 구현할 기능 / 버그 fix 등의 할 일을 정리해놓는 용도로 사용
오픈 소스 프로젝트에서는 버그를 제보하기 위한 용도로 사용하기도 함
issue 상세 페이지에서 close 시 milstone 진행 상황에 반영됨
label
특정한 issue 가 어떤 카테고리에 해당하는지 알려주는 역할
milestone
issue 의 집합
작업이 완료된 issue 가 얼마나 있는지에 따라 진행 상황을 %로 표시해 줌
순서
- milestone 생성
- label 생성
- issue 생성 + milestone, label, assignee (담당자) 선택
2. issue 와 pull requert 함께 사용하기
Pull request 작성 시 Close [이슈 번호] 를 넣어주면 해당 PR 과 Issue 가 연결됨
해당 PR 이 완료되면 자동으로 해당 Issue 가 close 되면서 완료 처리됨 (마일스톤에도 반영됨)
close 가 아니더라도 다음과 같은 단어 사용 가능
- close
- closes
- closed
- fix
- fixes
- fixed
- resolve
- resolves
- resolved
Git 관리 전략
1. git commit convention 정하기
// 제목
Feat: "로그인 함수 추가"
// 본문
로그인 요청을 위한 함수 구현
// 꼬리말
Closes: #123
커밋 메시지 작성 규칙
- 제목과 본문은 한 줄을 띄워서 작성
- 제목은 영문 기준 50자 이내로 작성
- 제목 첫글자는 무조건 대문자로 작성
- 제목 끝에 마침표는 찍지 않음
- 제폼은 개조식으로 작성 (ex. Update code, Fix bug ...)
- 본문은 영문 기준 72자마다 줄바꿈
- 본문은 무엇을, 왜에 맞추어 작성
커밋 제목 작성 규칙
- 50자 이내
- 대문자로 시작
- 마침표 없이 작성
- 개조식으로 작성
- "타입: 내용" 형식으로 작성
커밋 타입
- Feat : 새로운 기능 추가
- Fix : 버그 수정
- Env : 개발 환경 관련 설정
- Style : 코드 스타일 수정 (세미 콜론, 인덴트 등의 스타일적인 부분만)
- Refactor : 코드 리팩토링 (더 효율적인 코드로 변경 등)
- Design : CSS 등 디자인 추가/수정
- Comment : 주석 추가/수정
- Docs : 내부 문서 추가/수정
- Test : 테스트 추가/수정
- Chore : 빌드 관련 코드 수정
- Rename : 파일 및 폴더명 수정
- Remove : 파일 삭제
커밋 본문 작성 규칙
- 한 줄당 72자 이내
- 최대한 상세히 작성
- 무엇을, 왜 변경했는지 작성
꼬리말 작성 규칙
- 선택 사항임
- "유형: 이슈번호" 형식으로 작성
- 이슈를 닫는 메시지는 본문에 작성하기도 함
- 유형은 "Close, Fix, Resolve" 등을 활용
- Close: 일반 개발 이슈를 닫을 때
- Fix: 버그 이슈를 닫을 때
- Resolve: 문의/요청사항에 대한 이슈를 닫을 때
커밋 메시지 줄글 형태로 작성하기 (vim 편집기 실행)
git commit
2. issue, pull request template 만들어보기
issue, pull request 를 작성하기 위한 틀을 만들 수 있음
시간 단축 + 팀원 간 작성 양식 통일 가능
.github/pull_request_template.md
## 작업 개요 (이슈 번호)
## 작업 내용 (변경 사항)
## 스크린샷
## 테스트 결과
## 리뷰 요청 사항
.github/issue_template.md
## 목적
## 세부 내용
repo > Settings > General > Issue 에서 Get organized with issue templates 버튼 클릭 시 여러가지 템플릿 추가 가능
3. branch protection 을 통해 branch 보호하기
repo > Settings > Branches > add Branch protection rule 버튼 클릭
Branch name pattern 에 브랜치 이름 또는 패턴 작성 (main, feature* ...)
필요한 보호 옵션 선택 가능, 주로 아래 옵션들 사용
Require a pull request before meging
- merge 이전에 pull request 가 필요 (pull request 를 통해서만 해당 브랜치로 merge 가능)
Require conversation resolution before merging
- 코드 리뷰에 달린 conversation 이 모두 해결 (resolve) 된 경우에만 merge 가능
Do not allow bypassing the above settings
- 그 누구도 위 보호 옵션을 우회할 수 없음 (repo 관리자도 불가능)
4. git pull 시 발생하는 에러 해결하기
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # marge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only. # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rabase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
해당 에러는 현재 로컬 브랜치의 커밋 이력과, 리모트 브랜치의 커밋 이력이 충돌하는 경우 발생함
git pull 의 원리는 리모트 브랜치와 로컬 브랜치를 merge/rebase 를 통해 합치는 것으로 이루어짐
이 에러는 git pull 을 할 때 merge/rebase/fast-forward merge 중에 무엇을 선택할 지 지정하라는 에러임
git pull origin main --no-ff
git config pull.rebase false 명령어로 git 설정 자체를 바꾸는 것 보다는
정확히 내가 원하는 pull 형태를 지정하는 것이 좋음 (--no-ff: no fast forward merge 방식으로 pull 진행)
이후 confilct 부분을 수정한 후 commit 하면 해결 완료
Github 를 활용한 협업
- 우리 팀만의 git flow, commit convention, issue/pr template, issue label 을 정함
- 팀장은 해당 template 등을 적용한 github repo 생성 / 팀원 등록
- 앞으로 구현할 작업을 기능 단위로 세분화
- 기능 단위의 작업에 대해 각자 담당을 정함
- 각 담당자는 github 에 해당 기능에 대한 issue 생성
- 팀장은 작업기한을 정해서 milestone 생성
- 팀장은 github repo 에 최초 commit/push 진행
- 이후 branch protection 설정
- 구현할 기능에 대한 파일들/폴더 트리까지 모두 생성한 상태로 최초의 push 진행
- 팀원은 해당 repo 를 clone 받음
- 각자 기능에 대한 branch 생성 후 작업 진행
- 작업 완료 시 main 브랜치로 pull request 를 보냄
- 팀원들은 pull request 된 코드를 보고 코드 리뷰를 남김
- 수정사항이 모두 해결이 되면 approval 코드 리뷰를 남김
- 팀장은 approval 코드 리뷰가 있는 pull request 에 대해 merge 진행
- merge 완료 후 관련 issue 가 닫히고, milestone 에 진행 상황이 업데이트 됨
주의사항
- 팀원 간에 브랜치 명 통일 (feature / ) 필요
- 이슈 활용 시에는 이슈번호를 브랜치에 같이 작성해줘도 좋음
- close 와 관련해서, 커밋 메세지에 작성을 해도 되고, pr 안에 작성을 해도 됨
- 라벨 관련해서, 커밋 메세지 타입에 맞춰서 직접 라벨을 만드는 것을 추천
- issue, pr 의 경우에도 접두사를 만드는 것을 추천
- wiki / readme.md 에다가 우리팀만의 convention 을 정리
- (커밋 메세지에 쓸 타입들을 전부 readme.md 에다가 정리해놓고 거기 맞춰서 진행)
- 팀장이 하는 첫번째 커밋에도 Env: 등의 commit type을 붙이는 것을 추천