슬기로운 신입생활 - GIT편
2020. 02. 19
Jaewoo KIM
📚Contents
1. GIT 내부
2. 프로젝트 관리하기
- Branch
- Commit Message
- Code Review
- Rebase vs Merge
3. 부록
슬기로운 신입생활 - GIT
왜 Git을 알려주시는거죠??

슬기로운 신입생활 - GIT
우리는 필연적으로 협업을 해야함
다양한 개발과 테스트 환경
배포 후 장애대응
책임 회피
...
슬기로운 신입생활 - GIT
그래서 무엇을 알려줄 건가요?

슬기로운 신입생활 - GIT
저는 누군가에게 Git을 알려줄 정도로 잘하지는 않습니다😭
💁♂️ GIT 내부
Plumbing vs Porcelain
Git 내부
Plumbing 명령어
저수준 명령어, 직접 커맨드라인에서 실행하기보다 새로운 도구를 만들거나 각자 필요한 스크립트를 작성할 때 사용
Porcelain 명령어
사용자용 명령어, add / push/ commit / etc...
Plumbing vs Porcelain
Git 내부
key-value storage
Plumbing
Porcelain
GUI (Kraken...)
IDE (Intelij...)
.git 구성요소
Git 내부

Git objects
Git 내부
Blob
40자리의 Hash값으로 파일명이 생성되며 파일내용이 저장됨
내용이 같다면 Blob을 한개만 저장
Tree
디렉토리의 내부 파일과 디렉토리 정보를 관리
Commit
author, commiter, commit message를 포함
Git objects - 파일 생성
Git 내부

Git objects - 파일 변경
Git 내부

Git objects - branch
Git 내부

Git objects - merge
Git 내부

👨👩👦👦 프로젝트 관리하기
Git Branch
👨👩👦👦 Git Branch
팀 또는 그룹간의 규칙을 정하고 실천해야 한다
프로젝트 관리하기
- 효과적으로 관리하기 위한 전략 수립
- Branch 별 권한 (Write, Read...)
- Best Practice는 Git Flow 하지만...
- Branch Naming

👨👩👦👦 Git Branch
팀 또는 그룹간의 규칙을 정하고 실천해야 한다
프로젝트 관리하기
- 효과적으로 관리하기 위한 전략 수립
- Branch 별 권한 (Write, Read...)
- Best Practice는 Git Flow 하지만...
- Branch Naming

👨👩👦👦 Git Branch
팀 또는 그룹간의 규칙을 정하고 실천해야 한다
프로젝트 관리하기
- 효과적으로 관리하기 위한 전략 수립
- Branch 별 권한 (Write, Read...)
- Best Practice는 Git Flow 하지만...
- Branch Naming

여러 모듈이 존재한다면?
👨👩👦👦 Git Branch
팀 또는 그룹간의 규칙을 정하고 실천해야 한다
프로젝트 관리하기
- 효과적으로 관리하기 위한 전략 수립
- Branch 별 권한 (Write, Read...)
- Best Practice는 Git Flow 하지만...
- Branch Naming
Git Commit
👨👩👦👦 Git Commit - Message
좋은 커밋 메시지는 패치에 관한 세 가지 질문에 답을 할 수 있어야 한다
프로젝트 관리하기
- 좋은 커밋 메시지란?
- 커밋 메시지를 잘 작성하면?
- 이것만은 지양하자
- 왜 이 코드가 필요한가?
- 어떻게 이슈를 해결 했는가?
- 패치가 어떤 영향을 만드는가?
👨👩👦👦 Git Commit - Message
좋은 커밋 메시지의 목적은 다음과 같다
프로젝트 관리하기
- 좋은 커밋 메시지란?
- 커밋 메시지를 잘 작성하면?
- 이것만은 지양하자
- 리뷰 프로세스가 빨라진다 ✈️
- 좋은 릴리즈 노트를 작성하게 돕는다 📃
- 미래 코드 관리자의 이해를 돕는다 🔮
👨👩👦👦 Git Commit - Message
커밋을 할때 최소한 다음과 같은 것들은 지양하도록 한다
프로젝트 관리하기
- 좋은 커밋 메시지란?
- 커밋 메시지를 잘 작성하면?
- 이것만은 지양하자
- 소스코드 관리는 백업 시스템이 아니다 ❌
- 의미있는 커밋 메시지를 작성하자 ❌
- 패치와 관계 없는 공백 변경 ❌
Online Code Review
👨👩👦👦 Online Code Review
비트버킷을 활용한 온라인 코드 리뷰 프로세스는 다음과 같다
프로젝트 관리하기
1. feature/{name} 브랜치 생성
2. 기능 개발 완료 후 develop 브랜치로 pull request
3. 리뷰어들의 코드리뷰 진행 및 승인/반려 처리
4. 리뷰 과정이 끝나면 develop에 merge
👨👩👦👦 Online Code Review
코드리뷰가 어느순간 부터 병목이 되었다
프로젝트 관리하기
1. feature/{name} 브랜치 생성
2. 기능 개발 완료 후 develop 브랜치로 pull resquest
3. 우선순위가 밀려 멤버들의 코드리뷰 진행이 미뤄짐
5. 멤버들이 승인하지 않았지만 develop에 merge
4. 리뷰 할 피처가 쌓이고 대기 시간이 길어짐
❗️ 일정 지연
어떻게 하면 코드리뷰를
잘 진행할 수 있을까?
🤔
👨👩👦👦 Online Code Review
코드리뷰 문화가 잘 자리잡히기 위해서는 멤버 모두가 노력해야 된다
프로젝트 관리하기
- 리뷰는 당연한 과정이라고 느껴지도록 만들자
- 코드는 코드일 뿐, 상처받지 말자
- 모든 멤버가 리뷰 문화를 받아들이도록 하자
- 리뷰 마스터 도입을 검토하자
👨👩👦👦 Online Code Review
프로젝트 관리하기
유익한 리뷰
- 미리 발견하는 버그
- 기존 코드의 히스토리
- 더 나은 로직의 제안
- 더 나은 변수명 제안
불필요한 리뷰
- 취향의 차이 (if vs switch)
- 애매한 수준의 변수명 제안
- 미묘한 성능 개선 제안
- 아주 먼 미래에 대한 방어 코드
Git Rebase vs Git Merge
👨👩👦👦 기능 개발 프로세스
프로젝트 관리하기
1. feature/{name} 브랜치 생성
2. 변경/추가 파일 add & commit
3. 원격지로 부터 fetch
4. 변경사항 merge 또는 rebase
일반적으로 Git을 이용한 기능개발은 다음과 같이 이뤄진다.
5. 원격지로 변경사항 push
👨👩👦👦 브랜치 생성 후 변경사항 커밋
프로젝트 관리하기
git checkout -b feature
git commit -am "Add new commit"
develop
feature
Git Merge를 사용한다면?
👨👩👦👦 develop 변경 사항을 확인
프로젝트 관리하기
git fetch
develop
feature
👨👩👦👦 Git Merge
프로젝트 관리하기
git merge remote/develop
develop
feature
👨👩👦👦 기능 개발 완료
프로젝트 관리하기
git push origin feature
git request-pull
develop
Git Rebase를 사용한다면?
👨👩👦👦 develop 변경 사항을 확인
프로젝트 관리하기
git fetch
develop
feature
👨👩👦👦 Git Rebase
프로젝트 관리하기
git rebase remote/develop
develop
feature
👨👩👦👦 기능 개발 완료
프로젝트 관리하기
git push origin feature
git request-pull
develop
👨👩👦👦 Merge vs Rebase
프로젝트 관리하기


Merge를 수행했을 경우
Rebase를 수행했을 경우
👨💻부록
Git Submodule
👨💻 웹페이지 디자인을 적용할 때...

1. 디자이너의 결과물을 개발자에게 전달
2. 개발자는 변경된 파일을 붙여넣기
3. Commit & Push
4. 서비스 배포
appendix A: submodule

1. 디자인과 개발에 적용된 버전 차이 발생
2. 프로젝트 진행중 수정이 빈번하다면
불필요한 커밋 발생
👨💻 웹페이지 디자인을 적용할 때...
appendix A: submodule

서비스 레포지토리
(service_repo)
디자이너 레포지토리
(design_repo)
👨💻 Submodule을 활용하자
appendix A: submodule
Git hooks
👨💻 코드 리뷰에서 자주 발견되는 사항
appendix B: hooks
- 커밋 메시지 규칙
- 코딩 컨벤션 (들여쓰기, 괄호 ...)
- 테스트 코드
👨💻 Git hooks을 활용하자
appendix B: hooks
커밋에서 변경이 발생한 파일에 대해서 린트 검사
Git-svn
appendix C: git-svn
당장 Git으로 옮기기 부담된다면...🤔
👨💻 Git-svn 사용하기
appendix C: git-svn
Local
Remote
SVN
GIT
git svn dcommit
git svn rebase
git add
git commit
git branch
git stash
1. 커밋 메시지를 수정하고 싶어요
2. reset 명령어로 파일이 없어젔어요
...
끗
슬기로운 신입생활 - GIT
By Jaewoo KIM
슬기로운 신입생활 - GIT
- 372