[교육] Git & GitHub 초급 교육
준비
SourceTree
참고영상
NHN Forward 2019
https://forward.nhn.com/2019/seoul/presentation-session
https://www.youtube.com/watch?v=etnFe2tBD5I&feature=youtu.be
실습파일
규칙
Look
슬라이드 내용에 집중합니다.
D.I.Y
직접 실습합니다.
버전 관리 시스템
버전 관리 시스템 [Look]
- Version Control System; VCS
- 파일의 변화를 시간에 따라 기록하여 과거 특정 시점의 버전으로 다시 불러올 수 있는 시스템
- 개별 파일 혹은 프로젝트 전체를 이전 상태로 되돌리기
- 시간에 따른 변경 사항을 검토
- 문제가 되는 부분을 누가 마지막으로 수정하였는지 찾기
- 파일을 잃어버리거나 무언가 잘못되어도 대개 쉽게 복구 가능
로컬 버전 관리 시스템 [Look]
- 대부분의 사람들이 버전 관리를 위해 쓰는 방법은 파일을 다른 디렉토리, 다른 이름으로 복사하는 것
- 이 방법은 간단하지만 실수가 발생하기 쉬움
- 파일을 덮어쓰거나 의도하지 않은 위치로 복사
- 이 문제를 해결하기 위하여 오래전 프로그래머들은 간단한 데이터베이스에 파일의 변경 사항을 기록하는 로컬 버전 관리 시스템을 만듦
- ex) RCS
중앙집중식 버전 관리 시스템 [Look]
- 여러 개발자들과 함께 작업하려면?
- 중앙집중식 버전 관리 시스템(Centralized Version Control System; CVCS) 탄생
- ex) CVS, Subversion, Perforce
- 파일을 저장하는 하나의 서버
- 중앙 서버에서 파일을 가져오는 다수의 클라이언트
장점
- 누구나 다른 사람이 무엇을 하고 있는지 알 수 있음
- CVCS를 관리하는 것은 수많은 클라이언의 로컬 데이터베이스를 관리하는 것보다 쉬움
단점
- 중앙 서버가 잘못되면 모든 것이 잘못된다
- 서버가 다운될 경우 다시 복구할 때까지 다른 사람과 협업도 진행 중이던 작업을 버전 관리하는 것도 불가능
분산 버전 관리 시스템 [Look]
- Distributed Version Control System; DVCS
- Git, Mercurial, Bazaar, Darcs
- 클라이언트가 저장소를 통째로 복사
- 서버에 문제가 생겨도 어느 클라이언트든 복제된 저장소를 다시 서버로 복사하면 서버가 복구됨
Git 기초
Git 역사 [Look]
- 리눅스 커널은 패치 파일와 단순 압축 파일로 관리
- 2002년 BitKeeper라는 상용 DVCS를 사용
- 2005년에 BitKeeper의 무료 사용이 제고됨
- 리눅스 개발 커뮤니티가 자체 도구를 만드는 계기
- 목표
- 빠른 속도
- 단순한 구조
- 비선형적인 개발 (수천 개의 동시 다발적인 브랜치)
- 완벽한 분산
- 리눅스 커널 같은 대형 프로젝트에도 유용할 것(속도나 데이터 크기 면에서)
- 2005년 Git 탄생
델타가 아니라 스냅샷 [Look]
Subversion이나 비슷한 VCS
- 각 파일의 변화를 시간순으로 관리
Git
- Git의 데이터는 파일의 스냅샷
- 파일이 달라지지 않으면 이전 버전의 링크만 저장
거의 모든 명령을 로컬에서 실행 [Look]
- 거의 모든 명령이 로컬 파일과 데이터만 사용
- 프로젝트의 모든 히스토리가 로컬 디스크에 있기 때문에 모든 명령을 순식간에 실행
- ex) 프로젝트의 히스토리를 서버 없이 조회 -> 빠른 조회 가능
- 비행기나 기차 등에서 작업하고 네트워크에 접속하고 있지 않아도 커밋 가능
Git의 무결성 [Look]
- 모든 데이터를 저장하기 전 체크섬(해시)을 구하고 그 체크섬으로 데이터를 관리
- SHA-1 해시 사용
- 40자 길이의 16진수 문자열
- ex) 24b9da6552252987aa493b52f8696cd6d3b00373
- 파일을 이름으로 저장하지 않고 해당 파일의 해시로 저장
세 가지 상태 [Look]
- Committed
- 데이터가 로컬 데이터베이스에 안전하게 저장 됨
- Modifed
- 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않음
- Staged
- 수정한 파일을 곧 커밋할 것이라고 표시
- Git으로 하는 기본적인 일
- 워킹 디렉토리에서 파일을 수정
- Staging Area에 파일을 Stage해서 커밋할 스냅샷을 만듦
- Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장
기초 설정
SourceTree 설치 [D.I.Y]
macOS
- 다운로드한 파일을 실행 후 Move to Applications Folder 클릭
- 다음 사항에 동의합니다에 체크, 계속 클릭
- 기존 계정 사용 클릭
- 로그인 혹은 가입
- My Atlassian으로 가기 클릭 (오번역 같습니다)
- 설정 건너뛰기 클릭
Windows
- 동의합니다에 체크, 계속 클릭
- 기존 계정 사용 클릭
- (UI가 좀 깨지지만) 로그인 혹은 가입
- 계속 클릭
- 설정 건너뛰기 클릭
- SSH 키를 불러오시겠습니까?에 No 클릭
- 단일 SourceTree용 내장 Git를 다운로드 받으세요 클릭 후 git 설치
- Mercurial을 사용하지 않겠습니다 클릭
- 실습 노트북에 이미 SourceTree가 설치되어 있으면 이전 사람들의 인증 정보를 지워줍니다.
- [도구] - [옵션] - [인증] 탭의 계정 / 저장된 비밀번호를 모두 지우세요.
GitHub 가입 [D.I.Y]
-
가입
- 첫 화면에서 바로 가입 가능
- ID, 이메일, 비밀번호를 입력 후 가입
-
플랜 선택
- Unlimited plublic repositories for free 선택
- Unlimited plublic repositories for free 선택
-
설문은 Submit
-
중요!!
- 가입 시 입력한 이메일 수신함에서 이메일 유효성 검사를 꼭 하도록 함
- 가입 시 입력한 이메일 수신함에서 이메일 유효성 검사를 꼭 하도록 함
Git 기초 사용법
저장소 생성 [Look]
-
GitHub에서 Start a project 클릭
-
혹은 상단 + 기호의 New repository 클릭
-
Repository name에 calculator 입력
-
Initialize this repository with a README 체크
저장소 생성 [D.I.Y]
calculator라는 이름의 저장소를 하나 생성하세요
꼭 README 생성에 체크
저장소 복제 [Look]
저장소 주소 복사
- Clone or download 클릭 후 클립보드 아이콘 클릭
SourceTree에서 저장소 추가
macOS
-
저장소 브라우저의 + 새 저장소 - URL에서 복사
-
Source URL 입력 후 Tab키 입력하면 나머지 자동으로 입력
-
클론 클릭
-
복제 완료
Windows
-
메인 윈도우의 Clone 클릭
-
소스 경로 / URL 입력 후 Tab키 입력하면 나머지 자동으로 입력
-
클론 클릭
-
복제 완료
저장소 복제 [D.I.Y]
calulator 저장소를 로컬로 복제하세요
사용자 정보 설정 [Look]
Windows
-
처음 설치하면 복제한 직후 사용자 정보 설정 화면이 표시 됨
-
이후에는 도구 - 옵션
-
기본 사용자 정보에 이름과 이메일 주소 설정
macOS
-
SourceTree - 설정...
-
기본 사용자 정보에 이름과 이메일 주소 설정
사용자 정보 설정 [D.I.Y]
사용자 정보를 설정하세요
파일 수정과 상태 변경 [Look]
- 워킹 디렉토리의 파일은 Tracked와 Untracked로 나뉨
- Tracked
- 이미 스냅샷에 포함
- Unmodified
- Modified
- Staged
- Untracked
파일 수정
-
저장소가 복제된 폴더로 이동하여 README.md 파일을 수정해 봅시다
-
macOS
-
Windows
-
파일 내용을 변경하였습니다.
-
SourceTree의 파일 상태 항목을 보면 README.md 파일이 스테이지에 올라가지 않은 파일에 추가되었고 오른쪽에서는 Diff를 확인할 수 있습니다.
-
파일상태 창이 위/아래로 나눠져 있지 않으면 햄버거 메뉴에서 스테이지 뷰 나누기를 선택합니다.
- Git 개념과 1:1로 매치되는 뷰 (Staged 상태 / Modified 상태)
- Git 개념과 1:1로 매치되는 뷰 (Staged 상태 / Modified 상태)
Stage 하기
- 스테이지에 올라가지 않은 파일에 있는 README.md 파일을 체크하면 스테이지에 올라간 파일로 추가됩니다.
- 이제 커밋을 위한 준비가 완료되었습니다.
Staged 파일의 수정
-
그런데 아차! '기술교육'을 잊었네요. 파일을 다시 수정하였습니다.
-
README.md가 스테이지에 올라가지 않은 파일/스테이지에 올라간 파일 양쪽에 모두 있습니다.
-
Staged 파일을 수정하면 Staged 상태에서 수정된 Unstated 상태가 됩니다.
-
커밋을 위해서는 다시 체크하여 Staged 상태로 변경하여야 합니다.
파일 수정과 상태 변경 [D.I.Y]
README.md 파일을 수정하여 커밋 준비를 하세요.
- 한번 수정한 후 Unstage 상태가 되는 것을 확인하세요.
- Stage 상태로 만드세요.
- 다시 수정하여 Stage/Unstage 상태의 차이를 확인하세요.
- 최종적으로 Stage 상태로 만들어 커밋 준비를 하세요.
커밋 [Look]
-
파일 상태 화면의 하단에서 커밋 메시지를 작성하고 커밋 버튼을 클릭해서 커밋할 수 있습니다.
-
master 브랜치(이후 설명)에 커밋이 추가된 것을 확인할 수 있습니다.
커밋 [D.I.Y]
워킹 디렉토리의 변경사항을 커밋하세요.
- 두 번 이상 커밋해 보시기 바랍니다.
.gitignore [Look]
-
빌드 결과물 혹은 임시 파일 등은 굳이 버전관리를 할 필요가 없습니다.
-
이런 파일들은 Stage에 추가하지 않는 식으로 관리할 수도 있겠지만 git이 해당 파일들을 무시하도록 할 수 있습니다.
-
.gitingore라는 텍스트 파일을 만들어서 한줄 씩 무시할 파일 이름의 패턴을 적어주면 됩니다.
-
- 주요 운영체제, 언어에 대한 .gitignore 패턴을 자동으로 생성해주는 사이트
- 주요 운영체제, 언어에 대한 .gitignore 패턴을 자동으로 생성해주는 사이트
-
SourceTree를 이용하여 파일을 무시하는 방법을 알아 봅시다.
-
무시해야할 파일이 있다고 가정하고 파일을 하나 만듭니다.
-
해당 파일을 오른쪽 클릭한 후 무시를 선택
-
일치하는 파일명 무시
-
현재 저장소에 추가를 선택
-
패턴 옵션
- 일치하는 파일명 무시: 정확히 현재 파일만 무시
- 이 확장자를 가진 모든 파일 무시: 해당 확장자인 파일 모두 무시
- 이하 모든 걸 무시: 폴더일 경우 폴더를 포함 하위 파일 모두 무시
- 커스텀 패턴 무시하기: 직접 파일 패턴을 작성하여 무시
-
무시 항목을 다음에 추가
- 전역 무시 목록: 현재 컴퓨터의 모든 저장소에 적용되는 설정으로 추가
- 현재 저장소: 현재 저장소에만 설정 적용
-
.gitignore 파일도 하나의 파일로써 버전 관리 대상입니다.
-
스테이지에 올린 후 커밋을 합니다.
이미 버전 관리된 파일을 무시하기 [Look]
- 이미 커밋되어 버전관리가 되는 파일은 이후에 .gitignore에 추가해도 무시되지 않습니다.
- 이 경우 해당 파일을 삭제한 후 커밋하고해야 합니다.
- 무시할 파일의 경우 저장소에 들어 있지 않아도 빌드 과정에서 다시 만들어지는 파일이므로 삭제해도 무방합니다.
## .gitignore [D.I.Y]
불필요한 파일을 하나 생성한 후 무시하도록 설정해보세요.
- gitignore.io 사이트에서 여러 환경에 대한 .gitignore 파일 내용 복사하기
- .gitignore 파일을 생성하여 붙여넣기
- 불필요한 파일을 하나 생성
- 해당 파일을 무시하도록 설정
- .gitignore파일을 커밋
브랜치 [Look]
- 브랜치를 왜 만들고 사용해야 하는지 알아 봅시다.
- 실제 개발 과정에서 겪을 만한 예제
- 작업 중인 웹사이트가 있다.
- 새로운 이슈를 처리할 새 브랜치를 하나 생성한다.
- 새로 만든 브랜치에서 작업을 진행한다.
- 중요한 문제가 생겨서 해결하는 hotfix를 만들어야 한다면
- 새로운 이슈를 처리하기 전의 운영 브랜치로 이동한다.
- hotfix 브랜치를 새로 생성한다.
- 수정한 hotfix 테스트를 마치고 운영 브랜치로 머지한다.
- 다시 작업하던 브랜치로 옮겨가서 하던 일을 진행한다.
- 브랜치란 가상의 작업 공간
Git이 데이터를 저장하는 방법 [Look]
-
Git이 브랜치를 어떻게 다루는지 알려면 Git이 데이터를 어떻게 저장하는지 살펴봐야 합니다.
-
커밋을 하면 Git은 커밋 개체를 생성
- 데이터의 스냇샷에 대한 포인터
- 메타 데이터: 저자, 커밋 메시지 등
- 이전 커밋에 대한 포인터
-
다시 파일을 수정하고 커밋하면 이전 커밋이 무엇인지도 저장
-
Git의 브랜치는 커밋을 가리키는 포인터
브랜치 생성 [Look]
-
SourceTree의 브랜치 클릭
-
새 브랜치에 브랜치 이름을 적고 브랜치 생성을 클릭
-
testing이라는 브랜치가 생성되고 체크아웃(워킹 디렉토리에 반영)된 것을 확인(동그라미 표시)할 수 있습니다.
-
testing과 master는 둘다 d317204라는 커밋을 가리키고 있는 것을 확인할 수 있습니다.
브랜치 이동 [Look]
- 특정 브랜치로 이동한다는 것은 다른 말로 나의 워킹 디렉토리를 브랜치가 가르키는 커밋의 내용으로 변경한다는 의미입니다.
- 워킹 디렉토리를 특정 커밋의 내용으로 변경하는 것을 체크아웃한다고 합니다.
- 브랜치를 이동하려면 이동할 브랜치 명의 컨텍스트 메뉴에서 체크아웃을 클릭하거나 간단히 브랜치 명을 더블클릭합니다.
브랜치 생성과 이동 [D.I.Y]
브랜치를 생성하고 이동해보세요.
- master 브랜치에서 testing 브랜치를 생성해보세요.
- testing 브랜치가 체크아웃된 상태에서 다시 master 브랜치를 체크아웃해 보세요.
브랜치의 갈라짐 [Look]
-
testing 브랜치에서 커밋을 한번해 보겠습니다.
-
testing 브랜치는 새로운 커밋 84ed3b8을 가리키지만 master 브랜치는 그대로 있는 것을 확인할 수 있습니다.
-
master로 체크아웃한 후 커밋을 한번해 보겠습니다.
-
이제는 master와 testing이 갈라졌습니다.
머지 [Look]
-
한 브랜치의 내용을 다른 브랜치에 합치는 것을 머지라고 합니다.
-
testing 브랜치를 master 브랜치로 머지해 보겠습니다.
-
먼저, master 브랜치를 체크아웃합니다.
- Git은 항상 변경사항이 발생하는 브랜치로 체크아웃한 후 무엇이든 합니다.
- 지금은 master 브랜치가 testing 브랜치의 변경사항들을 받아 들이기 때문에 master를 체크아웃합니다.
-
testing의 컨텍스트 메뉴에서 Merge testing into master(현재 브랜치로 testing 병합)를 클릭합니다.
-
확인을 클릭합니다.
-
master 브랜치에 testing 브랜치의 변경사항을 받은 머지 커밋이 생성되는 것을 확인할 수 있습니다.
-
머지 커밋은 부모 커밋을 두개 가지고 있습니다.
브랜치 삭제 [Look]
-
머지된 브랜치를 삭제해 봅시다.
-
testing의 컨텍스트 메뉴에서 testing 삭제를 클릭합니다.
-
확인을 클릭합니다.
브랜치에서의 작업 [D.I.Y]
- testing 브랜치에서 커밋을 해보세요.
- testing 브랜치가 master 브랜치보다 앞서는 것을 확인하세요.
- master 브랜치에서 커밋을 해보세요.
- master와 testing이 갈라지는 것을 확인해보세요.
- 주의 충돌이 발생하지 않도록 testing과 master는 서로 다른 파일을 수정하세요. (빈 파일 생성 추천) 충돌 해결법은 뒤에 설명합니다.
- master에 testing을 머지해보세요.
- testing 브랜치를 삭제해보세요.
Fast-forward [Look]
-
master에서 testing2 브랜치를 생성하고 커밋을 해봤습니다.
-
이 상태에서 master에 testing2를 머지해보겠습니다.
- e8d5bb3 커밋을 master와 testing2가 둘다 가리킵니다.
- master에 testing2를 머지한다는 건 이 경우 단순히 master가 가리키는 커밋만 변경하면 되기 때문입니다.
- 이렇게 머지 시에 머지 커밋을 생성하지 않고 브랜치 포인터만 옮기는 것을 fast-forward라고 합니다.
Fast-forward [D.I.Y]
- master로부터 testing2 브랜치를 생성하고 커밋을 해보세요.
- master에 testing2를 머지해보세요.
- FF로 머지되는 것을 확인하세요.
git-flow [Look]
- 브랜치 관리 모델 중 하나로 Vincent Driessen이 주장
메인 브랜치
- 아래 두 브랜치는 항상 존재하는 메인 브랜치입니다.
- master
- master 브랜치는 배포된 소스가 있습니다.
- develop
- 다음 배포를 위한 소스가 있습니다.
- 개발이 완료되면 일련의 과정을 통해 master로 머지합니다.
- master
서포팅 브랜치
- master과 develop 외에 팀 멤버들이 병렬로 일할 수 있도록 도와주는 브랜치가 있습니다.
- 메인 브랜치와는 다르게 필요할 때 생성하였다가 삭제합니다.
- feature 브랜치
- release 브랜치
- hotfix 브랜치
feature 브랜치
- 브랜치 생성: develop으로 부터
- 머지: develop으로
- prefix: feature/
- feature 브랜치는 특정 기능 하나에 대하여 develop으로부터 생성하여 개발하며 개발이 완료되면 다시 develop 브랜치로 머지합니다.
- 이때 각 기능 별로 개발한 커밋을 구별할 수 있도록 fast-forward를 사용하지 않습니다.
release 브랜치
- 브랜치 생성: develop으로 부터
- 머지: develop과 master로
- prefix: release/
- release 브랜치는 배포를 위한 준비를 할 수 있는 브랜치입니다.
- release 브랜치는 develop 브랜치에 다음 배포를 위한 기능의 개발이 모두 완료되어 머지된 후 develop으로부터 생성합니다.
- release 브랜치에서는 각종 메타 데이터 (버전 명 등)을 변경하거나 작은 버그를 수정합니다.
- 배포 준비가 완료되면 release 브랜치를 master와 develop에 각각 머지합니다.
- master에는 버전 태그를 붙입니다.
- release 브랜치를 따로 가져가기 때문에 develop 브랜치에서는 바로 다음 배포를 위한 기능 기능을 시작할 수 있습니다.
- 그리고 release 브랜치를 다시 develop으로 머지하기 때문에 release 브랜치의 변경 사항이 develop에 반영됩니다.
hotfix 브랜치
- 브랜치 생성: master로 부터
- 머지: develop과 master로
- prefix: hotfix/
- hotfix 브랜치는 배포된 버전에 긴급한 변경 사항이 있을 때 활용합니다.
- hotfix 브랜치는 master로부터 생성합니다.
- 긴급한 이슈가 해결되면 다시 master와 develop에 머지합니다.
- hotfix 브랜치 역시 따로 가져가기 때문에 develop 브랜치에서는 다음 배포를 위한 기능 개발을 계속 진행할 수 있습니다.
- hotfix 브랜치를 develop으로 머지하기 때문에 hotfix 브랜치의 변경 사항이 develop에 반영됩니다.
요약
원격 저장소 (remote) [Look]
- Git은 로컬 저장소만 사용할 수도 있지만 원격 저장소를 추가하여 사용할 수 있습니다.
- 우리가 GitHub의 저장소를 복제했을 때 git은 자동으로 GitHub에 있는 원격 저장소를 origin이라는 이름으로 추가하였습니다.
로컬 브랜치와 원격 브랜치
- 로컬 브랜치인 master와 원격 브랜치인 origin/master는 서로 별개의 브랜치입니다.
- Git이 origin/master를 체크아웃하여 로컬 브랜치인 master를 생성하였습니다.
- A라는 사람의 master와 B라는 사람의 master 또한 별개의 브랜치입니다.
- 이 개념을 이해하면 git에서 헷갈리던 많은 것이 해결됩니다.
Fetch
- 원격 저장소의 변경 사항을 내려 받는 것을 fetch라고 합니다.
- Fetch까지만 하면 변경 사항을 받았을 뿐 아직 로컬 브랜치에는 머지(반영)되지 않은 상태입니다.
- 로컬 브랜치에 원격 저장소의 변경 사항을 반영하고 싶다면 수동으로 원격 브랜치를 로컬 브랜치로 머지해야 합니다.
Pull
- Pull은 fetch + 머지입니다.
- 원격 브랜치의 변경 사항을 내려 받은 후 로컬 브랜치로 머지해줍니다.
Push
- 로컬 저장소의 변경 사항을 원격 저장소로 올리는 것을 push라고 합니다.
요약
- fetch/pull/push는 뒤에서 실제 실습해보도록 하겠습니다.
Git/GitHub/Dooray! Project를 이용한 프로젝트 관리
개요 [D.I.Y]
- 각 팀에서 하나의 저장소를 만들고 Dooray! Project를 통해서 계산기 v1.0을 릴리즈하는 과정을 따라해 보겠습니다.
- 조장을 결정해주세요.
새로운 규칙
조장
조장이 행동하고 조원이 지켜봅니다.
조원
조원이 행동하고 조장이 지켜봅니다.
Look
슬라이드 내용에 집중합니다.
D.I.Y
직접 실습합니다.
Git-flow 설정 [조장][Look]
-
저장소는 앞서 생성한 조장의 저장소를 사용하도록 하겠습니다.
-
도구모음에서 깃 플로우...를 클릭
-
기본값으로 두고 확인 클릭
-
develop 브랜치가 생성된 것 확인
-
만약 도구모두에 깃 플로우가 보이지 않으면 도구모음 컨텍스트 메뉴에서 도구 막대 사용자화 클릭
-
깃 플로우를 도구모음으로 드래그
develop 브랜치 push [조장][Look]
- 도구모음에서 푸시 클릭
- develop에 체크한 후 확인 클릭
- 아이디와 비밀번호를 물어보면 Github 아이디와 비밀번호를 입력합니다.
기본 브랜치 변경 [조장][Look]
- GitHub의 저장소 페이지로 이동한 후 Settings를 클릭합니다.
- Default branch를 develop으로 선택합니다.
Git-flow 설정 [조장][D.I.Y]
- Git-flow 설정을 합니다.
- develop 브랜치를 push합니다.
- 기본 브랜치를 develop으로 변경합니다.
협업자 추가 [조장][Look]
-
저장소 페이지의 상단 Settings - 왼쪽 메뉴의 Collaborators 클릭
-
조원을 검색하여 추가해 줍니다.
협업자 추가 [조장][D.I.Y]
- 조원을 협업자로 추가합니다.
- Settings - Collaborator
- 아이디로 검색 후 추가
초대 수락 [조원][Look]
- 조원은 메일로 온 초대를 수락합니다.
저장소 복제와 git-flow 설정 [조원][Look]
- 각 조원은 조장의 저장소를 복제한 후 git-flow설정까지 완료합니다.
- 이때 git-Flow 초기설정은 develop과 master 브랜치가 모두 로컬에 있어야 가능합니다.
- Remotes-origin의 master를 체크아웃 받습니다.
- develop은기본 브랜치이기 때문에 복제 시 체크아웃됨
- develop은기본 브랜치이기 때문에 복제 시 체크아웃됨
초대 수락/저장소 복제/git-flow 설정 [조원][D.I.Y]
- 조장의 초대를 수락하고 저장소를 복제합니다.
- 메일의 링크 클릭
- 저장소 주소 복사 후 SourceTree에서 복제
- git-flow 초기 설정을 합니다.
- 이때 develop, master 모두 로컬에 존재하여야 합니다.
Dooray! Project 마일스톤 설정 [Look]
-
프로젝트 설정으로 진입합니다.
-
마일스톤 탭의 [마일스톤 추가]를 클릭합니다.
-
마일스톤명을 적고 적절한 기간을 선택한 후 [추가]를 클릭합니다.
-
마일스톤을 설정하면 프로젝트 대시보드에서 번다운차트를 확인할 수 있습니다.
Dooray! Project 마일스톤 설정 [조장][D.I.Y]
- 프로젝트에 계산기 v1.0 마일스톤을 추가합니다.
업무 생성 [Look]
-
새 업무를 클릭
-
담당자, 제목, 본문을 적습니다.
-
마일스톤은 계산기 v1.0으로 선택합니다.
-
업무 생성 완료
-
하단의 댓글 입력창을 통해 댓글을 남길 수 있습니다.
-
나머지 업무 등록
업무 생성 [조장][조원][D.I.Y]
- 앞과 같이 업무를 등록하고 댓글을 통해 의견을 나누어 봅니다.
Dooray! Project와 GitHub 연동 [조장][Look]
-
Dooray! Project 설정으로 진입합니다.
-
[서비스 연동] - [서비스 추가] - [GitHub] - [연동 추가]를 클릭합니다.
-
연동 프로젝트에서 현재 프로젝트를 선택합니다.
-
URL을 복사한 후 저장을 클릭합니다.
-
GitHub 저장소 [Settings] - [Webhooks] - [Add webhook]을 클릭합니다.
-
Payload URL에 복사한 URL을 붙여넣기 합니다.
-
Content type을 application/josn으로 선택합니다.
-
Let me select individual events를 선택합니다.
-
Push를 해제하고 Pull request를 선택합니다.
-
Add webhook을 클릭합니다.
-
Webhook 주소에 초록 체크가 표시되면 정상입니다.
기능 개발 시작 [조장][Look]
-
스켈레톤 작성 업무를 시작해 봅시다.
-
이슈 담당자는 업무 진행하기를 클릭합니다.
-
도구모음에서 깃 플로우...를 클릭합니다.
-
새 기능 시작을 클릭합니다.
-
Feature Name은 이슈번호와 간략한 설명으로 정합니다.
-
feature/iss1-create-skeleton 브랜치가 생성되고 checkout된 것을 확인할 수 있습니다.
기능 개발 [조장][Look]
-
main.c를생성합니다.
-
커밋 로그를 작성하고 커밋합니다.
기능 푸시 [조장][Look]
- 푸시할 브랜치를 선택한 후 푸시합니다.
기능 개발 [조장][D.I.Y]
계산기 프로그램의 스켈레톤을 개발한 후 푸시하세요.
- 깃 플로우 버튼을 통해 새 기능을 시작합니다.
- 실습 파일의 main-1.c 파일 내용을 복사해서 main.c로 저장합니다.
- 커밋 로그를 작성하고 커밋합니다.
- feature 브랜치를 푸시합니다.
Pull Request [조장][Look]
- 기능 개발이 완료된 후에는 깃 플로우 버튼의 기능 마무리를 이용하여 feature 브랜치를 develop으로 머지할 수도 있습니다.
- 하지만 이렇게 하지 않고 GitHub에서 Pull Request를 생성하는 방법을 알아봅니다.
- 이런 방식을 GitHub Flow라고 부릅니다.
- 본 교육에서는 Git Flow와 GitHub Flow를 조합한 workflow를 안내 합니다.
PR 생성 [조장][Look]
-
저장소페이지의 상단 Pull Requests 클릭
-
오른쪽상단의 New pull request 클릭
-
compare에서 base로머지하는 풀리퀘스트를 만듭니다.
-
우리는 feature/iss1-create-skeleton을 develop으로 머지할 것이기 때문에 그림과 같이 선택합니다.
-
다시 Create pull request 버튼을 클릭합니다.
-
정보를 입력하고 Create pull request 버튼을 클릭합니다.
-
이때 PR 제목에 #{프로젝트 업무 번호}를 적어주면 해당 업무에 PR 정보가 자동으로 댓글로 달립니다.
-
해당 업무와 관련된 코드 변경 사항을 서로 링크시켜 줄 수 있기 때문에 매우 유용합니다.
PR 정보 [Look]
- Conversation 탭은 타임라인과 같이 이 PR의 시간 별 경과를 볼 수 있으며 댓글로 논의를 할 수도 있습니다.
- Commits 탭에서 PR에 포함된 커밋을 볼 수 있습니다.
- Files changed 탭에서 Diff를 확인할 수 있습니다.
PR 만들기 [조장][D.I.Y]
- feature 브랜치를 develop에 머지하기 위한 풀리퀘스트를 만드세요.
- base와 compare에 각각 지정하는 브랜치에 유의하세요.
코드리뷰 [Look]
-
변경된 라인에 마우스 오버하면 +아이콘이 나타납니다.
-
해당 라인에 댓글을 추가할 수 있습니다.
-
이렇게 추가한 댓글은 Conversation 탭에도 표시됩니다.
-
의견을 받았기 때문에 해당 부분에 대한 수정을 시작합니다.
- 혹은 댓글을 통해 토의합니다.
- 혹은 댓글을 통해 토의합니다.
-
첫번째 의견에 대한 수정 사항을 커밋합니다.
-
되도록 커밋은 작은 변경 사항들을 자주 하도록 합니다.
-
두번째의견에 대해서도 변경 후 커밋합니다.
-
다시 푸시합니다.
-
다시 PR 페이지를 확인하면 이전의 댓글은 X 표시되고 푸시한 커밋들이 반영된 것을 확인할 수 있습니다.
-
이 과정을 코드가 머지할 수 있는 수준이 될 때까지 계속 반복합니다.
-
머지를 해도 되겠다 판단이 되면
로 엄지 표시를 입력합니다.
- 각 팀의 나름의 싸인을 이용하세요
- 각 팀의 나름의 싸인을 이용하세요
-
나름의 룰을 정하여 머지 시점을 결정합니다.
- 예) 모두의 엄지, 과반수의 엄지 등등
PR을 이용한 코드리뷰 [조장][조원][D.I.Y]
풀리퀘스트의diff기능을 이용하여 코드 리뷰를 하고 리뷰 의견을 해결한 후 머지 결정까지진행해보세요.
- 조원은 diff 화면에서 특정 라인에 대한 의견을 작성
- 조장은 전달받은 의견을 토대로 코드를 수정
- main-2.c 파일을 복사해 main.c 내용을 변경한 후 커밋
- main-3.c 파일을 복사해 main.c 내용을 변경한 후 커밋
- 조원은 최종적으로 머지해도 좋을지 판단
feature 브랜치 머지 [조장][Look]
-
GitHub 상에서 바로 머지를 할 수 있습니다.
-
Merge pull request 클릭
-
Confirm merge 클릭
-
Delete branch 클릭
-
최종 결과
-
내 로컬 저장소에는 아직 원격 저장소과 로컬 저장소에 브랜치가 남아 있는 것으로 나옵니다.
-
도구모음에서 페치를 클릭합니다.
-
원격 서버들의..에 체크한 후 확인 클릭
-
원격 저장소의 브랜치 정보가 사라졌습니다.
-
develop으로 체크아웃한 후 머지된 브랜치를 삭제합니다.
-
마지막으로 담당 업무를 완료합니다.
feature 브랜치 머지 [조장][조원][D.I.Y]
풀리퀘스트 페이지의 머지 버튼을 이용하여 feature 브랜치를 develop브랜치로 머지하고 로컬의 feature 브랜치 정보를 정리합니다.
조원은 develop의 변경사항을 pull 받습니다
기능 개발 연습 [조장][조원][D.I.Y]
스켈레톤 소스의 각 메소드를 나눠서 개발하고 PR을 생성하여 리뷰를 받고 머지하세요.
주의 충돌은 뒤에 알아봅니다. 충돌이 발생하지 않도록 동일한 라인을 수정하지 마세요.
충돌 [Look]
-
충돌 해결 방법을 알아보기 위해 일부러 충돌을 만들어 봅시다.
-
동일한 커밋으로부터 조장은 conflict1로 feature 브랜치를 생성하고 조원은 conflict2로 feature 브랜치를 생성했다고 가정해봅시다.
-
feature/confilict1
-
feature/confilict2
-
두 feature 브랜치의 풀리퀘스트를 생성할 때는 두 풀리퀘스트가 모두 머지 가능하게 표시될 것입니다.
-
하지만, conflict1의 풀리퀘스트를 먼저 머지한 후에 conflict2의 PR 페이지를 보면 자동 머지가 안 되는 것을 확인할 수 있습니다.
충돌의 해결 [조원][Look]
- 조원은 develop으로 체크아웃한후 풀 받습니다.
- 다시 feature/conflict2로 체크아웃한 후 develop을 머지합니다.
- 당연히 충돌이 납니다.
- 충돌난 파일은 느낌표로 나타납니다.
- 충돌 영역은 아래와 같이 표시되며 HEAD가 내가 수정한 내용, develop이 해당 브랜치에서 수정한 내용입니다.
- 충돌 표시를 지우고 적절하게 두 변경사항을 반영하여 수정합니다.
- 충돌을 해결한 파일은 충돌 해결로 표시합니다.
- stage에 추가하는 것과 동일
- stage에 추가하는 것과 동일
- 모든 충돌을 해결했으면 커밋/푸시
- 다시 PR 페이지를 확인하면 자동 머지가 가능합니다.
충돌의 해결 [조장][조원][D.I.Y]
충돌 상황을 발생시켜 충돌을 해결하는 법을 실습해봅시다.
- 시작하기 전 모두 develop을 pull
- 조장은 conflict1 feature 브랜치를 생성
- 조원은 conflict2 feature 브랜치를 생성
- 앞서 봤던 대로 코드를 수정하고커밋/푸시
- 조장이 먼저 conflict1에 대한 풀리퀘스트를 머지
- 조원의 conflict2 풀리퀘스트가 충돌난 것을 확인
- 조원은 충돌을 해결한 후 다시 머지
릴리즈 생성 [조원][Look]
- 릴리즈 준비가 되면 git flow로 릴리즈 브랜치를 생성합니다.
- Git flow 버튼에서 새 릴리즈 시작 클릭
- 적당한 이름으로 릴리즈 브랜치를 생성합니다.
- 이 릴리즈 브랜치를 이용하여 최종 테스트를 거치며 릴리즈할 수 있는지 검증합니다.
- 최종적으로 버전 등 메타 정보를 수정하여 커밋합니다.
- 릴리즈 브랜치에 대한 검증이 완료되었다면 Git Flow의 릴리즈 마무리를 클릭합니다.
- 릴리즈를 완료하면 릴리즈 브랜치가 develop과 master에 머지되고 tag가 생성됩니다.
- 그 후 develop과 master, tag까지 푸시해 줍니다.
릴리즈 생성 [조원][D.I.Y]
릴리즈를 생성해 봅니다.
- 릴리즈브랜치를 생성
- 릴리즈를 완료
- 결과를푸시
정리
- 버전 관리 시스템
- Git 기초
- 저장소 생성, 복제, 파일 상태 변경, 커밋
- 브랜치 관리
- Git-flow
- GitHub 협업자 설정
- 기능의 개발, GitHub flow
- Pull Request를 이용한 코드 리뷰
- 충돌 해결
- 릴리즈 생성