슬기로운 신입생활 - 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 명령어로 파일이 없어젔어요

...

Made with Slides.com