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

git branch

Outsider
November 01, 2014
57

git branch

Outsider

November 01, 2014
Tweet

Transcript

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

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

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

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

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

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

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

    // do something } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사
  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 } for문으로 코드 작성  while문으로 바꿔볼까? for (var i=0; i< length; i++) { // do something } 일단 복사 var i = 0; while(i < length) { // do something i++; } while문으로 수정 괜찮네
  10. 브랜치가 왜 필요한가? 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문으로 수정 괜찮네 바꿔치기
  11. 브랜치가 왜 필요한가? 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문으로 수정 괜찮네 바꿔치기 별로네
  12. 브랜치가 왜 필요한가? 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문으로 수정 괜찮네 별로네 버려 
  13. 브랜치가 왜 필요한가? 복사 수정 수정 삭제 병합 

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

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

  16. 브랜치 생성 $ git branch deploy-1 $ git branch deploys-1

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

    (was 7ecab80). $git branch deploy-2 * master 
  18. 브랜치 변경  $ git checkout deploy-2 $ git checkout

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

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

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

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

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

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

  25.  ✓ master 브랜치에서 ex1 브랜치를 생성한다 $ git checkout

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

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

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

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

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

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

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

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

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

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

    ✓ ex2 브랜치는 제거한다 $ git branch -d ex2
  36.  master ex1 fast-forward와 non-fast-forward master ex2

  37. fast-forward ✓ 히스토리에서 브랜치의 플래그만 이동해서 merge 할 수 있으면

    fast-forward ✓ non-fast-forward일 경우 자동으로 merge할 수 없 다면 충돌을 수동으로 해결해야 한다. ✓ fast-forward이면 충돌이 발생하지 않고 두 브랜치를 합칠 수 있다. ✓ push 할때는 fast-forward로 머지할 수 있어야만 push할 수 있다. 
  38. fast-forward ✓ non-fast-forward로 머지할 경우에는 머지 커밋이 생긴다 

  39.  #3 - non-fastfoward 로 합치기 master

  40.  master ex3 #3 - non-fastfoward 로 합치기 ✓ master

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

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

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

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

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

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

  47.  #4 - 다중 브랜치 사용하기 ✓ master 브랜치에서 ex4

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

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

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

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

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

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

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

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

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

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

    master 브랜치로 병합한다. $ git checkout master $ git merge --no-ff ex5 ex4 ex5
  58. 원격 저장소  git clone https://github.com/outsideris/git-branch-demo.git

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

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

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

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

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

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

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

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

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

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

    -> origin/master remotes/origin/master  원격저장소 원격저장소 이름 원격저장소의 브랜치 이름
  69.  ਗѺ੷੢ࣗ ۽ஸ੷੢ࣗ 실제로는 이렇게 동작합니다 master

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

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

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

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

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

  75. pull == fetch & merge 

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

  77.  #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ Github의

    원격 저장소를 포크합니다. $ git clone master remotes/origin/master
  78.  #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
  79. 원경 저장소에 다른 사람이 push를 한 경우 

  80.  #5 - 원격브랜치로 다른 사람과 함께 개발하기 ✓ 원격

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

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

    원격저장소에 적용합니다. $ git push origin master master remotes/origin/master
  83. git push origin master

  84. git push origin master  git push origin master:master

  85. git push origin master  git push 원격저장소 로컬브랜치:원격브랜치 같은

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

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

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

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

    ✓ 작업이 완료되면 master 브랜치와 합칩니다. master ex6 $ git checkout master $ git merge --no-ff ex6
  92.  #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.
  93.  #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 브랜치에서 같은 파일 수정 ✓ 충돌
  94.  #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".
  95. Github 흐름 이해하기 

  96.  #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