16. 16 / GitHub 실습
저장소 복제
SourceTree의 도구모음에서
Clone을 클릭합니다.
Windows
MacOS X
New Repository에서
Clone From URL을 클릭합니다.
17. 17 / GitHub 실습
저장소 복제
저장소 주소 입력 후 탭키
Git 저장소라는 메시지 확인
Windows
MacOS X
저장소 주소 입력 후 탭키
Git 저장소라는 메시지 확인
18. 18 / GitHub 실습
저장소 복제
저장소가 복제된 것을 확인할 수 있습니다.
Windows
MacOS X
19. 19 / GitHub 실습
저장소 복제
calculator 저장소를로컬로 복제하세요.
- GitHub에서 저장소 주소 복사
- SourceTree에서저장소 복제
20. 20 / GitHub 실습
사용자 정보설정
Windows는[Tools] - [Options]에서
Default user information을 설정합니다.
이곳에서 설정하면 별도로 설정하지 않은
모든 저장소에 이 설정이 사용됩니다.
21. 21 / GitHub 실습
사용자 정보설정
[Repository]- [Repository Settings...] - [Advanced]에서
Use global user settings에 체크를 풀고 설정하면
해당 저장소에만 반영됩니다.
22. 22 / GitHub 실습
사용자 정보설정
Mac에서는 UI를 통해 이름을 한글로 설정하면
Mac 이외의 OS에서는 이렇게 깨져 보이게 됩니다.
23. 23 / GitHub 실습
사용자 정보설정
$ git config --global user.name 신승엽/협업시스템개발팀
$ git config --global user.email flysky@nhnent.com
Mac에서 사용자 정보를 설정할 때는
터미널에서 아래 명령을 사용합니다.
생략하면 현재 저장소에만 적용
24. 24 / GitHub 실습
사용자 정보설정
사용자 정보를 설정하세요.
- Windows: 환경설정의Default user information수정
- Mac OS X: 터미널을 통해 명령어로 수정
25. 25 / GitHub 실습
사용자 정보설정
Mac에서 명령어를 통해서 사용자 이름을 변경해도 설정 UI를 한
번 들어가면 다시 되돌아가는문제
https://github.com/flyskyko/git-hooks
26. 26 / GitHub 실습
GitFlow 설정
도구모음에서 Git Flow를 클릭합니다.
기본값 그대로 OK를
클릭합니다.
27. 27 / GitHub 실습
GitFlow 설정
develop 브랜치가 생성되고 체크아웃된 것을
확인할 수 있습니다. 이제 푸시합니다.
28. 28 / GitHub 실습
GitFlow 설정
도구모음에서 Push를 클릭합니다.
develop에 체크한 후
OK를 클릭합니다.
30. 30 / GitHub 실습
GitFlow 설정
GitHub의 저장소 페이지로 이동
한 후 Settings를 클릭합니다.
Default branch를 develop으로
선택합니다.
31. 31 / GitHub 실습
GitFlow 설정
Git Flow 설정을 하고 develop을 기본 브랜치로 설정하세요.
- SourceTree의 Git Flow 버튼을 이용, 초기 설정
- develop 브랜치 푸시
- GitHub 설정 페이지에서develop을 기본 브랜치로
32. 32 / GitHub 실습
파일수정과 상태변경
저장소가 복제된 폴더로 이동하여
README.md 파일을 수정해 봅시다.
Windows
MacOS X
40. 40 / GitHub 실습
파일수정과 상태변경
README.md 파일을 수정하여 커밋 준비를 하세요.
- 한번 수정한 후 Unstage 상태가 되는 것을 확인하세요.
- Stage 상태로 만드세요.
- 다시 수정하여 Stage/Unstage 상태의 차이를 확인하세요.
- 최종적으로 Stage 상태로 만들어 커밋 준비를 하세요.
54. 54 / GitHub 실습
협업자 추가
조원을 협업자로 추가합니다.
- Settings - Collaborator
- 아이디로 검색 후 추가
55. 55 / GitHub 실습
저장소 복제
각 조원은 조장의 저장소를
복제한 후 Git Flow 설정까지
완료합니다.
이때 Git Flow 초기 설정은
develop과 master 브랜치가
모두 로컬에 있어야 가능합니다.
Remotes origin의 master를 체크아웃 받습니다.
(develop은 기본 브랜치이기 때문에 복제 시 체크아웃 됨)
56. 56 / GitHub 실습
마일스톤 설정
저장소 페이지의상단에서 Issues 클릭
상단 탭에서 Milestones 클릭
오른쪽 상단의 New milestone클릭
83. 83 / GitHub 실습
기능개발
GitHub의 #1 이슈 페이지를 확인하면
b2ade71커밋이 #1 이슈와 연결된 것을
확인할 수 있습니다.
84. 84 / GitHub 실습
기능개발
fixed 라고 적어 주었기 때문에 b2ade71커밋이
기본 브랜치인 develop 브랜치와 머지될 때
이슈가 자동으로 닫힙니다.
85. 85 / GitHub 실습
기능개발
#1 이슈를 해결하세요.
- Git Flow 버튼을 통해 새 Feature를 시작합니다.
- 실습 파일의 main-1.c 파일 내용을 복사해서 main.c로 저장
합니다.
- 커밋 로그에 'fixed #1'을 포함하여 커밋합니다.
- Feature 브랜치를 푸시합니다.
86. 86 / GitHub 실습
Pull Request
기능 개발이 완료된 후에는
Git Flow의 Finish Feature를
이용하여 기능 브랜치를
develop으로머지할 수도
있습니다.
87. 87 / GitHub 실습
Pull Request
하지만 이렇게 하지 않고 GitHub에서 Pull Request를 생성하는
방법을 알아봅니다. 이런 방식을 GitHub Flow라고 부릅니다.
본 교육에서는 Git Flow와 GitHub Flow를 조합한 workflow를
안내 합니다.
88. 88 / GitHub 실습
Pull Request
저장소 페이지의 상단 Pull Requests 클릭
오른쪽 상단의 New pull request 클릭
89. 89 / GitHub 실습
Pull Request
compare에서
base로 머지하는
풀리퀘스트를 만듭니다.
우리는 feature/iss1-create-skeleton을 develop으로
머지할 것이기 때문에 그림과 같이 선택합니다.
108. 108 / GitHub 실습
Pull Request
풀리퀘스트의 diff 기능을 이용하여 코드 리뷰를 하고
리뷰 의견을 해결한 후 머지 결정까지 진행해보세요.
- 조원은 diff 화면에서 특정 라인에 대한 의견을 작성
- 조장은 전달받은 의견을 토대로 코드를 수정
- main-2.c 파일을 복사해 main.c 내용을 변경한 후 커밋
- main-3.c 파일을 복사해 main.c 내용을 변경한 후 커밋
- 조원은 최종적으로 머지해도 좋을지 판단
109. 109 / GitHub 실습
Pull Request
GitHub 상에서 바로 머지를 할 수 있습니다.
110. 110 / GitHub 실습
Pull Request
GitHub 상에서 바로 머지를 할 수 있습니다.
111. 111 / GitHub 실습
Pull Request
GitHub 상에서 바로 머지를 할 수 있습니다.
112. 112 / GitHub 실습
Pull Request
GitHub 상에서 바로 머지를 할 수 있습니다.
113. 113 / GitHub 실습
Pull Request
내 로컬 저장소에는 아직 원격 저장소과
로컬 저장소에 브랜치가 남아 있는 것으로
나옵니다.
120. 120 / GitHub 실습
충돌해결
두 feature 브랜치의 풀리퀘스트를 생성할 때는
두 풀리퀘스트가 모두 머지 가능하게 표시될 것입니다.
하지만, conflict1의 풀리퀘스트를 먼저 머지한 후에
conflict2의 PR 페이지를 보면 자동 머지가 안 되는 것을
확인할 수 있습니다.
121. 121 / GitHub 실습
충돌해결
conflict2의 담당자는 develop으로체크아웃한 후 풀 받습니다.
다시 feature/conflict2로
체크아웃한 후 develop을
머지합니다.
130. 130 / GitHub 실습
충돌해결
다시 PR 페이지를 확인하면 자동 머지가 가능합니다.
131. 131 / GitHub 실습
충돌해결
충돌 상황을 발생시켜 충돌을 해결하는 법을 실습해봅시다.
- 시작하기 전 모두 develop을 pull
- 조장은 conflict1feature 브랜치를 생성
- 조원은 conflict2feature 브랜치를 생성
- 앞서 봤던 대로 코드를 수정하고 커밋/푸시
- 조장이 먼저 conflict1에 대한 풀리퀘스트를 머지
- 조원의 conflict2풀리퀘스트가 충돌난 것을 확인
- 조원은 충돌을 해결한 후 다시 머지
132. 132 / GitHub 실습
rebase 활용
머지만을 사용하여 프로젝트를 진행할 경우
이런 커밋 그래프를 만나게 될 수도...
프로젝트의 히스토리를 보기 굉장히 어렵습니다.
133. 133 / GitHub 실습
rebase 활용
기본 원칙
- Feature 브랜치를 푸시하기 전 develop에 rebase
- 머지 전 develop에 내 feature 브랜치가 가지 친 후의 커밋이
존재한다면 다시 develop에 rebase
- develop 머지 시에 다른 사람들은 잠시 develop을 놔두기
134. 134 / GitHub 실습
rebase 활용
충돌 상황이 있는 예제를 통해 rebase 실습을 해봅시다.
조장은 conflict3브랜치를, 조원은 conflict4브랜치를 생성합니
다.
135. 135 / GitHub 실습
rebase 활용
조장은 위 코드와 같이 변경한 후 커밋합니다.
136. 136 / GitHub 실습
rebase 활용
이제 풀리퀘스트를 위해 feature 브랜치를 push 해야 합니다.
이때 꼭 develop을 pull 받아 develop에 변경된 커밋이 없는지
확인합니다.
위 그림과 같이 기능을 개발하는 동안 다른 커밋이 생겼다면
feature 브랜치를 develop에 rebase 합니다.
137. 137 / GitHub 실습
rebase 활용
Feature 브랜치를 체크아웃 받은 상태에서
develop 브랜치 위에서 컨텍스트 메뉴를 불러와
Rebase current changeson develop을 클릭합니다.
138. 138 / GitHub 실습
rebase 활용
확인 창에서 OK를 클릭합니다.
충돌이 없다면 그대로 진행이 됩
니다.
139. 139 / GitHub 실습
rebase 활용
feature 브랜치가 develop의 최신 커밋으로부터 나온 것으로 변
경된 것을 확인할 수 있습니다.
rebase 전
rebase 후
140. 140 / GitHub 실습
rebase 활용
드디어 push할 수 있게 되었습니다.
Feature 브랜치를 push하고 풀리퀘스트를 만듭니다.
141. 141 / GitHub 실습
rebase 활용
동시에 조원은 아래와 같이 코드를 수정하고 커밋한 후
develop의 변경 사항을 확인하여 rebase가 필요하다면
rebase한 후 역시 push하고 풀리퀘스트를 만듭니다.
142. 142 / GitHub 실습
rebase 활용
이제 feature/conflict3 브랜치가 리뷰가 완료되고
조장이 머지한다고 생각해 보겠습니다.
143. 143 / GitHub 실습
rebase 활용
하지만 그전에 다시 develop 브랜치에 새로운 커밋이 존재하는
지 확인해 봅니다.
머지할 브랜치가 develop의 마지막 커밋으로부터 나와 있기 때
문에 이번에는 rebase를 할 필요가 없겠습니다.
144. 144 / GitHub 실습
rebase 활용
풀리퀘스트 페이지에서 머지를 클릭하여 머지합니다.
결과는 아래와 같습니다.
145. 145 / GitHub 실습
rebase 활용
이제 conflict4도 리뷰가 완료되어 조원이 머지를 한다고 생각해
봅시다. 충돌이 났기 때문에 자동 머지가 되지 않습니다. 그리고
develop 브랜치에도 새로운 커밋(conflict3을 머지하는)이 생겼
기 때문에 rebase가 필요합니다.
146. 146 / GitHub 실습
rebase 활용
머지하기 전 99c8594커밋의 부모 커밋을 5240aa1로 변경하기
위해 rebase합니다.
147. 147 / GitHub 실습
rebase 활용
conflict4브랜치가 체크아웃된 상태에서 develop으로 rebase합
니다.
148. 148 / GitHub 실습
rebase 활용
rebase 진행 중 충돌이 일어납니다.
149. 149 / GitHub 실습
rebase 활용
충돌을 해결한 후 stage 상태로 변경합니다.
150. 150 / GitHub 실습
rebase 활용
그 다음 Actions 메뉴에서
Continue Rebase를 클릭합니다.
151. 151 / GitHub 실습
rebase 활용
feature/conflict4브랜치가 develop의최신 커밋으로부터
나오는 새로운 커밋을 만들어낸 것을 확인할 수 있습니다.
로컬의 feature 브랜치는 rebase가 되었지만 remote(origin)의
feature 브랜치는 여전히 존재하는 것도 확인할 수 있습니다.
152. 152 / GitHub 실습
rebase 활용
이제 feature 브랜치를 다시 push해 줍니다.
하지만 오류가 발생하며 push가 되지 않습니다.
remote(origin)에 이미 push된 커밋 때문입니다.
153. 153 / GitHub 실습
rebase 활용
이미 remote에 push된 브랜치를 rebase하여
다시 push하기 위해서는 터미널로 직접 명령어를 입력해
주어야 합니다.
$ git push origin feature/conflict4 --force
154. 154 / GitHub 실습
rebase 활용
이제 다시 풀리퀘스트 페이지에서 머지를 하면 아래와 같이 깔
끔하게 정리된 그래프를 확인할 수 있습니다.
155. 155 / GitHub 실습
rebase 활용
rebase를 사용하는 flow를 실습해 봅니다.
- 조장은 conflict3feature 브랜치를 생성
- 조원은 conflict4feature 브랜치를 생성
- 각자 코드를 수정한 후 커밋
- push하기 전 develop을 확인하여 필요하다면 rebase
- 풀리퀘스트를 생성
- 리뷰 완료 후 머지 시에도 develop을확인하여 필요하다면
rebase
156. 156 / GitHub 실습
rebase 활용
rebase는 이미 생성된 커밋을 고치기 때문에 push된 커밋을
rebase하는 것을 권장하지 않는다고 되어 있습니다. 왜냐하면
이미 다른 사람이 pull 받은 커밋을 다시 고치면 엄청난 혼란을
가져올 수 있기 때문입니다. 하지만 앞서 예제에서 feature 브
랜치는 담당자만이 사용하고 있다는 가정 하에 이미 push된 브
랜치를 rebase하고 있습니다.
157. 157 / GitHub 실습
rebase 활용
rebase는 git 사용법 중에서도 고급 사용법이므로 팀에서 이제
막 git을 도입해 사용하고 있다면 모든 구성원이 git에 익숙해진
후에 rebase를 활용한 flow를 도입하시길 권장드립니다.
158. 158 / GitHub 실습
릴리즈 생성
릴리즈 준비가 되면 Git Flow로 릴리즈 브랜치를 생성합니다.
159. 159 / GitHub 실습
릴리즈 생성
Git Flow에서 Start New Release를 클릭
160. 160 / GitHub 실습
릴리즈 생성
적당한 이름으로
릴리즈 브랜치를
생성합니다.
161. 161 / GitHub 실습
릴리즈 생성
이 릴리즈 브랜치를 이용하여 최종 테스트를 거치며
릴리즈할 수 있는지 검증합니다.
162. 162 / GitHub 실습
릴리즈 생성
릴리즈 브랜치에 대한 검증이 완료되었다면
Git Flow의 Finish Release를 클릭합니다.
169. 169 / GitHub 실습
릴리즈 생성
릴리즈를 생성해 봅니다.
- 릴리즈 브랜치를 생성
- 릴리즈를 완료
- 결과를 푸시
- GitHub 페이지에서 태그의 릴리즈 노트 작성
170. 170 / GitHub 실습
정리
- GitHub과 SourceTree를 이용한 Git 기본 사용법
- 저장소 생성, 복제, 파일 상태 변경, 커밋, 푸시
- GitHub을 이용한 프로젝트 관리
- 협업자 설정, 마일스톤/라벨/이슈 관리
- 기능의 개발, GitHub flow(Pull Request)
- rebase를 활용한 로그 그래프 관리
- 릴리즈 생성