4. 1. About Git & Git Flow
1. Git의 특징 (Git vs SVN)
1. 로컬 저장소와 원격 저장소의 분리
→ 분산 처리, 데이터 안정성, 빠른 처리 속도
2. 스테이지 영역 존재
→ 커밋 대상 분리
3. 스냅샷을 이용한 버전 관리
→ 빠르고 편리한 브랜치 & 병합 기능
참고자료 : https://www.slideshare.net/einsub/svn-git-17386752 - SVN 능력자를 위한 Git 개념 가이드
2. Git Flow
1. 협업 시 Git을 통해 버전 관리하는 방법 / 약속
2. 크게 Git flow / GitHub flow / GitLab flow로 분류
3. 공통적으로 크게 릴리즈 버전을 관리하는 브랜치와 개발 중인 버전을 관리하는 브랜치로 나뉨
* 브랜치 : 작업 내용 (Commit) 사이를 이동할 수 있는 일종의 포인터
Author : MDLicht
4
5. 2. Git Flow
구조
• Master / Develop 브랜치를 기반
• Feature / Release / Hotfix 브랜치와 함께 운영
장점
• 명령어가 나와있음
• 에디터와 IDE에 플러그인으로 존재
단점
• 브랜치가 많아 복잡함
• 사용하지 않는 브랜치가 있음
Feature
Branch
새로운 기능을 추가하는 브랜치
• 나오는 곳 : Develop 브랜치
• 들어가는 곳 : Develop 브랜치
Release
Branch
새로운 릴리즈를 위한 브랜치
- Develop 브랜치에서 기능을 묶어 Release 브랜치로 이동
- 버그 수정에 대한 부분만 커밋
- 릴리즈 준비 완료 시 Master 브랜치로 병합
• 나오는 곳 : Develop 브랜치
• 들어가는 곳 : Develop, Master 브랜치
Hotfix
Branch
발생한 버그를 수정하는 브랜치
• 나오는 곳 : Master 브랜치
• 들어가는 곳 : Develop, Master 브랜치
Author : MDLicht
5
6. 3. GitHub Flow(1)
구조
• 항상 최신 상태인 Master 브랜치를 기반
• Release 브랜치가 명확하지 않은 시스템에 알맞음
• Hotfix 같은 작은 기능을 구분하지 않음
장점
• 구조가 단순함
• CI가 필수적
• 배포 자동화 가능
단점 • CI 및 배포 자동화가 되어있지 않은 경우 수작업 필요
Master
Branch
• 항상 최신 상태를 유지
• 엄격한 Role 필요
• 기능 테스트 및 리뷰가 끝난 후 Master 브랜치에 병합
ETC
Branch
• 브랜치 생성 시 이름을 자세하게 작성해야함
Remote
Branch
(원격저장소)
• 작업 내용을 수시로 PUSH
master
Author : MDLicht
6
7. 3. GitHub Flow(2)
PUSH
COMMIT
master
Remote
• 로컬 저장소에서 가장 최신 상태인 master 브랜치를 기반으로 하여 다른 브랜치를 생성하여 작업
• 기능 개발 및 버그 수정 시 새로운 브랜치를 생성한 후 작업
• 기능 개발이 완료될 경우 master 브랜치에 병합 및 원격 저장소에 PUSH
• 원격 저장소의 master 브랜치 역시 모든 작업 내용이 포함된 가장 최신 상태를 유지
Author : MDLicht
7
9. 1. Git 기능/명령어
init Git을 이용할 수 있도록 설정 초기화 add 작업 내용을 스테이지 영역에 등록
clone 기존 원격 저장소에서 작업 내용 복사 commit 작업 내용을 로컬 저장소에 저장
branch Git 브랜치 생성/관리 pull 원격 저장소로부터 최신 작업 내용을 로드
checkout 특정 브랜치 로 이동 push
로컬 저장소에 저장된 작업 내용을 원격 저장소에
저장
merge 특정 브랜치 (A and B)를 하나로 병합 rebase 특정 브랜치로 작업 내용을 이동
status 현재 작업 상태 조회
외 다수 기능/명령어 보유
참고 URL : http://rogerdudler.github.io/git-guide/index.ko.html
Author : MDLicht
9
10. 2. .gitignore 파일
.gitignore 파일?
• 프로젝트 업데이트 시 백업 파일, 컴파일 파일, 로그 파일 등 불필요한 파일을 Git에서 제외시킬 수 있는 설정을 담은 파일
• 프로젝트 생성 시 .gitignore 파일을 설정하는 것을 권장
파일 생성 및 적용
• Git 커맨드 창에서 vim .gitignore 로 파일 생성 후 Git에 불필요한 파일명을 기록 (예 - *.log , sample.png , build/ , doc/*.txt)
• 프로젝트 최상위 디렉터리에 .gitignore 파일을 생성
• .gitignore 파일 생성 후 로컬 저장소에 Commit 및 원격 저장소에 Push
.gitignore.io - https://www.gitignore.io/
• 입력한 언어 환경에 맞는 .gitignore 파일 내용을 자동 생성하는 서비스
[검색창에 개발환경 검색] [예 - 생성된 안드로이드 개발환경의 .gitignore 파일 내용]
Author : MDLicht
10
11. 3. Git 이용 시나리오
Init
Clone
Work
Branch
생성
Work
Branch
Check-out
변경사항
Add
변경사항
Commit
Master
Branch
Check-out
Pull
Merge
with
Work
Branch
Push
Git
초기화
원격 저장소와 동기화 및
원격 저장소에 작업 내용 반영
새로운 작업 및 로컬 저장소에 저장
#1
#2
#3
M
PUSH
R
#3. 원격 저장소에
작업 내용 저장
#1. 원격 저장소로부터
최신 사항 불러오기
M
PULL
#2. 최신 사항이 반영된
master 브랜치와 작업 내용 병합
M
MERGE
추가 변경사항 적용
Author : MDLicht
11
13. 1. TortoiseGit 초기 설정
[새 Git 작업환경 설정 시]
Git 로컬 저장소를 만들 폴더에서 우클릭 후
[Git Create repository here…] 클릭
[기존 Git 작업환경 이용 시]
Git 로컬 저장소를 만들 폴더에서 우클릭 후
[Git Clone] 클릭
OR
데이터를 불러올 원격 저장소 URL 및
로컬 저장소 경로를 지정한 후 [OK] 버튼 클릭
Git 정보가 포함된 .git 폴더 및 프로젝트 폴더 생성
Author : MDLicht
13
14. 2. TortoiseGit Branch 생성
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Create Bracn…] 선택
브랜치 이름 및 브랜치가 생성될 위치를 선택 후
[OK] 버튼 클릭
HEAD (master)
• HEAD 는 현재 참조하고 있는 작업 내용, 브랜치를 의미
• 이 경우 master 브랜치를 참조하고 있음을 알 수 있음
• Commit, Pull, Push 등 Git 작업을 할 때 현재 HEAD가 어느
위치인지 확인 및 주의해야함
메뉴 선택 시 브랜치 생성과 동시에 새로운 브랜
치로 Checkout
(HEAD를 새로운 브랜치로 이동)
Author : MDLicht
14
15. 2. TortoiseGit Branch 생성 - Revision Graph
브랜치 생성 전 [TestBranch] 브랜치 생성 후
빨간색 브랜치 : 현재 HEAD(참조중인 브랜치)
초록색 브랜치 : 로컬 저장소에서 생성한 브랜치
연주황색 브랜치 : 원격 저장소의 브랜치
새로운 TestBranch를 생성했으나 HEAD는 아직 master 브
랜치인 상태
Author : MDLicht
15
16. 2. TortoiseGit 특정 Branch로 이동 (Checkout)
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Switch/Checkout…] 선택
Checkout 하려는 브랜치 이름을 선택한 후
[OK] 버튼 클릭
태그 및 커밋 id를 이용하여
Checkout 가능
Author : MDLicht
16
17. 3. TortoiseGit 특정 Branch로 이동 (Checkout) - Revision Graph
[TestBranch]로 Checkout 전 [TestBranch]로 Checkout 후
HEAD가 TestBranch임을 알 수 있음
Author : MDLicht
17
18. 4. TortoiseGit Add (작업 내용을 스테이지 영역에 등록)
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Add…] 선택
버전 관리하려는 파일을 선택한 후 [OK] 버튼 클릭
(이후 변경 사항 발생 시 ‘수정된 파일’로 관리)
Author : MDLicht
18
19. 5. TortoiseGit Commit (로컬 저장소에 작업 내용 저장)
프로젝트 폴더 우클릭 후
[Git Commit -> “OOO Branch”] 메뉴 클릭
Commit 메시지 작성 및 저장하려는 작업내용을
선택한 후 [Commit] 버튼 클릭
해당 Commit (작업 내용)에 반영된 내용 등의 메시지를적을 수 있는 공간
원격 저장소에 저장할 변경된 작업 내용들을 선택하는 공간
Modified Files
• 이전 Commit에서Git에 업데이트되어 변경사항을관리받고 있는 파일 가운데에서수
정된 파일을 의미
Not Versioned Files
• 아직 Git에 업데이트 되지 않아 변경사항이관리되지않고 있는 파일을 의미
• 해당 파일을 선택하여 Add해야 작업 내용이 Commit에 반영됨
Author : MDLicht
19
20. 5. TortoiseGit Commit (로컬 저장소에 작업 내용 저장) - Revision Graph
[TestBranch] Commit 전 [TestBranch] Commit 후
이 때, master 브랜치 와 TestBranch 브랜치의 내용은 다름
Author : MDLicht
20
21. 6. TortoiseGit Pull (원격 저장소의 최신 사항 불러오기)
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Switch/Checkout…] 선택
[master Branch] 선택한 후
[OK] 버튼 클릭
원격 저장소 명
원격 저장소 브랜치명
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Pull…] 선택
원격 저장소에 저장되어 있는 정보를 받기 위해
필요한 옵션을 설정한 후 [OK] 버튼 클릭
Author : MDLicht
21
22. 6. TortoiseGit Pull (원격 저장소의 최신 사항 불러오기) - Revision Graph
원격 저장소 내용을 불러오기 전 원격 저장소 내용을 불러온 후
현재 HEAD가 master 브랜치라는 것과
원격 저장소와 로컬 저장소의 master의 내용이 동일한 상태임을 알 수 있음.
Author : MDLicht
22
23. 7. TortoiseGit Merge (작업 내용 병합)
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Merge…] 선택
병합하려는 브랜치를 선택한 후 [OK] 버튼 클릭
(현재 HEAD인 master와 작업 내용인 TestBranch를 병합)
Author : MDLicht
23
24. 7. TortoiseGit Merge (작업 내용 병합)
master 브랜치와 TestBranch 브랜치 병합 전 master 브랜치와 TestBranch 브랜치 병합 후
Author : MDLicht
24
25. 8. TortoiseGit Push (작업 내용을 원격 저장소에 저장)
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Push…] 선택
로컬 저장소 및 원격 저장소 브랜치 설정 후
[OK] 버튼 클릭
Author : MDLicht
25
26. 8. TortoiseGit Push (작업 내용을 원격 저장소에 저장) - Revision Graph
변경사항을 원격 저장소에 Push 전 변경사항을 원격 저장소에 Push 후
HEAD가 master 브랜치이며, 원격 저장소의 내용과
로컬 저장소의 master가 동일한 내용임을 알 수 있음
Author : MDLicht
26
27. 9. TortoiseGit Commit 내역 조회 (Log)
프로젝트 폴더 우클릭 후 [TortoiseGit] 메뉴 아래의
[Show log] 선택
현재까지의 Commit 내역 및
각 브랜치의 정보를 조회 가능
Author : MDLicht
27
28. 10. TortoiseGit 사용하지 않는 Branch 이름 삭제
Git Log에서 삭제하려는 브랜치 이름 우클릭 후
[Delete refs/heads/OOO] 메뉴 클릭
해당 브랜치 이름이 삭제된 것을 확인
Author : MDLicht
28
30. 1. Git 초기 설정
[새 Git 작업환경 설정 시]
git init 명령어를 입력하여 로컬 저장소 설정
[기존 Git 작업환경 이용 시]
git clone REMOTE_STORAGE_URL 명령어를
입력하여 원격 저장소의 데이터를 로드
OR
Git 정보가 포함된 .git 폴더 및 프로젝트 폴더
Author : MDLicht
30
31. 2. Git Branch 생성 및 삭제
git branch BRANCH_NAME 명령어로 새로운 브랜치 생성 git branch 명령어로 브랜치 리스트 확인
1) 생성
git branch –d BRANCH_NAME 명령어로 해당 브랜치 삭제
2) 삭제
git branch 명령어로 브랜치 리스트 확인
Author : MDLicht
31
32. 3. Git Checkout
git checkout BRANCH_NAME 명령어로 선택한 브랜치로 이동
HEAD가 master 브랜치에서
test_branch 브랜치로 변경된
것을 확인
체크아웃 결과 확인
1) 일반
2) 옵션
HEAD가 master 브랜치에서
새로 생성된 test_branch
브랜치로 변경된 것을 확인
git checkout -b BRANCH_NAME 명령어로 새로운 브랜치 생성 및 이동 생성된 브랜치 및 체크아웃 확인
Author : MDLicht
32
33. 4. Git Log
git log 명령어로 Commit 내역 확인
1) 일반 git log 명령어
#40 슬라이드에 있는 Alias 설정한 후
git lg 명령어로 트리 구조 Commit 내역 확인
2) Better git log
Commit 내역에 대한 키 값
브랜치 이름 대신 해당 키 값으로
Checkout 가능 Commit 메시지
Commit 한 사용자
Commit 시간
해당 Commit에 대한 브랜치 정보
‘HEAD->’ 가 붙은 브랜치가 현재 HEAD
Author : MDLicht
33
34. 5. Git Status
git status 명령어를 통한 현재 git 상태 조회
git에 의해 버전관리가 되고 있으며, 수정사항이 발생한 파일
git에 의해 버전관리가 되고있지 않은 파일
스테이지 영역에 등록되지 않은 상태
Author : MDLicht
34
35. 6. Git Add and Commit
stage 상태로 전환된 파일
1. git add . 명령어를 입력하여 모든 수정, 생성된 파일을
unstage 상태에서 stage 상태로 전환
2. git status 명령어를 입력하여 stage 상태로 전환된 파
일 리스트 확인
3. git commit –m ‘COMMIT_MSG’ 명령어를 입력하
여 stage 상태로 전환된 파일들만 메시지와 함께 커밋
에 반영
Author : MDLicht
35
36. 6. Git Add and Commit
git lg 명령어를 입력하여 변경 사항이 반영된 Commit이 된 것을 확인
* git lg 는 alias 로 지정
Author : MDLicht
36
37. 7. Git Pull
HEAD를 master 브랜치로 이동한 후, git pull 명령어로 원격 저장소로부터 최신 데이터 로드
Author : MDLicht
37
38. 8. Git Merge
작업 내용이 병합된 master 브랜치를 확인 가능
Push를 하지 않아 원격 저장소(origin/master)와
로컬 저장소(master)의 내용이 다름
HEAD가 master 브랜치인 상태에서,
git merge OTHER_BRANCH_NAME 명령어로
Master 브랜치와 작업 내용이 포함된 브랜치를 병합
Author : MDLicht
38
39. 9. Git Push
git push REMOTE_STORAGE REMOTE_BRANCH 명령어로
원격 저장소에 작업 내용 저장
git lg 명령어를 입력하여 로컬 저장소(master)와
원격 저장소(origin/master)의 내용이 같음을 확인
* git lg 는 alias 로 지정, 다음 슬라이드 참고
Author : MDLicht
39
40. 7. 많이 사용하는 Git 명령어 Alias
git config --global alias.YOUR_ALIAS GIT_COMMAND 의 명령어로 특정 명령어를 지정할 수 있다.
많이 사용하는 Git 명령어 Alias는 아래와 같다.
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -
%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
Author : MDLicht
40
44. 1. Git 설치(2)
설치할 요소를 선택 후 [다음] 버튼 클릭
※ 가급적 기본 요소를 설치
[Use Git from the Windows Command Prompt]
선택 후 [다음] 버튼 클릭
※ 윈도우 커맨드 창에서도 Git 명령어 입력 가능
Author : MDLicht
44
45. 1. Git 설치(3)
[Use the OpenSSL library] 선택 후
[다음] 버튼 클릭
[Checkout Windows-style, commit -]
선택 후 [다음] 버튼 클릭
Author : MDLicht
45
46. 1. Git 설치(4)
[Use MinTTY] 선택 후 [다음] 버튼 클릭
※ 기본 Git 커맨드 창으로 전용 입력창을 사용
추가 옵션 선택 후 [설치] 버튼 클릭
Author : MDLicht
46
47. 1. Git 설치(5)
설치 후 우클릭 시 추가된 Git 메뉴 확인 [Git Bash Here] 선택 시 실행되는 Git 커맨드 창
Author : MDLicht
47
54. 1. Meld 설치(2)
윈도우키 입력 후
Git Bash 검색하여 실행
ls -al 을 입력하여 .gitconfig
파일이 있는지 확인
Author : MDLicht
54
55. 1. Meld 설치(3) - mergetool 지정
vim .gitconfig 입력하여 파일을 연 후 i를 입력하여 끼워넣기 모드로 전환 후 하단의 내용 추가
[merge]
tool = meld
[mergetool "meld"]
path = C:Program Files (x86)Meldmeldmeld.exe (Meld 설치 경로)
keepBackup = false
trustExitCode = false
내용 추가 후 ESC → :wq → 엔터 입력하여 추가된 내용 저장
Author : MDLicht
55
56. 1. Meld 설치(4) - difftool 지정
vim .gitconfig 입력하여 파일을 연 후 i를 입력하여 끼워넣기 모드로 전환 후 하단의 내용 추가
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
path = C:Program Files (x86)Meldmeldmeld.exe (Meld 설치 경로)
내용 추가 후 ESC → :wq → 엔터 입력하여 추가된 내용 저장
Author : MDLicht
56
57. 1. Meld 설치(5) - mergetool 실행
• Merge 시 충돌이 발생했을 경우, git mergetool 명령어를 이용하여 meld 실행 가능
• 현재 상황(가운데)를 중심으로 로컬저장소(왼쪽), 원격저장소(오른쪽)의 내용을 참고 및 적용하여 병합 가능
• 화살표 위에 마우스 포인터를 두고 Ctrl 입력 시 추가, Shift 입력 시 삭제 가능
• 수정된 사항을 저장한 후 창 종료 시 다음 충돌된 사항을 표시
Author : MDLicht
57
58. 1. Meld 설치(6) - difftool 실행
• 변경사항을 확인하고 싶을 경우 git difftool [commit id | 파일명] 을 입력하여 difftool 실행
• git difftool 만 입력할 경우 현재 변경된 모든 사항을 확인 가능
Author : MDLicht
58