SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
hs.lee
파일 변화를 시간에 따라 기록했다가 나중에 특정 버전을 다시 불러올 수 있는 시스템
버전 관리 시스템
버전 관리 시스템
Version Control System
Version Database
File
checkout
Version 1
Version 2
Version 3
Local Computer
로컬 VCS
중앙집중식 버전 관리 시스템
Central Version Control System
Version 1
Version 2
Version 3
File
Local Computer
File
Local Computer
Version Database
중앙 VCS 서버 File
Local Computer
File
Local Computer
Version 1
Version 2
Version 3
분산 버전 관리 시스템
Distributed Version Control System
Version 1
Version 2
Version 3
Version Database
Server Computer
Version 1
Version 2
Version 3
File
Local Computer
Version Database
Version 1
Version 2
Version 3
File
Local Computer
Version Database
Version 1
Version 2
Version 3
File
Local Computer
Version Database
Version 1
Version 2
Version 3
File
Local Computer
Version Database
Version 1
Version 2
Version 3
CVCS와 DVCS
Online Source Control
Longer time to store because all of the data is
stored in a centralized repository.
Offline Source Control
Extremely fast because complete copy of the
data is stored locally in the client’s system.
CVCS DVCS
SVN data flow Git data flow
Working
Directory
Remote
Repository
Merge
Rsync
(Remote Sync)
Remote Repository
Local Repository
Index
push
commit
add
fetch
checkout
HEAD
Working Directory
pull
CVCS DVCS
The way SVN thinks about its data The way Git thinks about its data
CVCS DVCS
각 파일에 대한 변화를 저장 시간 순으로 프로젝트의 스냅샷을 저장
Version1 Version2 Version3 Version4 Version5
코끼리
호랑이
곰
오렌지
코끼리
→ 물개
오렌지
→ 사과
물개 →
코끼리
곰
→ 사람
사과
→ 나무
Version1 Version2 Version3 Version4 Version5
코끼리
호랑이
곰
오렌지
물개
Version 1
의 호랑이
Version
1의 곰
사과
코끼리
호랑이
사람
Version 2
의 사과
Version4
의 코끼리
Version4
의 호랑이
Version
4의 사람
나무
호랑이
→ 지렁이
Version
2의 물개
지렁이
Version
1의 곰
Version 2
의 사과
지렁이
→ 호랑이
세 가지 상태와 단계
Working directory
워킹 디렉터리
현재 작업 공간
프로젝트의 특정 버전에 체크아웃
Add 하기 전
Staging Area (=Index)
스테이징 영역
Commit 하려고 준비하는 공간
스냅샷을 만든다.
Add 직 후 Commit 직 전
.git directory
Local repository
스냅샷을 저장한다.
git init or git clone으로 생성됨
Commit 이후
Modified
Staged
Committed
Remote Repository
.git directory
공유되는 저장 공간
Hosting service 존재
ex. VSTS, Github, Bitbucket
Push 이후
로컬 환경
네트워크 환경
Untracked Tracked
1
2
3
명령어 탐색
Working directory
워킹 디렉터리
Staging Area (=Index)
스테이징 영역
.git directory
Local repository
Remote Repository
.git directory
로컬 환경
네트워크 환경
stash
stash
branch / checkout / cherry-pick
reset
revert
rebase
merge
log
diff
show
3 단계 모두에서 사용 가능
변경 되돌리기
Rebase & Amend
변경 되돌리기
git reset (HEAD) <file>
*git reset (HEAD) .
Modified
Working directory
워킹 디렉터리
Staged
Staging Area
스테이징 영역
add
Git add 했던 파일(들) 워킹 디렉터리로 되돌리기
변경 되돌리기
git checkout -- <file>
*git checkout -- .
Modified
Working directory
워킹 디렉터리
Modified 파일 Unmodified 상태로 되돌리기
Unmodified
Working directory
워킹 디렉터리
Modify
변경 되돌리기
git stash
git stash pop
변경 사항 잠시 보류하기
Stash stack
0
1
**Modified이면서 Tracked 상태인 파일과 Staging area에 있는 파일만 push 한다.
Modified
Working directory
워킹 디렉터리
add
Staged
Staging Area
스테이징 영역
커밋 수정하기
Rebase & Amend
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
마지막 커밋 수정하기
*git commit --amend
git rebase –i master
Commit --amend
Working directory
워킹 디렉터리
Staging Area
스테이징 영역
.git directory
Repository
Modified
Staged
Committed
commit --amend1
3 commit
2 수정 작업
8c58793
9f5a468
4 새로운 커밋 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
중간 커밋 수정하기
git rebase –i master
-i 플래그가 없으면 이 영역의 커밋을 모두 한번에 Rebase
-i 플래그가 있으면 커밋을 특정하여 잠시 멈추게 할 수 있다
git rebase –i master
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
git rebase –i master
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
각 스텝에서 뭔가 처리를 마치고 다음 커밋으로 스텝을 넘어가고 싶을 때
git rebase --continue
git rebase --skip
git rebase --abort
변경 처리를 마침
변경 하지 않고 그냥 넘어감
리베이스를 취소함 (모든 스텝을 취소함)
11’
git add . & git rebase --continue
git rebase --skip
git rebase --abort
중간 커밋 수정하기
git rebase –i master
Interactive rebase (대화형 리베이스)의
사용 법은 여기 다 있음
Pick = 수정 안 함.
Reword = 메시지만 바꿀 거임!
Edit = 코드나 파일 수정 좀 함!
Squash = 앞 커밋이랑 하나로 합칠 거.
메시지는 내가 고를 거임.
Fixup = squash랑 똑같은데, 앞 커밋의 커밋 메시지 쓸 거임.
지금 꺼 메시지는 버릴 거임.
Exec = 잠깐 shell 명령 실행할 거임.
(ex. 이전 커밋에서 테스트 돌려보고 싶을 때)
Drop = 버림.
----------------------------------------------------------------------------------
Rebase 실행 순서는 위 -> 아래임. 커밋 순서 재정렬 할 수 있음!
여기 있는 커밋 줄 지우면 그 커밋은 영영 바이바이임.
근데 다 지우면 이 리베이스는 걍 없던 일로 함.
빈 커밋(변경 사항 없는 커밋)은 주석 처리함.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
중간 커밋 수정하기
Rewored: 커밋 메시지만 수정한다
11’
1 2 3 4 5 6 7 8 9 12 13 14 15 16 1710 + 11
중간 커밋 수정하기
Squash & Fixup: 이전 커밋과 합친다
S: 메시지는 내가 고른다 (아니면 아예 새로 쓴다)
vs
F: 앞 커밋 메시지를 적용한다
중간 커밋 수정하기
Drop: 커밋을 버린다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
중간 커밋 수정하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
11’
삭제
수정
git reset HEAD^ --hard -> git rebase --continue
git commit --amend -> git rebase --continue
Edit: 합치는 것 빼고 다 한다
but,한번 꼬이기 시작하면 abort 말곤 답이 안 보인다.
중간 커밋 수정하기
1 2 3 4 5 6 7 8 9 10 11’ 12 13 14 15 16 1711
추가 (혹은 분리)
git commit --amend -> git commit -> git rebase --continue (커밋 분리)
git commit (X 필요한 만큼) -> git rebase --continue (추가 커밋)
Edit: 합치는 것 빼고 다 한다
but,한번 꼬이기 시작하면 abort 말곤 답이 안 보인다.
Re-order: 커밋 순서 재정렬
중간 커밋 수정하기
conflict는 그대의 몫
중간 커밋 수정하기
(응용) Edit이 무서울 때,
커밋을 본격 수정하기 전에 일단 한번 코드만 적용해보고 싶을 때
1. branch를 새로 판다 (git checkout -b rebase-practice)
2. 맘껏 edit 해 본다.
3. 맘에 들면 원래 브랜치 이름으로 바꾼다 (git branch –m hs/104-work-branch)
3’. 맘에 들지 않으면 연습 브랜치를 그냥 버린다.
1. 일단 코드를 수정하고, commit 한다.
2. git rebase –i maser
3. 맨 마지막에 추가한 커밋에 fixup 혹은 sqush 플래그를 설정한다.
4. 수정하고 싶었던 커밋의 바로 뒤로 순서를 조정한다.
5. 수정하고 싶었던 커밋과 합쳐지며 edit한 것과 같은 효과를 볼 수 있다.
커밋 가져오기
Cherry-pick
master 2 3 4 5 6 71
브랜치 A
a3f9f75
2 3 41
브랜치 B
master
git cherry-pick a3f9f75e324a91a44c09471ae9e8010503e60b54
7
new hash
다른 브랜치에 있는 커밋을 하나만 선택해서 가져온다
커밋 가져오기
git cherry-pick <full hash>
(응용) 지금 브랜치의 특정 커밋을 새로운 브랜치로 분리하고 싶을 때
master 2 3 4 5 6 71
브랜치 A
a3f9f75de4739c
A에서 체크아웃한 브랜치
master 74
new hash new hash
git checkout –b new-branch-from-A
git cherry-pick de4739c41e79246f7a0df5bc51c17245ede87188
git cherry-pick a3f9f75e324a91a44c09471ae9e8010503e60b54
master 2 3 5 61
브랜치 A
git checkout branch-A && git rebase –i master -> drop de4739c & a3f9f75
Q & A

Más contenido relacionado

La actualidad más candente

Enterprise Linux 7 new feature_systemd_booting
Enterprise Linux 7 new feature_systemd_bootingEnterprise Linux 7 new feature_systemd_booting
Enterprise Linux 7 new feature_systemd_bootingsuk kim
 
Debian packaging - Advanced
Debian packaging - AdvancedDebian packaging - Advanced
Debian packaging - Advanced경섭 심
 
[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1
[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1
[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1Ji-Woong Choi
 
Filemerge성능분석
Filemerge성능분석Filemerge성능분석
Filemerge성능분석선 유
 
국민대학교 고급 시스템 프로젝트 #1
국민대학교 고급 시스템 프로젝트 #1국민대학교 고급 시스템 프로젝트 #1
국민대학교 고급 시스템 프로젝트 #1dldmsmchddldmschd
 
3.ubuntu custom
3.ubuntu custom3.ubuntu custom
3.ubuntu customsprdd
 
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)Ubuntu Korea Community
 
cross compile
cross compilecross compile
cross compilehe4722
 
Make fast file merge program using c (stage 2)
Make fast file merge program using c (stage 2)Make fast file merge program using c (stage 2)
Make fast file merge program using c (stage 2)Dong Kyu Lee
 
[오픈소스컨설팅]초간단 Cubrid HA구성
[오픈소스컨설팅]초간단 Cubrid HA구성[오픈소스컨설팅]초간단 Cubrid HA구성
[오픈소스컨설팅]초간단 Cubrid HA구성Ji-Woong Choi
 
우분투 커널 컴파일
우분투 커널 컴파일우분투 커널 컴파일
우분투 커널 컴파일he4722
 
Make fast file merge program using c
Make fast file merge program using cMake fast file merge program using c
Make fast file merge program using cDong Kyu Lee
 
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드Opennaru, inc.
 
노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)
노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)
노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)Ubuntu Korea Community
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은jieun kim
 
Enterprise Linux 7 new feature_network configuration
Enterprise Linux 7 new feature_network configurationEnterprise Linux 7 new feature_network configuration
Enterprise Linux 7 new feature_network configurationsuk kim
 
Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415
Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415
Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415sprdd
 
시스템 관리자를 위한 리눅스강의 1강 20130203
시스템 관리자를 위한 리눅스강의 1강 20130203시스템 관리자를 위한 리눅스강의 1강 20130203
시스템 관리자를 위한 리눅스강의 1강 20130203doo rip choi
 

La actualidad más candente (20)

Enterprise Linux 7 new feature_systemd_booting
Enterprise Linux 7 new feature_systemd_bootingEnterprise Linux 7 new feature_systemd_booting
Enterprise Linux 7 new feature_systemd_booting
 
Debian packaging - Advanced
Debian packaging - AdvancedDebian packaging - Advanced
Debian packaging - Advanced
 
Redis edu 4
Redis edu 4Redis edu 4
Redis edu 4
 
[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1
[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1
[오픈소스컨설팅]Nginx 1.2.7 설치가이드__v1
 
Filemerge성능분석
Filemerge성능분석Filemerge성능분석
Filemerge성능분석
 
국민대학교 고급 시스템 프로젝트 #1
국민대학교 고급 시스템 프로젝트 #1국민대학교 고급 시스템 프로젝트 #1
국민대학교 고급 시스템 프로젝트 #1
 
3.ubuntu custom
3.ubuntu custom3.ubuntu custom
3.ubuntu custom
 
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
 
cross compile
cross compilecross compile
cross compile
 
Make fast file merge program using c (stage 2)
Make fast file merge program using c (stage 2)Make fast file merge program using c (stage 2)
Make fast file merge program using c (stage 2)
 
[오픈소스컨설팅]초간단 Cubrid HA구성
[오픈소스컨설팅]초간단 Cubrid HA구성[오픈소스컨설팅]초간단 Cubrid HA구성
[오픈소스컨설팅]초간단 Cubrid HA구성
 
우분투 커널 컴파일
우분투 커널 컴파일우분투 커널 컴파일
우분투 커널 컴파일
 
Make fast file merge program using c
Make fast file merge program using cMake fast file merge program using c
Make fast file merge program using c
 
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
 
노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)
노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)
노태상 - 리눅스 커널 개요 및 이슈 아이엠 (2010Y01M30D)
 
Merge revesed
Merge revesedMerge revesed
Merge revesed
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
 
Enterprise Linux 7 new feature_network configuration
Enterprise Linux 7 new feature_network configurationEnterprise Linux 7 new feature_network configuration
Enterprise Linux 7 new feature_network configuration
 
Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415
Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415
Zinst 패키지 기반의-리눅스_중앙관리시스템_20140415
 
시스템 관리자를 위한 리눅스강의 1강 20130203
시스템 관리자를 위한 리눅스강의 1강 20130203시스템 관리자를 위한 리눅스강의 1강 20130203
시스템 관리자를 위한 리눅스강의 1강 20130203
 

Similar a About git

Git: A Motivating Introduction
Git: A Motivating IntroductionGit: A Motivating Introduction
Git: A Motivating IntroductionJongwook Choi
 
Git branch stregagy & case study
Git branch stregagy & case studyGit branch stregagy & case study
Git branch stregagy & case studyWoo Jin Kim
 
Git from google techtalks by Randal
Git from google techtalks by RandalGit from google techtalks by Randal
Git from google techtalks by Randalyagurchoi
 
Git 기본개념과 사용법 그리고 어플리케이션
Git 기본개념과 사용법 그리고 어플리케이션Git 기본개념과 사용법 그리고 어플리케이션
Git 기본개념과 사용법 그리고 어플리케이션Dabi Ahn
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드Insub Lee
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective GitChanwoong Kim
 
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함Ji-Woong Choi
 
git, 이해부터 활용까지
git, 이해부터 활용까지git, 이해부터 활용까지
git, 이해부터 활용까지jylee1229
 
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기Youngbin Han
 
오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식Matthew (정재화)
 

Similar a About git (20)

Git 기본
Git 기본Git 기본
Git 기본
 
Git
GitGit
Git
 
Git: A Motivating Introduction
Git: A Motivating IntroductionGit: A Motivating Introduction
Git: A Motivating Introduction
 
Git branch stregagy & case study
Git branch stregagy & case studyGit branch stregagy & case study
Git branch stregagy & case study
 
Git from google techtalks by Randal
Git from google techtalks by RandalGit from google techtalks by Randal
Git from google techtalks by Randal
 
Git tutorials
Git tutorialsGit tutorials
Git tutorials
 
Git
GitGit
Git
 
Git
GitGit
Git
 
Git 기본개념과 사용법 그리고 어플리케이션
Git 기본개념과 사용법 그리고 어플리케이션Git 기본개념과 사용법 그리고 어플리케이션
Git 기본개념과 사용법 그리고 어플리케이션
 
11. git basic
11. git basic11. git basic
11. git basic
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
git-basic-commands
git-basic-commandsgit-basic-commands
git-basic-commands
 
Git - Level 2
Git - Level 2Git - Level 2
Git - Level 2
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective Git
 
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
 
Git
Git Git
Git
 
git, 이해부터 활용까지
git, 이해부터 활용까지git, 이해부터 활용까지
git, 이해부터 활용까지
 
Advanced git
Advanced gitAdvanced git
Advanced git
 
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
 
오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식
 

Más de 혜승 이

How to edit my commit
How to edit my commitHow to edit my commit
How to edit my commit혜승 이
 
Cgs web project
Cgs web projectCgs web project
Cgs web project혜승 이
 
밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트
밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트
밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트혜승 이
 
Ch6.학습관련기술들
Ch6.학습관련기술들Ch6.학습관련기술들
Ch6.학습관련기술들혜승 이
 

Más de 혜승 이 (6)

Tdd.eng.ver
Tdd.eng.verTdd.eng.ver
Tdd.eng.ver
 
2nd. aop
2nd. aop2nd. aop
2nd. aop
 
How to edit my commit
How to edit my commitHow to edit my commit
How to edit my commit
 
Cgs web project
Cgs web projectCgs web project
Cgs web project
 
밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트
밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트
밑바닥부터 시작하는 딥러닝 - 학습관련기술들 스크립트
 
Ch6.학습관련기술들
Ch6.학습관련기술들Ch6.학습관련기술들
Ch6.학습관련기술들
 

About git

  • 2. 파일 변화를 시간에 따라 기록했다가 나중에 특정 버전을 다시 불러올 수 있는 시스템 버전 관리 시스템
  • 3. 버전 관리 시스템 Version Control System Version Database File checkout Version 1 Version 2 Version 3 Local Computer 로컬 VCS
  • 4. 중앙집중식 버전 관리 시스템 Central Version Control System Version 1 Version 2 Version 3 File Local Computer File Local Computer Version Database 중앙 VCS 서버 File Local Computer File Local Computer Version 1 Version 2 Version 3
  • 5. 분산 버전 관리 시스템 Distributed Version Control System Version 1 Version 2 Version 3 Version Database Server Computer Version 1 Version 2 Version 3 File Local Computer Version Database Version 1 Version 2 Version 3 File Local Computer Version Database Version 1 Version 2 Version 3 File Local Computer Version Database Version 1 Version 2 Version 3 File Local Computer Version Database Version 1 Version 2 Version 3
  • 7. Online Source Control Longer time to store because all of the data is stored in a centralized repository. Offline Source Control Extremely fast because complete copy of the data is stored locally in the client’s system. CVCS DVCS
  • 8. SVN data flow Git data flow Working Directory Remote Repository Merge Rsync (Remote Sync) Remote Repository Local Repository Index push commit add fetch checkout HEAD Working Directory pull CVCS DVCS
  • 9. The way SVN thinks about its data The way Git thinks about its data CVCS DVCS 각 파일에 대한 변화를 저장 시간 순으로 프로젝트의 스냅샷을 저장 Version1 Version2 Version3 Version4 Version5 코끼리 호랑이 곰 오렌지 코끼리 → 물개 오렌지 → 사과 물개 → 코끼리 곰 → 사람 사과 → 나무 Version1 Version2 Version3 Version4 Version5 코끼리 호랑이 곰 오렌지 물개 Version 1 의 호랑이 Version 1의 곰 사과 코끼리 호랑이 사람 Version 2 의 사과 Version4 의 코끼리 Version4 의 호랑이 Version 4의 사람 나무 호랑이 → 지렁이 Version 2의 물개 지렁이 Version 1의 곰 Version 2 의 사과 지렁이 → 호랑이
  • 11. Working directory 워킹 디렉터리 현재 작업 공간 프로젝트의 특정 버전에 체크아웃 Add 하기 전 Staging Area (=Index) 스테이징 영역 Commit 하려고 준비하는 공간 스냅샷을 만든다. Add 직 후 Commit 직 전 .git directory Local repository 스냅샷을 저장한다. git init or git clone으로 생성됨 Commit 이후 Modified Staged Committed Remote Repository .git directory 공유되는 저장 공간 Hosting service 존재 ex. VSTS, Github, Bitbucket Push 이후 로컬 환경 네트워크 환경 Untracked Tracked 1 2 3
  • 13. Working directory 워킹 디렉터리 Staging Area (=Index) 스테이징 영역 .git directory Local repository Remote Repository .git directory 로컬 환경 네트워크 환경 stash stash branch / checkout / cherry-pick reset revert rebase merge log diff show 3 단계 모두에서 사용 가능
  • 15. 변경 되돌리기 git reset (HEAD) <file> *git reset (HEAD) . Modified Working directory 워킹 디렉터리 Staged Staging Area 스테이징 영역 add Git add 했던 파일(들) 워킹 디렉터리로 되돌리기
  • 16. 변경 되돌리기 git checkout -- <file> *git checkout -- . Modified Working directory 워킹 디렉터리 Modified 파일 Unmodified 상태로 되돌리기 Unmodified Working directory 워킹 디렉터리 Modify
  • 17. 변경 되돌리기 git stash git stash pop 변경 사항 잠시 보류하기 Stash stack 0 1 **Modified이면서 Tracked 상태인 파일과 Staging area에 있는 파일만 push 한다. Modified Working directory 워킹 디렉터리 add Staged Staging Area 스테이징 영역
  • 19. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 마지막 커밋 수정하기 *git commit --amend git rebase –i master
  • 20. Commit --amend Working directory 워킹 디렉터리 Staging Area 스테이징 영역 .git directory Repository Modified Staged Committed commit --amend1 3 commit 2 수정 작업 8c58793 9f5a468 4 새로운 커밋 생성
  • 21. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 중간 커밋 수정하기 git rebase –i master -i 플래그가 없으면 이 영역의 커밋을 모두 한번에 Rebase -i 플래그가 있으면 커밋을 특정하여 잠시 멈추게 할 수 있다
  • 22. git rebase –i master 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
  • 23. git rebase –i master 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 각 스텝에서 뭔가 처리를 마치고 다음 커밋으로 스텝을 넘어가고 싶을 때 git rebase --continue git rebase --skip git rebase --abort 변경 처리를 마침 변경 하지 않고 그냥 넘어감 리베이스를 취소함 (모든 스텝을 취소함) 11’ git add . & git rebase --continue git rebase --skip git rebase --abort
  • 24. 중간 커밋 수정하기 git rebase –i master Interactive rebase (대화형 리베이스)의 사용 법은 여기 다 있음 Pick = 수정 안 함. Reword = 메시지만 바꿀 거임! Edit = 코드나 파일 수정 좀 함! Squash = 앞 커밋이랑 하나로 합칠 거. 메시지는 내가 고를 거임. Fixup = squash랑 똑같은데, 앞 커밋의 커밋 메시지 쓸 거임. 지금 꺼 메시지는 버릴 거임. Exec = 잠깐 shell 명령 실행할 거임. (ex. 이전 커밋에서 테스트 돌려보고 싶을 때) Drop = 버림. ---------------------------------------------------------------------------------- Rebase 실행 순서는 위 -> 아래임. 커밋 순서 재정렬 할 수 있음! 여기 있는 커밋 줄 지우면 그 커밋은 영영 바이바이임. 근데 다 지우면 이 리베이스는 걍 없던 일로 함. 빈 커밋(변경 사항 없는 커밋)은 주석 처리함.
  • 25. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 중간 커밋 수정하기 Rewored: 커밋 메시지만 수정한다 11’
  • 26. 1 2 3 4 5 6 7 8 9 12 13 14 15 16 1710 + 11 중간 커밋 수정하기 Squash & Fixup: 이전 커밋과 합친다 S: 메시지는 내가 고른다 (아니면 아예 새로 쓴다) vs F: 앞 커밋 메시지를 적용한다
  • 27. 중간 커밋 수정하기 Drop: 커밋을 버린다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
  • 28. 중간 커밋 수정하기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 11’ 삭제 수정 git reset HEAD^ --hard -> git rebase --continue git commit --amend -> git rebase --continue Edit: 합치는 것 빼고 다 한다 but,한번 꼬이기 시작하면 abort 말곤 답이 안 보인다.
  • 29. 중간 커밋 수정하기 1 2 3 4 5 6 7 8 9 10 11’ 12 13 14 15 16 1711 추가 (혹은 분리) git commit --amend -> git commit -> git rebase --continue (커밋 분리) git commit (X 필요한 만큼) -> git rebase --continue (추가 커밋) Edit: 합치는 것 빼고 다 한다 but,한번 꼬이기 시작하면 abort 말곤 답이 안 보인다.
  • 30. Re-order: 커밋 순서 재정렬 중간 커밋 수정하기 conflict는 그대의 몫
  • 31. 중간 커밋 수정하기 (응용) Edit이 무서울 때, 커밋을 본격 수정하기 전에 일단 한번 코드만 적용해보고 싶을 때 1. branch를 새로 판다 (git checkout -b rebase-practice) 2. 맘껏 edit 해 본다. 3. 맘에 들면 원래 브랜치 이름으로 바꾼다 (git branch –m hs/104-work-branch) 3’. 맘에 들지 않으면 연습 브랜치를 그냥 버린다. 1. 일단 코드를 수정하고, commit 한다. 2. git rebase –i maser 3. 맨 마지막에 추가한 커밋에 fixup 혹은 sqush 플래그를 설정한다. 4. 수정하고 싶었던 커밋의 바로 뒤로 순서를 조정한다. 5. 수정하고 싶었던 커밋과 합쳐지며 edit한 것과 같은 효과를 볼 수 있다.
  • 33. master 2 3 4 5 6 71 브랜치 A a3f9f75 2 3 41 브랜치 B master git cherry-pick a3f9f75e324a91a44c09471ae9e8010503e60b54 7 new hash 다른 브랜치에 있는 커밋을 하나만 선택해서 가져온다 커밋 가져오기 git cherry-pick <full hash>
  • 34. (응용) 지금 브랜치의 특정 커밋을 새로운 브랜치로 분리하고 싶을 때 master 2 3 4 5 6 71 브랜치 A a3f9f75de4739c A에서 체크아웃한 브랜치 master 74 new hash new hash git checkout –b new-branch-from-A git cherry-pick de4739c41e79246f7a0df5bc51c17245ede87188 git cherry-pick a3f9f75e324a91a44c09471ae9e8010503e60b54 master 2 3 5 61 브랜치 A git checkout branch-A && git rebase –i master -> drop de4739c & a3f9f75
  • 35. Q & A