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

git branch

Outsider
November 01, 2014
260

git branch

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