* SlideShare에서 특정 폰트로 쓰인 글자가 보이지 않는 경우가 있습니다. 다운로드 하셔서 PDF 리더로 보시는 것을 권해드립니다. -> 기존 폰트를 모두 나눔고딕으로 변경하였습니다.
OSS 포럼 개발 교육으로 진행한 Git, GitHub 강의 자료입니다.
(http://onoffmix.com/event/67081)
간단한 로또 번호 생성기 프로그램을 작성하면서 Git, GitHub에 대해 배웁니다.
1. Git과 Github
- 버전 관리?
- Git은 어쩌다 세상에 나왔나?
- Github?
2. Git 시작하기 - 실습
- 실습 준비 : Github, Goorm IDE 가입하기
- 리눅스 명령어와 친해지기
- Git 필수 개념 집고 넘어가기
- Step by Step Git 명령어 실습 (커밋, 브랜치, 원격 저장소 등)
- 옆자리 분과 Fork하고, Pull Request
3. Git과 Github 맛깔나게 활용하기
- Github의 협업 기능 살펴보기
- Github Page
- Gitbook
4. 있어보이는 Git 활용
- .git 디렉토리 살펴보기
- Git Branch 전략
- Commit Message 활용
3. 01 소스 코드를 어떻게 관리하고 계신가요?
프로젝트_최종.zip
ZIP
프로젝트_최종_최종2.zip
ZIP
프로젝트_최종_최종2_마지막.zip
ZIP
프로젝트_최종_최종2_마지막_진짜제출용.zip
ZIP
4. 02 조금 더 나은 버전?
프로젝트_20160401.zip
ZIP
프로젝트_20160405.zip
ZIP
프로젝트_20160510.zip
ZIP
프로젝트_20160514.zip
ZIP
프로젝트_20160401_이준영.zip
ZIP
하지만 혼자가 아니라면 어떻게 될까?
프로젝트_20160401_송태웅.zip
ZIP
프로젝트_20160401_이준영+송태웅_통합.zip
ZIP
5. 03 버전 관리(Version Control)
소스코드에서 무엇이 변경되었는지?
누가 소스코드를 변경했는지?
언제 소스코드가 변경되었는지?
왜 그렇게 바뀐건지?
이전 버전으로의 복구는 어떻게?
…
그래서 씁니다. 버전 관리 시스템
6. 04 Git?
분산 버전 관리 시스템
리누스 토발즈가 개발
빠름!
완전한 분산 환경 지원
대규모 프로젝트에도 사용 가능
7. 05 GitHub?
GitHub :
Git 저장소 호스팅 서비스
- 공개 저장소는 무료
- 강력한 협업 기능 제공
- 오픈 소스 소프트웨어의 허브
- 확장이 용이
- 다양한 서비스와의 연동
- 기업을 위한 엔터프라이즈 버전 제공
18. 09 CLI와 친해지기 터미널, 쉘
텍스트 입력 및 표시를 위한 인터페이스(텍스트 터미널)
입력된 명령을 해석하여 운영체제로 전달
사용자가 로그인 시 자동으로 쉘이 실행
터미널(Terminal)
쉘(Shell)
현재 경로
사용자@호스트
터미널과 쉘의 모습
19. 10 CLI와 친해지기 pwd, ls, mkdir
pwd 현재 경로 확인
ls 현재 경로의 파일 목록 보기
mkdir 디렉토리(폴더) 만들기
$ mkdir my-folder
20. 11 CLI와 친해지기 절대 경로, 상대 경로
최상위 디렉토리(루트, /)를 기준으로 한 경로
현재 위치를 기준으로 한 경로
절대 경로
상대 경로
마침표 하나 (.)
마침표 둘 (..)
../..
../../..
현재 디렉토리
상위 디렉토리
상위의 상위?
위의 위의 위?
workspace
/
lotto-gen
bin
src
project
LottoGenerator.java
현재 위치
절대 경로
/workspace/lotto-gen/src/project/LottoGenerator.java
상대 경로
src/project/LottoGenerator.java
21. 12 CLI와 친해지기 cd
cd 디렉토리 이동
$ cd my-folder
상위 디렉토리로 이동
$ cd ..
상대 경로로 이동
$ cd src/project
절대 경로로 이동
$ cd /workspace/lotto-gen
22. 13 CLI와 친해지기 cat, cp
cat 파일 내용 보기
$ cat src/project/LottoGenerator.java
cp 파일 복사(mv는 이동)
$ cp src/project/LottoGenerator.java ./
24. 15 CLI와 친해지기 vim 에디터
vi vim 에디터 실행
$ vim README.md
ESC 명령 모드로 전환
i 편집(삽입) 모드로 전환
dd 줄 삭제
:wq 저장 후 종료
:q! 저장하지 않고 종료
25. 16 쉬어가는 코너(제가)
<복습하고 넘어가기>
1. /workspace 디렉토리 아래에 자기 아이디로 디렉토리 생성하고
2. 해당 디렉토리로 들어가기
3. 디렉토리 안에 vim 에디터로 hello.txt 파일 만들고,
4. 간단한 인사말을 쓴 후 저장하고 종료
5. 파일 내용 출력 명령어로 출력하기
6. 다시 /workspace/lotto-gen 디렉토리로 돌아와서 현재 위치 출력
27. 01 Git 필수 개념 집어보기 Git의 세 가지 상태
Working Directory
현재 작업 디렉토리,
프로젝트의 특정 버전을 체크아웃한 것
Staging Area
커밋 시 반영되는 파일이 보관되어 있는 곳
인덱스 영역이라고도 하며, 커밋하면
Git Directory(로컬 저장소)로 이동된다.
Git Directory
Git으로 관리되는 프로젝트의 정보와
객체 데이터베이스가 저장되는 곳
Git 명령어를 통해 최초에 초기화 하거나
다른 저장소를 Clone하면 생성된다.
Git을 통한 작업 순서
- 워킹 디렉토리에서 파일을 수정
- 워킹 디렉토리에서 변경된 파일을 스테이징 영역에 추가(커밋할 스냅샷 생성)
- 스테이징 영역의 파일을 커밋하여 Git 디렉토리에 영구적으로 저장
h"ps://git-scm.com/book/ko/v2/시작하기-Git-기초
28. 02 Git 필수 개념 집어보기 파일의 라이프 사이클
• Untracked : Git이 파일의 변경을 추적하지 않는 상태
• Tracked : Git이 파일의 변경을 추적하고 있는 상태
• Unmodified : 수정되지 않은 상태
• Modified : 추적 중인 파일이 수정된 상태
• Staged : 스테이징 영역에 추가된 상태
h"ps://git-scm.com/book/ko/v2/Git의-기초-수정하고-저장소에-저장하기
29. 03 이렇게 실습해볼 예정입니다
간단한 로또 번호 생성 프로그램을 만들어 보면서 Git 실습
1. 로또 번호 생성 프로젝트 생성
2. 45개(0~44)의 번호 랜덤 생성 메서드 작성
3. 버그 발견! 생성되는 숫자 범위 조정(1~45)
4. 버그 발견! 중복 생성된 번호 확인 로직 추가
5. 주석 추가
30. 04 사용자 정보 설정 git config
Local Git Repository Branch Commit Logs
$ git config --global user.name “Junyoung Lee”
$ git config --global user.email “junyoung.plum@gmail.com”
git config 명령으로 사용자 이름과 이메일 설정
Git이 커밋할 때마다 설정된 사용자 이름과 이메일 정보를 사용
--global 옵션은 해당 시스템 전체 설정으로 적용됨
--global 옵션을 빼면 해당 프로젝트에만 설정
Working Directory
Staging Area
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
31. 05 Git 저장소 만들기(초기화) git init
Working Directory
Staging Area
Local Git Repository Branch Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
$ git init
Initialized empty git repository in /workspace/lotto-gen/.git
git init 명령으로 저장소 생성
git init 명령을 실행하면 .git 디렉토리가 생성됨
$ ls –la
total 8
drwxr-xr-x 6 root root 9 5월 13 21:16 .
drwxr-xr-x 3 root root 3 5월 13 16:52 ..
drwxr-xr-x 7 root root 10 5월 13 21:18 .git
-rw-r--r-- 1 root root 56 5월 13 21:08 README.md
drwxr-xr-x 3 root root 3 5월 13 17:02 bin
...
32. 06 추적하지 않을 파일 설정 - .gitignore 파일
Working Directory
Staging Area
Local Git Repository Branch Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
# Git ignore
bin/ # binary files
goorm.manifest # Goorm IDE manifest file
.gitignore 파일 추가
lo#o-gen/.gi+gnore
.gitignore에 적용된 패턴에 해당되는 파일은
Git을 통해 추적하지 않습니다.
.gitignore
33. 07 스테이징 영역에 .gitignore 파일 추가 git add
Working Directory
.gitignore
Staging Area
Local Git Repository Branch Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git add [파일명|패턴] 으로 스테이징 영역에 추가
.gitignore
$ git add .gitignore
git add –A 옵션을 주면 모든 변경된 파일 추가
34. 08 대망의 첫 커밋! git commit
Working Directory
Staging Area
.gitignore
Local Git Repository Branch
1. add .gitignore
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git commit –m “커밋 메시지”로 메시지와 함께 커밋
.gitignore
$ git commit –m “add .gitignore”
[master (root-commit) 8fe2b9e] add .gitignore
1 file changed, 2 insertions(+)
create mode 100644 .gitignore
Git은 커밋 시 메시지가 꼭 포함되어야 하며,
-m “메시지” 옵션이 생략되면 기본으로 설정된
vim 에디터로 커밋 메시지를 입력할 수 있습니다.
1
master
35. 09 파일 상태 확인 git status
Working Directory
Staging Area
.gitignore
Local Git Repository Branch
1. add .gitignore
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git status 명령으로 파일의 상태 확인
.gitignore
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be
committed)
README.md
make
src/
nothing added to commit but untracked files present (use "git
add" to track)
빨간색은 untracked 상태
녹색은 unstaged 상태
1
master
36. 10 커밋 로그 확인 git log
Working Directory
Staging Area
.gitignore
Local Git Repository Branch
1. add .gitignore
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git log 명령으로 커밋 로그 확인
.gitignore
$ git log
commit 8fe2b9ed4f00e242f86fb32734bd7c9a0a861b3e
Author: Junyoung Lee <junyoung.plum@gmail.com>
Date: Fri May 13 21:35:03 2016 +0000
add .gitignore
1
master
순서대로
커밋 ID, 커밋 작성자, 날짜, 커밋 메시지 출력
37. 11 나머지 모든 파일 스테이징 영역에 추가
Working Directory
README.md
make
src/project/LottoGenerator
Staging Area
.gitignore
Local Git Repository Branch
1. add .gitignore
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git add로 추가하고 git status로 확인
.gitignore
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README.md
new file: make
new file: src/project/LottoGenerator.java
1
master
- git add 명령 시 파일 이름 대신 . 을 입력하면
현재 디렉토리 하위의 모든 파일을 추가합니다.
- git은 빈 디렉토리는 추적하지 않습니다.
38. 12 두 번째 커밋!
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
이번에는 –m 옵션을 생략해 봅시다.
.gitignore initialize
# Please enter the commit message for your changes. Lines
starting
# with '#' will be ignored, and an empty message aborts the
commit.
# On branch master
# Changes to be committed:
# new file: README.md
# new file: make
# new file: src/project/LottoGenerator.java
$ git commit
<vim 에디터>
:wq로 저장하고 나오면 vim에서 작성한 메시지로 커밋됩니다
1 2
master
39. 13 랜덤 번호 생성 메서드 추가 복붙하세요!
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
LottoGenerator.java 파일을 수정해 봅시다.
.gitignore
package project;
import java.util.Random;
import java.util.Arrays;
public class LottoGenerator {
private Random random = new Random(System.nanoTime());
public int[] generate() {
int[] result = new int[6];
for(int i = 0; i < 6; i++) {
result[i] = random.nextInt(45);
}
return result;
}
public static void main(String[] args) {
int[] result = new LottoGenerator().generate();
System.out.println(Arrays.toString(result));
}
}
src/project/Lo#oGenerator.java
1
master
2
44. 18 수정된 내용을 커밋해 봅시다.
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
먼저 git add 하고,
.gitignore
1
master
2
$ git add src/project/LottoGenerator.java
$ git commit -m "add a generate method"
[master c7dd9a7] add generate method
1 file changed, 17 insertions(+), 7 deletions(-)
git commit!
3
45. 19 버그 발견! 생성되는 번호의 범위 수정
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
generate() 메서드에 심각한 결함이 있습니다.
이를 수정하기 위해 branch를 활용해 보겠습니다.
.gitignore
$ git checkout –b hotfix1
Switched to a new branch ‘hotfix1’
파일을 수정하기 전에 git checkout 명령에 –b 옵션을
더해 ‘hotfix1’ 브랜치를 생성하면서 체크아웃 합니다.
checkout은 브랜치나 특정 버전을 선택하여
워킹 디렉토리로 가져옵니다.
이제 hotfix1 브랜치는 master와 같은 곳을 가리킵니다.
1
master
2 3
hotfix1
46. 20 브랜치 확인 git branch
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git branch 명령을 이용해 브랜치 목록과
현재 브랜치를 확인할 수 있습니다.
.gitignore
$ git branch
* hotfix1
master
브랜치 목록이 출력되며, hotfix1을 생성하면서
체크아웃 했으므로 hotfix1 앞에 *가 있는 것을
확인할 수 있습니다.
1
master
2 3
hotfix1
47. 21 이제 버그를 잡아 봅시다.
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
LottoGenerator 클래스에서 잘못된 부분을 수정합니다.
.gitignore
…
public int[] generate() {
int[] result = new int[6];
for(int i = 0; i < 6; i++) {
result[i] = random.nextInt(45) + 1;
}
return result;
}
…
src/project/Lo#oGenerator.java
1
master
2 3
hotfix1
48. 22 변경된 내용 비교하기 git diff
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git diff 명령을 이용해 변경된 내용을 확인할 수 있습니다.
.gitignore
$ git diff
diff --git a/src/project/LottoGenerator.java b/src/project/
LottoGenerator.java
index 8001224..0177b1c 100644
--- a/src/project/LottoGenerator.java
+++ b/src/project/LottoGenerator.java
@@ -10,12 +10,10 @@ public class LottoGenerator {
int[] result = new int[6];
for(int i = 0; i < 6; i++) {
- result[i] = random.nextInt(45);
+ result[i] = random.nextInt(45) + 1;
}
...
삭제된 라인은 빨간색, 추가된 라인은 녹색으로 표시됩니다.
또한 설정을 통해 diff 툴을 변경할 수 있습니다.
1
master
2 3
hotfix1
49. 23 변경된 파일을 스테이징 영역에 추가하고 상태 확인
Working Directory
src/project/LottoGenerator.java
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git add로 추가하고, git status로 상태 확인
.gitignore
1
master
2 3
hotfix1
$ git add –A
$ git status
On branch hotfix1
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: src/project/LottoGenerator.java
50. 24 커밋~!
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
git commit으로 커밋!
.gitignore
1
master
2 3
4
hotfix1
$ git commit –m “fix range of generated numbers”
[hotfix1 d09e74b] fix range of generated numbers
1 file changed, 1 insertion(+), 3 deletions(-)
git log로 커밋 로그 확인!
$ git log --pretty=oneline
d09e74b6545fe82476873ddb6eb979ab06a192c9 fix range of
generated numbers
f55b9286611b1b95152447b11a1e1f46261201e2 ignore 수정
c7dd9a710bbb5accb6365b007ed1ac5a933ba2c2 add generate method
79243db381d97378f5701d56c4145fbac899eac7 initialize
8fe2b9ed4f00e242f86fb32734bd7c9a0a861b3e add .gitignore
git log에 다양한 옵션을 적용하여 출력할 수 있습니다.
51. 25 각 브랜치의 워킹 디렉토리 비교
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
현재 hotfix1의 LottoGenerator 클래스는 수정된 상태입니다
master 브랜치로 체크아웃하여 LottoGenerator 클래스를
비교해 보겠습니다.
.gitignore
1
master
2 3
4
hotfix1
$ git checkout master
Switched to branch ‘master’
$ cat src/project/LottoGenerator.java
...
result[i] = random.nextInt(45);
...
hotfix1 브랜치에서 변경했던 부분이 변경 하기 전의 코드임을
확인할 수 있습니다.
브랜치가 변경되면 워킹 디렉토리의 파일도 통째로 변경됩니다
52. 26 브랜치 합치기 git merge
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1 master
2 3
4
hotfix1
git merge 명령어로 브랜치를 합칠 수 있습니다.
먼저 머지를 적용할 브랜치로 이동합니다.
$ git checkout master
Switched to branch ‘master’
git merge 실행
$ git merge hotfix1
Updating f55b928..d09e74b
Fast-forward
src/project/LottoGenerator.java | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
git merge [브랜치] 명령을 실행하면
현재 브랜치에 [브랜치]를 가져와 합치게 됩니다.
53. 27 브랜치 삭제
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
hotfix1 브랜치는 더이상 사용하지 않으므로
git branch –d [브랜치] 명령으로 브랜치를 삭제합니다.
$ git branch –d hotfix1
Deleted branch hotfix1 (was d09e74b).
git branch 명령으로 브랜치 확인
$ git branch
* master
57. 31 원격 저장소 설정 git remote add
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
git remote add 명령어로 원격 저장소를 설정합니다.
$ git remote add origin [GitHub 저장소 주소]
$ git remote -v
origin https://github.com/nnoco/git-github-nnoco (fetch)
origin https://github.com/nnoco/git-github-nnoco (push)
git remote -v 명령으로 원격 저장소가 등록된 것을
확인할 수 있습니다.
58. 32 원격 저장소에 푸시(Push) git push
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
git push [Remote] [Branch] 명령으로
원격 저장소에 로컬 저장소의 파일을 업로드 합니다.
$ git push origin master
Username for 'https://github.com': nnoco
Password for 'https://nnoco@github.com':
Counting objects: 27, done.
Delta compression using up to 16 threads.
Compressing objects: 100% (16/16), done.
Writing objects: 100% (27/27), 2.87 KiB | 0 bytes/s, done.
Total 27 (delta 4), reused 0 (delta 0)
To https://github.com/nnoco/git-github-nnoco
* [new branch] master -> master
인증을 위해 아이디와 비밀번호를 입력하면 푸시 과정이
진행되는 것을 확인할 수 있습니다.
61. 35 버그 발견! 중복 생성된 번호 확인하기
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
아까랑 똑같죠?
git checkout –b [브랜치]로 브랜치 생성&체크아웃
그리고 LottoGenerator 클래스의 버그 수정
$ git checkout -b hotfix2
Switched to a new branch 'hotfix2’
package project;
import java.util.Random;
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
public class LottoGenerator {
private Random random = new Random(System.nanoTime());
public int[] generate() {
int[] result = new int[6];
int index = 0;
Set<Integer> generated = new HashSet<>();
while(generated.size() < 6) {
int num = random.nextInt(45) + 1;
// 생성된 목록에 포함되어 있지 않으면 추가
if(!contains(generated, num)) {
result[index++] = num;
generated.add(num);
}
}
return result;
}
boolean contains(Set<Integer> generated, int num) {
return generated.contains(num);
}
public static void main(String[] args) {
int[] result = new LottoGenerator().generate();
System.out.println(Arrays.toString(result));
}
}
src/project/Lo#oGenerator.java
이 코드도 복붙하세요~
hotfix2
62. 36 add와 commit을 한 번에
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
5. fix to remove duplicate numbers
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
사실 git add는 조금 무의미하게 반복될 때가 있어서
add와 commit을 한번에 할 수 있는 방법이 있습니다.
git commit 명령 실행 시 –a 옵션을 더해줍니다.
$ git commit –am “fix to remove duplicate numbers”
[hotfix2 cae4f5b] fix to remove duplicate numbers
1 file changed, 16 insertions(+), 2 deletions(-)
-a 옵션은 파일의 상태가 tracked인 경우에 한해서 적용되며
스테이징 영역에 파일을 추가하는 작업을 건너뛸 수 있습니다.
5
hotfix2
63. 37 충돌 만들기 (1)
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
5. [hotfix2] fix to remove duplicate
numbers
6. [hotfix2] modify comment
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
Git은 문제가 없는 경우 자동으로 병합이 되지만,
서로 다른 브랜치에서 같은 부분이 수정된 경우에는
충돌(Conflict)이 발생할 수 있습니다.
임의로 충돌이 나는 상황을 만들고, 이를 수정해보겠습니다.
LottoGenerator의 소스코드를 복사(Ctrl+C) 한 후
hotfix2 브랜치에서 주석 부분을 조금 수정합니다.
5
hotfix2
// 생성된 목록에 포함되어 있지 않으면 추가
-> //// 생성된 목록에 포함되어 있지 않으면 추가 //
$ git commit –am “modify comment”
[hotfix2 cae4f5b] fix to remove duplicate numbers
1 file changed, 1 insertions(+), 1 deletions(-)
6
64. 38 충돌 만들기 (2)
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
5. [master] modify comment
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
다음으로 master 브랜치로 체크아웃 한 후
금방 복사한 소스코드를 그대로 붙여넣고,
역시 주석 부분을 아래와 같이 수정합니다.
5
hotfix2
// 생성된 목록에 포함되어 있지 않으면 추가
-> /* 생성된 목록에 포함되어 있지 않으면 추가 */
$ git commit –am “modify comment”
[hotfix2 cae4f5b] fix to remove duplicate numbers
1 file changed, 1 insertions(+), 1 deletions(-)
6
$ git checkout master
Switched to branch ‘master’
5
65. 39 충돌 만들기 (3)
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
5. [master] modify comment
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
이제 git merge 명령으로 브랜치를 병합합니다.
5
hotfix2
6
$ git merge hotfix2
Auto-merging src/project/LottoGenerator.java
CONFLICT (content): Merge conflict in src/project/
LottoGenerator.java
Automatic merge failed; fix conflicts and then commit the
result.
5
LottoGenerator.java 파일에 충돌이 있어서
Git이 자동으로 브랜치를 병합하는데 실패했다는
메시지가 표시됩니다.
66. 40 충돌 해결하기
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
5. [master] modify comment
6. [master] resolve merge conflict
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
편집기에서 LottoGenerator.java 파일을 엽니다.
<<<<<<< HEAD
/* 생성된 목록에 포함되어 있지 않으면 추가. */
=======
//// 생성된 목록에 포함되어 있지 않으면 추가 //
>>>>>>> ho@ix2
주석을 수정한 부분에 기호와 함께 브랜치 이름이 있습니다.
HEAD 부분이 master 브랜치에서 수정한 내용입니다.
둘 중 보존할 코드를 두고 나머지 라인을 지우고 저장합니다.
/* 생성된 목록에 포함되어 있지 않으면 추가. */
$ git commit –am “resolve merge conflict”
[master 01aa0d4] resolve merge conflict
1
master
2 3 4
5
hotfix2
6
5 6
67. 41 커밋 로그 확인 & 원격 저장소에 Push
Working Directory
Staging Area
.gitignore
make
README.md
src/project/LottoGenerator.java
Local Git Repository Branch
1. add .gitignore
2. initialize
3. add a generate method
4. fix range of generated numbers
5. [master] modify comment
6. [master] resolve merge conflict
Commit Logs
lotto-gen
bin
src
project
LottoGenerator.java
README.md
make
.gitignore
1
master
2 3 4
병합이 어떤 모습으로 되었는지 git log로 볼 수 있습니다.
5
hotfix2
6
5
$ git log --pretty=oneline –graph
* d6103389f8bdb2b5f3dcd704951153979c032c35 resolve merge
conflict
|
| * 29958dfac599fd0041dbc572ec5b78e865d185fc modify comment
| * 3377035191476e9e1cf5b4775e1de06b87777c37 fix to remove
duplicate number
...
6
지금까지의 커밋을 원격 저장소로 푸시합니다.
$ git push origin master
Username for 'https://github.com': nnoco
Password for 'https://nnoco@github.com':
...
91. 23 Pull Request 보내기 (5)
$ git clone https://github.com/ma-non-troppo/git-github-nnoco.git
Cloning into 'git-github-nnoco'...
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 43 (delta 10), reused 43 (delta 10), pack-reused 0
Unpacking objects: 100% (43/43), done.
Checking connectivity... done.
원격 저장소의 주소를 복사하여 git clone [URL] 명령을 실행합니다
$ ls
git-github-nnoco lotto-gen
$ cd git-github-nnoco
$ pwd
/workspace/git-github-nnoco
ls 명령어를 실행하면 git-github-[아이디] 디렉토리가
생성된 것을 확인하실 수 있습니다. cd 명령어로 해당 디렉토리로 들어갑니다.
$ cd /workspace
구름 IDE의 터미널에서 /workspace 디렉토리로 이동합니다.
92. 24 Pull Request 보내기 (6)
vim 에디터로 주석 부분을 단행 주석으로 수정합니다.
/* 생성된 목록에 포함되어 있지 않으면 추가. */
-> // 생성된 목록에 포함되어 있지 않으면 추가.
$ git checkout –b topic
Switched to a new branch ‘topic’
코드 수정을 위해 topic 브랜치를 만들고 체크아웃 합니다.
$ vim src/project/LottoGenerator.java
수정 사항을 커밋합니다.
$ git commit –am “modify comment”
[topic 10cdbab] modify comment
1 file changed, 1 insertion(+), 1 deletion(-)
그리고 원격 저장소로 Push!
$ git push origin topic
Username for 'https://github.com': ma-non-troppo
Password for 'https://ma-non-troppo@github.com':
Counting objects: 10, done.
...
118. GIT, 좀 더 깊게 보기
20% Cooler Octocat - https://octodex.github.com/twenty-percent-cooler-octocat
119. 01 .git 디렉토리 살펴보기
COMMIT_EDITMSG
HEAD
ORIG_HEAD
branches
config
description
hooks
index
info
logs
objects
refs
마지막 커밋 메시지
현재 체크아웃한 브랜치를 가리키는 포인터
origin의 헤드를 가리키는 포인터
예전 버전에 사용한 브랜치 정보
해당 프로젝트에만 해당되는 설정
GitWeb 등에서 사용하는 프로젝트 정보
클라이언트 훅(Hook)이나 서버 훅 스크립트 위치
스테이징 영역의 정보를 저장
.gitignore와 같은 역할을 하며 버전관리는 되지 않음
커밋 로그 정보
모든 정보를 저장하는 데이터베이스
커밋 객체의 참조 정보(포인터) 저장
120. 02 Git Branch 전략
h#p://nvie.com/posts/a-successful-git-branching-model/
1. 개발 브랜치(Develop)에서 작업 브랜치(feature)를
생성해서 기능을 구현하거나 수정
2. 작업 브랜치(feature)에서 코드를 모두 작성하면, 개발
브랜치(develop)에 merge
3. 1번과 2번을 반복하면서 배포할 수 있는 수준까지 개
발
4. 배포를 위한 릴리즈 브랜치(release)를 생성
5. 배포 작업이 끝나면 master 브랜치에 merge하고, 버
전 태그를 붙여서 배포
6. 배포하고 있는 소프트웨어에 버그가 있는 경우에는 해
당 버전을 기반으로 수정(hotfixes 브랜치)
- master 브랜치는 항상 안정된 버전(배포 가능한 버전)
- 브랜치가 많아서 복잡할 수 있음
- git-flow 툴을 설치하여 효율적으로 관리 가능
- 어떤 브랜치가 서로 상호작용 하는지 이해하고 있어야
함
121. 03 Commit Message의 활용 (1)
커밋 메시지는 ‘잘’ 작성해야 합니다.
커밋 가이드라인
• 공백 문자를 깨끗이 제거한다.
• 최대한 수정 사항을 하나의 주제로 요약한다.
• 여러 가지 이슈에 대한 수정사항을 하나의 커밋에 담지 않는다.
• 적절한 메시지를 작성한다 : 반드시 좋은 커밋 메시지를 담는다.
• 같은 파일의 다른 부분을 수정하는 경우에는 git add -patch 명령을 이용한
다.
• 한 부분씩 나누어 Stage 영역에 저장한다.
122. 04 Commit Message의 활용 (2)
커밋 메시지 양식
• 첫 줄에는 50자(영문, 한글 25자) 로 간략히 요약해서 작성한다.
• 두 번째 줄을 비우고 세 번째 줄에 자세하게 설명글을 작성한다.
(개발동기, 구현 상황, 제약조건/상황 등)
• 글은 현재형을 사용한다.
• 추가 내용은 한 줄 띄우고 시작한다.
• 커밋 메시지가 잘 쓰여진 프로젝트를 받아서 git log --no-merges 명령으로 살펴
본다.
Redirect user to the requested page aOer login
h#ps://trello.com/path/to/relevant/card
Users were being redirected to the home page aOer login, which is less
useful than redirec+ng to the page they had originally requested before
being redirected to the login form.
* Store requested path in a session variable
* Redirect to the stored loca+on aOer successfully logging in the user
커밋 메시지 영문 예시
123. 05 Commit Message의 활용 (3)
GitHub의 커밋 메시지 활용
• 관련 이슈 링크
커밋 메시지에 #이슈번호 를 쓰면 해당 이슈 링크가 자동으로 생성
• 이슈 닫기(Close)
fix #이슈번호, fixes #이슈번호, fixed #이슈번호, close #이슈번호, resolve #이슈번호 등
Open 상태인 이슈는 커밋 메시지로 인해 자동으로 Close 됨
• 알림(Notification) 보내기
@사용자이름 또는 @조직이름을 쓰면 해당 사용자나 조직 멤버에게 알림 전송
@조직이름 팀이름을 쓰면 해당 팀에게 알림 전송
124. 더 볼 수 있는 곳들
Professortocat_v2 - https://octodex.github.com/Professortocat_v2