Slide 1

Slide 1 text

Git branch ✓ https://github.com/outsideris/git-branch-demo 

Slide 2

Slide 2 text

보기 편하게 다음의 log 옵션을 사용합니다 $ git log --oneline --decorate --graph $ git config --global alias.sl 'log --oneline -- decorate --graph' 

Slide 3

Slide 3 text

항상 입력하기 귀찮으니까 $ git config --global alias.sl 'log --oneline --decorate --graph' $ git sl 

Slide 4

Slide 4 text

브랜치(branch) ✓ git에서는 브랜치를 적극적으로 사용한다 ✓ 모든 작업은 브랜치에서 한다 ✓ master 브랜치만으로 subversion처럼 사용할 수도 있지만 이럴 경우 git의 장점을 충분히 활용하지 못한다. ✓ master도 브랜치 중 하나일 뿐이다 

Slide 5

Slide 5 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } for문으로 코드 작성 

Slide 6

Slide 6 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } for문으로 코드 작성  while문으로 바꿔볼까?

Slide 7

Slide 7 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사

Slide 8

Slide 8 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사 var i = 0; while(i < length) { // do something i++; } while문으로 수정

Slide 9

Slide 9 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사 var i = 0; while(i < length) { // do something i++; } while문으로 수정 괜찮네

Slide 10

Slide 10 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사 var i = 0; while(i < length) { // do something i++; } while문으로 수정 괜찮네 바꿔치기

Slide 11

Slide 11 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사 var i = 0; while(i < length) { // do something i++; } while문으로 수정 괜찮네 바꿔치기 별로네

Slide 12

Slide 12 text

브랜치가 왜 필요한가? for (var i=0; i< length; i++) { // do something } var i = 0; while(i < length) { // do something i++; } for문으로 코드 작성 while문으로 바꿔볼까? 바꿔치기 for (var i=0; i< length; i++) { // do something } 일단 복사 while문으로 수정 괜찮네 별로네 버려 

Slide 13

Slide 13 text

브랜치가 왜 필요한가? 복사 수정 수정 삭제 병합 

Slide 14

Slide 14 text

브랜치가 왜 필요한가? branch commit commit branch -d merge 

Slide 15

Slide 15 text

브랜치 목록보기 $ git branch * master 

Slide 16

Slide 16 text

브랜치 생성 $ git branch deploy-1 $ git branch deploys-1 * master $ git branch deploy-2 $ git branch deploys-2 deploys-1 * master 

Slide 17

Slide 17 text

브랜치 삭제 $ git branch -d deploy-1 Deleted branch deploy-1 (was 7ecab80). $git branch deploy-2 * master 

Slide 18

Slide 18 text

브랜치 변경  $ git checkout deploy-2 $ git checkout SHA

Slide 19

Slide 19 text

본격 실습!!  git clone https://github.com/outsideris/git-branch-demo.git

Slide 20

Slide 20 text

 master 브랜치만 사용한다면… master

Slide 21

Slide 21 text

 master 브랜치만 사용한다면… master

Slide 22

Slide 22 text

 master 브랜치만 사용한다면… master

Slide 23

Slide 23 text

 master 브랜치만 사용한다면… master

Slide 24

Slide 24 text

 #1 - 브랜치에서 개발한 후 합치기 master

Slide 25

Slide 25 text

 ✓ master 브랜치에서 ex1 브랜치를 생성한다 $ git checkout -b ex1 $ git branch ex1 $ git checkout ex1 아니면 아래 명령어로 한번에… master ex1 #1 - 브랜치에서 개발한 후 합치기

Slide 26

Slide 26 text

 ✓ ex1 브랜치에서 커밋을 한다 $ echo '1' >> demo.txt $ git add demo.txt $ git commit master ex1 #1 - 브랜치에서 개발한 후 합치기

Slide 27

Slide 27 text

 ✓ ex1 브랜치에서 커밋을 한다 $ echo '2' >> demo.txt $ git add demo.txt $ git commit master ex1 #1 - 브랜치에서 개발한 후 합치기

Slide 28

Slide 28 text

 master ✓ 작업이 완료되면 master로 병합한다 $ git checkout master $ git merge ex1 ex1 #1 - 브랜치에서 개발한 후 합치기

Slide 29

Slide 29 text

 ✓ ex1 브랜치는 제거한다 $ git branch -d ex1 master #1 - 브랜치에서 개발한 후 합치기

Slide 30

Slide 30 text

 master #2 master 브랜치와 개발 브랜치 병행개발 후 합치기 ✓ master 브랜치에서 ex2 브랜치를 생성한다 $ git checkout -b ex2 ex2

Slide 31

Slide 31 text

 ✓ ex2 브랜치에서 커밋을 한다 $ echo '1' >> demo.txt $ git add demo.txt $ git commit master ex2 #2 master 브랜치와 개발 브랜치 병행개발 후 합치기

Slide 32

Slide 32 text

 ✓ master 브랜치로 돌아와 커밋을 한다 $ git checkout master $ touch new-file $ git add new-file $ git commits master ex2 #2 master 브랜치와 개발 브랜치 병행개발 후 합치기

Slide 33

Slide 33 text

 ✓ ex2 브랜치로 돌아와 커밋을 한다. $ git checkout ex2 $ echo '1' >> demo.txt $ git add demo.txt $ git commits master ex2 #2 master 브랜치와 개발 브랜치 병행개발 후 합치기

Slide 34

Slide 34 text

 ✓ 작업이 완료되면 master 브랜치로 병합한다. $ git checkout master $ git merge ex2 master ex2 #2 master 브랜치와 개발 브랜치 병행개발 후 합치기

Slide 35

Slide 35 text

 master #2 master 브랜치와 개발 브랜치 병행개발 후 합치기 ✓ ex2 브랜치는 제거한다 $ git branch -d ex2

Slide 36

Slide 36 text

 master ex1 fast-forward와 non-fast-forward master ex2

Slide 37

Slide 37 text

fast-forward ✓ 히스토리에서 브랜치의 플래그만 이동해서 merge 할 수 있으면 fast-forward ✓ non-fast-forward일 경우 자동으로 merge할 수 없 다면 충돌을 수동으로 해결해야 한다. ✓ fast-forward이면 충돌이 발생하지 않고 두 브랜치를 합칠 수 있다. ✓ push 할때는 fast-forward로 머지할 수 있어야만 push할 수 있다. 

Slide 38

Slide 38 text

fast-forward ✓ non-fast-forward로 머지할 경우에는 머지 커밋이 생긴다 

Slide 39

Slide 39 text

 #3 - non-fastfoward 로 합치기 master

Slide 40

Slide 40 text

 master ex3 #3 - non-fastfoward 로 합치기 ✓ master 브랜치에서 ex3 브랜치를 생성한다 $ git checkout -b ex3

Slide 41

Slide 41 text

 ✓ ex3 브랜치에서 커밋을 한다 $ echo '1' >> demo.txt $ git add demo.txt $ git commit master ex3 #3 - non-fastfoward 로 합치기

Slide 42

Slide 42 text

 ✓ ex3 브랜치에서 커밋을 한다 $ echo '2' >> demo.txt $ git add demo.txt $ git commit master ex3 #3 - non-fastfoward 로 합치기

Slide 43

Slide 43 text

 ✓ 작업이 완료되면 master로 non-fast-forward 병합한다 $ git checkout master $ git merge --no-ff ex3 #3 - non-fastfoward 로 합치기 master ex3

Slide 44

Slide 44 text

 ✓ ex3 브랜치는 제거한다 $ git branch -d ex3 master #3 - non-fastfoward 로 합치기

Slide 45

Slide 45 text

merge commit을 만들어야 할까? ✓ 브랜치이름을 의미있게 한 경우 작업 단위를 나누어서 볼 수 있다. ✓ 나중에 머지 커밋만 따로 모아서 볼 수도 있다. ✓ 정답은 없다. 

Slide 46

Slide 46 text

 #4 - 다중 브랜치 사용하기 master ex4 ex5

Slide 47

Slide 47 text

 #4 - 다중 브랜치 사용하기 ✓ master 브랜치에서 ex4 브랜치를 생성한다 $ git checkout -b ex4 master ex4

Slide 48

Slide 48 text

 #4 - 다중 브랜치 사용하기 ✓ ex4 브랜치에서 커밋을 한다 $ echo '1' >> demo.txt $ git add demo.txt $ git commit master ex4

Slide 49

Slide 49 text

 #4 - 다중 브랜치 사용하기 ✓ master 브랜치로 돌아와 커밋을 한다 $ git checkout master $ touch new-file $ git add new-file $ git commits master ex4

Slide 50

Slide 50 text

 #4 - 다중 브랜치 사용하기 master ex4 ✓ ex4 브랜치로 돌아와 커밋을 한다. $ git checkout ex4 $ echo '2' >> demo.txt $ git add demo.txt $ git commits

Slide 51

Slide 51 text

 #4 - 다중 브랜치 사용하기 master ex4 ✓ master 브랜치에서 ex5 브랜치를 새로 만든다 $ git checkout master $ git checkout -b ex5 $ git checkout -b ex5 master 아니면 아래 명령어로 한번에… ex5

Slide 52

Slide 52 text

 #4 - 다중 브랜치 사용하기 master ex4 ✓ master 브랜치에서 ex5 브랜치를 새로 만든다 $ git checkout master $ git checkout -b ex5 $ git checkout -b ex5 master 아니면 아래 명령어로 한번에… git checkout -b 새로운브랜치이름 [어디서] 생략하면 HEAD ex5

Slide 53

Slide 53 text

 #4 - 다중 브랜치 사용하기 master ex4 ex5 ✓ ex5 브랜치에서 커밋을 한다 $ touch example.txt $ git add example.txt $ git commit

Slide 54

Slide 54 text

 #4 - 다중 브랜치 사용하기 master ex4 ex5 ✓ ex4 브랜치로 돌아와 커밋을 한다. $ git checkout ex4 $ echo '3' >> demo.txt $ git add demo.txt $ git commits

Slide 55

Slide 55 text

 #4 - 다중 브랜치 사용하기 master ex4 ex5 ✓ 작업이 완료되면 master 브랜치로 병합한다. $ git checkout master $ git merge --no-ff ex4

Slide 56

Slide 56 text

 #4 - 다중 브랜치 사용하기 master ex4 ex5 ✓ ex5 브랜치로 돌아와 커밋을 한다. $ git checkout ex5 $ echo '1' >> example.txt $ git add example.txt $ git commits

Slide 57

Slide 57 text

 #4 - 다중 브랜치 사용하기 master ✓ 작업이 완료되면 master 브랜치로 병합한다. $ git checkout master $ git merge --no-ff ex5 ex4 ex5

Slide 58

Slide 58 text

원격 저장소  git clone https://github.com/outsideris/git-branch-demo.git

Slide 59

Slide 59 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 간단한 원격저장소의 사용 master

Slide 60

Slide 60 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ clone 간단한 원격저장소의 사용 master master

Slide 61

Slide 61 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ clone 간단한 원격저장소의 사용 master master

Slide 62

Slide 62 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ clone push 간단한 원격저장소의 사용 master master

Slide 63

Slide 63 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 다른 사람과 함께 사용하는 원격저장소 master master

Slide 64

Slide 64 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ clone 다른 사람과 함께 사용하는 원격저장소 master master

Slide 65

Slide 65 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ clone 다른 사람과 함께 사용하는 원격저장소 master master

Slide 66

Slide 66 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ clone 다른 사람과 함께 사용하는 원격저장소 master master push

Slide 67

Slide 67 text

원격 브랜치 목록보기 $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master 

Slide 68

Slide 68 text

원격 브랜치 목록보기 $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master  원격저장소 원격저장소 이름 원격저장소의 브랜치 이름

Slide 69

Slide 69 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 실제로는 이렇게 동작합니다 master

Slide 70

Slide 70 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ clone 실제로는 이렇게 동작합니다 master master remotes/origin/master

Slide 71

Slide 71 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 실제로는 이렇게 동작합니다 master master remotes/origin/master

Slide 72

Slide 72 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 실제로는 이렇게 동작합니다 master master remotes/origin/master

Slide 73

Slide 73 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 실제로는 이렇게 동작합니다 master fetch master remotes/origin/master

Slide 74

Slide 74 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 실제로는 이렇게 동작합니다 merge master remotes/origin/master master

Slide 75

Slide 75 text

pull == fetch & merge 

Slide 76

Slide 76 text

 ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 실제로는 이렇게 동작합니다 master master remotes/origin/master push

Slide 77

Slide 77 text

 #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ Github의 원격 저장소를 포크합니다. $ git clone master remotes/origin/master

Slide 78

Slide 78 text

 #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ master 브랜치에 커밋을 합니다. $ echo '1' >> demo.txt $ git add demo.txt $ git commit remotes/origin/master master $ echo '2' >> demo.txt $ git add demo.txt $ git commit

Slide 79

Slide 79 text

원경 저장소에 다른 사람이 push를 한 경우 

Slide 80

Slide 80 text

 #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ 원격 저장소의 변경 내용을 가져옵니다. $ git fetch origin master remotes/origin/master

Slide 81

Slide 81 text

 #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ 원격브랜치와 master 브랜치를 합칩니다. $ git merge origin/master master remotes/origin/master

Slide 82

Slide 82 text

 #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ 로컬브랜치를 원격저장소에 적용합니다. $ git push origin master master remotes/origin/master

Slide 83

Slide 83 text

git push origin master

Slide 84

Slide 84 text

git push origin master  git push origin master:master

Slide 85

Slide 85 text

git push origin master  git push 원격저장소 로컬브랜치:원격브랜치 같은 경우 로컬브랜치만 적어도 된다. git push origin master:master

Slide 86

Slide 86 text

 #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우 ✓ ex6 브랜치를 만듭니다. $ git checkout -b ex6 ex6 master

Slide 87

Slide 87 text

 #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우 ✓ ex6 브랜치에 커밋을 합니다. $ echo '1' >> demo.txt $ git add demo.txt $ git commit $ echo '2' >> demo.txt $ git add demo.txt $ git commit $ echo '3' >> demo.txt $ git add demo.txt $ git commit master ex6

Slide 88

Slide 88 text

 #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우 ✓ master 브랜치에 다른 사람이 올린 커밋을 merge 했다고 가정합니다. $ git checkout master $ touch new-file $ git add new-file $ git commit $ echo '1' >> new-file $ git add new-file $ git commit master ex6

Slide 89

Slide 89 text

 #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우 ✓ ex6 브랜치 작업에서 master 브랜치에 새로 적용 된 수정사항이 필요하므로 ex6로 가져와야 합니다. $ git rebase master $ git checkout ex6 master ex6

Slide 90

Slide 90 text

rebase는 어떻게 동작하는가? ✓ 말그대로 base를 다시 잡아주는 명령어 ✓ 지정한 대상을 기준으로 브랜치의 기준점을 바꾼다. ✓ 현재 브랜치의 모든 커밋을 순서대로 다시 커밋한다. 

Slide 91

Slide 91 text

 #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우 ✓ 작업이 완료되면 master 브랜치와 합칩니다. master ex6 $ git checkout master $ git merge --no-ff ex6

Slide 92

Slide 92 text

 #7 - merge 중 충돌이 발생했을 때 ✓ ex7 브랜치를 만들어서 파일 수정 $ git checkout -b ex7 $ echo '1' >> demo.txt $ git add demo.txt $ git commit $ git checkout master $ echo '2' >> demo.txt $ git add demo.txt $ git commit ✓ master 브랜치에서 같은 파일 수정 ✓ 충돌 Auto-merging demo.txt CONFLICT (content): Merge conflict in demo.txt Automatic merge failed; fix conflicts and then commit the result.

Slide 93

Slide 93 text

 #8 - rebase 중 충돌이 발생했을 때 ✓ ex7 브랜치를 만들어서 파일 수정 $ git checkout -b ex7 $ echo '1' >> demo.txt $ git add demo.txt $ git commit $ git checkout master $ echo '2' >> demo.txt $ git add demo.txt $ git commit ✓ master 브랜치에서 같은 파일 수정 ✓ 충돌

Slide 94

Slide 94 text

 #8 - rebase 중 충돌이 발생했을 때 ✓ 충돌 First, rewinding head to replay your work on top of it... Applying: 커밋메시지 Using index info to reconstruct a base tree... M demo.txt Falling back to patching base and 3-way merge... Auto-merging demo.txt CONFLICT (content): Merge conflict in demo.txt Failed to merge in the changes. Patch failed at 0001 씨 수정 The copy of the patch that failed is found in: /Users/outsider/projects/yak/git-playground/test1/.git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".

Slide 95

Slide 95 text

Github 흐름 이해하기 

Slide 96

Slide 96 text

 #9 - Github에서 전체 흐름에 따라 적용하기 ✓ Github 저장소를 자신의 계정으로 fork 합니다.
 https://github.com/outsideris/git-branch-demo
 HINT: Github 사이트에서 합니다. ✓ 자신의 Github 저장소를 로컬로 clone 받습니다.
 HINT: git clone ✓ clone 받은 저장소에 임의의 커밋을 합니다. ✓ 원 저장소의 새로운 커밋을 로컬로 fetch 받습니다.
 HINT: 원저장소를 원격으로 추가해야 합니다 - git remote add
 HINT: git fetch ✓ 로컬저장소의 master와 머지합니다.
 HINT: git merge ✓ 자신의 원격 저장소로 push를 합니다.
 HINT: git push