1. 체계화 강화
2. 원활한 개발 환경 구축
3. 협업 및 소통의 개선
4. 배포시 문제사항 개선
SVN이란
SVN
은 SubVersion 단어의 줄임말로 중앙집중형 버전 관리 시스템(CVCS)입니다.각각의 개발자들이 본인의 코드 변경 사항을 하나의 중앙 저장소 (Center Repository) 에 commit 하는 방식으로 운영합니다.
즉, 로컬 PC에서 커밋 시 중앙 저장소에 바로 반영되고 중앙 저장소에 있는 내용들을 다른 로컬 PC에 업데이트 시킬 수 있습니다.
> `Git` 이란 **분산형 버전 관리 시스템(DVCS)**입니다. 모든 사용자가 중앙 서버와 독립적으로 로컬에 프로젝트의 전체 히스토리와 파일을 복사해둡니다. 즉, Git을 사용하면 중앙 서버와 연결되지 않은 상태에서도 로컬에서 커밋하고, 나중에 서버와 동기화할 수 있습니다.
>
Git과 SVN은 모두 버전 관리 시스템(VCS)이지만, 구조와 기능 면에서 큰 차이가 있습니다. 이 두 시스템의 차이점을 이해하면 어떤 환경에서 어떤 시스템이 더 적합한지 판단할 수 있습니다. 아래는 주요 차이점입니다.
여러 개발자가 하나의 저장소에 작업을 할 때, 협업을 좀 더 효과적으로 하기 위해
git branch 에 대한 규칙을 정하고 저장소를 잘 활용하기 위한 workflow 를 정의하는 것을 바로 git branch 전략이라고 합니다.
**branch란?** 브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념입니다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에 여러 작업을 동시에 진행할 수 있습니다.
소프트웨어 개발 팀에서는 프로젝트의 특성에 따라 적절한 브랜치 배포 전략을 채택하는 것이 중요합니다.
브랜치 종류는 다음과 같습니다.
master
: 제품 출시 버전을 관리하는 메인 브랜치 develop
: 다음 출시 버전을 위해 개발하는 브랜치feature
: 새로운 기능을 개발하는 브랜치 release
: 다음 출시 버전을 준비하는 브랜치hotfix
: 출시된 제품의 버그를 고치기 위한 브랜치Git-Flow전략을 도입했을 시, 문제 상황
main branch 하나만 사용했을 시, 문제 상황
롤백 시키려면 하나하나 커밋을 다 찾아봐야하는 번거로움이 존재함.
누가 어떤 작업을 했는지 추적하기 어려워 질 수 있음.
시점이 다른 두 사람이 push를 하는경우 이전에 개발한 기능들이 없어지는 경우가 존재함.
불완전한 코드가 머지될 가능성이 높아짐.
테스트 환경의 부족함이 발생할 수 있음.
CI/CD 도입 시, 바로 배포되는 상황.
해결 방안
master
⇒ 배포를 위한 브랜치dev
⇒ 1명이 개발을 진행하더라도 dev브랜치는 필요feature
⇒ 2명 이상 개발자가 투입 된경우 필요 추가적 필요 사항
commit convention 설정 (하단에 있는 내용은 예시) : 어떤 커밋을 했는지 쉽게 알아보기 위해
Tag Name | Description |
---|---|
[FEAT] | 새로운 기능을 추가 |
[FIX] | 버그 수정 |
[DESIGN] | CSS 등 사용자 UI 디자인 변경 |
[!BREAKING CHANGE] | 커다란 API 변경의 경우(URI 주소 외 Request, Response 가 변경되는 경우) |
[!HOTFIX] | 급하게 치명적인 버그를 고쳐야하는 경우 |
[STYLE] | 코드 포맷 변경, 세미 콜론 누락, 코드 수정이 없는 경우 |
[REFACTOR] | 프로덕션 코드 리팩토링 |
[DOCS] | 문서 수정, 필요한 주석 추가 및 변경 |
[TEST] | 테스트 코드, 리펙토링 테스트 코드 추가, Production Code(실제로 사용하는 코드) 변경 없음 |
[PACK] | 빌드 업무 수정, 패키지 매니저 수정, 패키지 관리자 구성 등 업데이트, Production Code 변경 없음 |
[RENAME] | 파일 혹은 폴더명을 수정하거나 옮기는 작업만인 경우 |
[REMOVE] | 파일을 삭제하는 작업만 수행한 경우 |
[COMPLETION] | 작업을 완료하고 마지막 커밋을 작성하는 경우 |
[MERGE] | 병합 |
[CONFLICT] | 병합 시 충돌 해결 |
[DEPLOY] | 배포 관련 커밋 |
ex1) [FEAT] jwt를 활용한 로그인 기능 구현
ex2) <요구사항 번호 OR 이슈번호> 간략화된 제목 및 내용 ⇒ Jira
와 연동시에 필요해보임
리뷰어 설정
하나의 이슈(티켓)에는 한번의 커밋을 목표로 설정
하나의 브랜치라고 하더라도 여러개의 불필요한 커밋 상황이 있다면 찾아보기 불편할 가능성이 있음.
git rebase ⇒ 히스토리를 rebase를 하는 작업이므로 신중하게 진행
현재 불필요한 커밋 상황이 여러개 있다면 squash를 진행 (해당 작업은 merge직전에 진행)
⇒ git rebase -i HEAD~3 (3개의 커밋을 합친다.)
⇒ Vim이 열렸다면 “i”를 눌러 insert 진행
pick <첫 번째 커밋 해시> 메시지 1
squash <두 번째 커밋 해시> 메시지 2
squash <세 번째 커밋 해시> 메시지 3
이런식으로 커밋을 합쳐서 하나의 커밋으로 만들수있음
작업 브랜치를 rebase 진행 (해당 작업은 브랜치 작업을 순차적으로 만들기 위함)
⇒ git pull –rebase origin feature-user (로컬 브랜치의 **시작점을 원격 저장소의 최신 변경 사항으로 바꾸는 작업**)
⇒ 만약 conflict오류가 나왔다면 모든 충돌 해결후 나머지 진행
```bash
git add <충돌 해결된 파일>
git rebase --continue
```
해당 모든 rebase 작업들을 마치게 된다면
그래프가 깔끔하게 변경됨. ⇒ 히스토리를 찾아보기 쉬워짐
개발 도중 원격 저장소에 있는 dev브랜치에 내가 필요로하는 기능이 update되었을 경우
현재 작업 중인 변경 사항을 stash를 통해 임시로 저장하는 작업
git stash
git pull origin <개발 메인 브랜치>
성공적으로 pull을 했다면, 임시저장한 stash를 불러옴
git stash pop
해당 작업을 진행하면 충돌이 발생할 수 있음 해결 후 git add 진행