Upgrade to Pro — share decks privately, control downloads, hide ads and more …

git branch

Avatar for Outsider Outsider
November 01, 2014
270

git branch

Avatar for Outsider

Outsider

November 01, 2014
Tweet

More Decks by Outsider

Transcript

  1. 보기 편하게 다음의 log 옵션을 사용합니다 $ git log --oneline

    --decorate --graph $ git config --global alias.sl 'log --oneline -- decorate --graph' 
  2. 브랜치(branch) ✓ git에서는 브랜치를 적극적으로 사용한다 ✓ 모든 작업은 브랜치에서

    한다 ✓ master 브랜치만으로 subversion처럼 사용할 수도 있지만 이럴 경우 git의 장점을 충분히 활용하지 못한다. ✓ master도 브랜치 중 하나일 뿐이다 
  3. 브랜치가 왜 필요한가? for (var i=0; i< length; i++) {

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

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

    // do something } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사
  6. 브랜치가 왜 필요한가? 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문으로 수정
  7. 브랜치가 왜 필요한가? 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문으로 수정 괜찮네 바꿔치기
  8. 브랜치가 왜 필요한가? 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문으로 수정 괜찮네 바꿔치기 별로네
  9. 브랜치가 왜 필요한가? 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문으로 수정 괜찮네 별로네 버려 
  10. 브랜치 생성 $ git branch deploy-1 $ git branch deploys-1

    * master $ git branch deploy-2 $ git branch deploys-2 deploys-1 * master 
  11. 브랜치 삭제 $ git branch -d deploy-1 Deleted branch deploy-1

    (was 7ecab80). $git branch deploy-2 * master 
  12.  ✓ master 브랜치에서 ex1 브랜치를 생성한다 $ git checkout

    -b ex1 $ git branch ex1 $ git checkout ex1 아니면 아래 명령어로 한번에… master ex1 #1 - 브랜치에서 개발한 후 합치기
  13.  ✓ ex1 브랜치에서 커밋을 한다 $ echo '1' >>

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

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

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

    master #1 - 브랜치에서 개발한 후 합치기
  17.  master #2 master 브랜치와 개발 브랜치 병행개발 후 합치기

    ✓ master 브랜치에서 ex2 브랜치를 생성한다 $ git checkout -b ex2 ex2
  18.  ✓ ex2 브랜치에서 커밋을 한다 $ echo '1' >>

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

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

    ex2 $ echo '1' >> demo.txt $ git add demo.txt $ git commits master ex2 #2 master 브랜치와 개발 브랜치 병행개발 후 합치기
  21.  ✓ 작업이 완료되면 master 브랜치로 병합한다. $ git checkout

    master $ git merge ex2 master ex2 #2 master 브랜치와 개발 브랜치 병행개발 후 합치기
  22.  master #2 master 브랜치와 개발 브랜치 병행개발 후 합치기

    ✓ ex2 브랜치는 제거한다 $ git branch -d ex2
  23. fast-forward ✓ 히스토리에서 브랜치의 플래그만 이동해서 merge 할 수 있으

    면 fast-forward ✓ non-fast-forward일 경우 자동으로 merge할 수 없다면 충 돌을 수동으로 해결해야 한다. ✓ fast-forward이면 충돌이 발생하지 않고 두 브랜치를 합칠 수 있다. ✓ push 할때는 fast-forward로 머지할 수 있어야만 push할 수 있다. 
  24.  master ex3 #3 - non-fastfoward 로 합치기 ✓ master

    브랜치에서 ex3 브랜치를 생성한다 $ git checkout -b ex3
  25.  ✓ ex3 브랜치에서 커밋을 한다 $ echo '1' >>

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

    demo.txt $ git add demo.txt $ git commit master ex3 #3 - non-fastfoward 로 합치기
  27.  ✓ 작업이 완료되면 master로 non-fast-forward 병합한다 $ git checkout

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

    master #3 - non-fastfoward 로 합치기
  29. merge commit을 만들어야 할까? ✓ 브랜치이름을 의미있게 한 경우 작업

    단위를 나누어서 볼 수 있다. ✓ 나중에 머지 커밋만 따로 모아서 볼 수도 있다. ✓ 정답은 없다. 
  30.  #4 - 다중 브랜치 사용하기 ✓ master 브랜치에서 ex4

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

    한다 $ echo '1' >> demo.txt $ git add demo.txt $ git commit master ex4
  32.  #4 - 다중 브랜치 사용하기 ✓ master 브랜치로 돌아와

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

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

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

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

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

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

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

    ex5 브랜치로 돌아와 커밋을 한다. $ git checkout ex5 $ echo '1' >> example.txt $ git add example.txt $ git commits
  40.  #4 - 다중 브랜치 사용하기 master ✓ 작업이 완료되면

    master 브랜치로 병합한다. $ git checkout master $ git merge --no-ff ex5 ex4 ex5
  41. 원격 브랜치 목록보기 $ git branch -a * master remotes/origin/HEAD

    -> origin/master remotes/origin/master  원격저장소 원격저장소 이름 원격저장소의 브랜치 이름
  42.  #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ Github의

    원격 저장소를 포크합니다. $ git clone master remotes/origin/master
  43.  #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
  44.  #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ 원격

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

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

    원격저장소에 적용합니다. $ git push origin master master remotes/origin/master
  47. git push origin master  git push 원격저장소 로컬브랜치:원격브랜치 같은

    경우 로컬브랜치만 적어도 된다. git push origin master:master
  48.  #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우

    ✓ ex6 브랜치를 만듭니다. $ git checkout -b ex6 ex6 master
  49.  #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
  50.  #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
  51.  #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우

    ✓ ex6 브랜치 작업에서 master 브랜치에 새로 적용 된 수정사항이 필요하므로 ex6로 가져와야 합니다. $ git rebase master $ git checkout ex6 master ex6
  52. rebase는 어떻게 동작하는가? ✓ 말그대로 base를 다시 잡아주는 명령어 ✓

    지정한 대상을 기준으로 브랜치의 기준점을 바꾼다. ✓ 현재 브랜치의 모든 커밋을 순서대로 다시 커밋한다. 
  53.  #6 - 브랜치에서 작업중 master에 다른 변경사항이 생긴 경우

    ✓ 작업이 완료되면 master 브랜치와 합칩니다. master ex6 $ git checkout master $ git merge --no-ff ex6
  54.  #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.
  55.  #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 브랜치에서 같은 파일 수정
  56.  #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".
  57.  #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