SlideShare une entreprise Scribd logo
1  sur  56
아꿈사
http://cafe.naver.com/architect1
                         박진호
  http://blog.naver.com/jinojjan
 VCS
 Git 디자인 목표
 Git 과 Svn같은 VCS 와의 차이점
 Git Workflow
 Git의 세가지 상태
 Git 구조
 Merge, Rebase, Cherry Pick
 대표적으로 RCS.
  (Patch Set 즉 파일에서 변경되는 부분 관리)
 관리 중인 파일의 변경 정보를 로컬에 저장
   CVS, Subversion, Perforce 같은 것들
 모든 파일을 관리하는 서버가 별도로 있고 많은 클라이언트가 중앙 서버에서
    파일을 받아서 사용
 장점 : 프로젝트 관리자가 누가 무엇을 하는지 체크 및 관리 가능
 단점 :
 - 중앙 서버에 문제 발생 시 다른사람과의 협업 중단 및 하는 일을 백업 할 방법
없음.
-. 중앙 데이터 베이스가 있는 하드디스크에 문제가 생기면 프로젝트의 모든 히스
토리를 잃음.
   Git, Mecurial, Bazar, Darcs 등
   SVN 이나 CVS 처럼 마지막 Snapshot을 체크 아웃 하지 않음. 저장소 전부 복제
   서버에 문제가 생기면 이 복제물로 다시 작업 시작 가능
   장점 : 비선형 개발 및 다양한 방법으로 협업 가능
   단점 : 어렵다
 VCS
 Git 디자인 목표
 Git 과 Svn같은 VCS 와의 차이점
 Git Workflow
 Git의 세가지 상태
 Git 구조
 Merge, Rebase, Cherry Pick
   빠른 속도
   단순한 구조
   비선형적인 개발(수천 개의 동시 다발적인
    브랜치)
   완벽한 분산
   리눅스 커널 같은 대형 프로젝트에도 유용
    할 것(속도나 데이터 크기 면에서)
 VCS
 Git 디자인 목표
 Git 과 Svn같은 VCS 와의 차이점
 Git Workflow
 Git의 세가지 상태
 Git 구조
 Merge, Rebase, Cherry Pick
   차이점 저장이 아닌 Snapshot 저장
                   각 파일에 대한 변화만 저장하는
                   시스템(SVN 등)




                   Git 방식. 시간순으로 순차적으로
                   저장. SnapShot 방식 저장.
                   파일이 달라지지 않았으면 Git은 성
                   능을 위해서 파일을 저장하지 않음.
                   단지 이전 상태의 파일에 대한 링크
                   만 저장.
                   작은 파일 시스템
   거의 모든 명령을 로컬에서 실행
                  SVN이나 CVS는 오프라인인 경우
                  파일 편집 가능하지만 Commit 불가
                  능


                  프로젝트의 모든 히스토리가 로컬
                  디스크에 있기 때문에 모든 명령 순
                  식간에 실행

                  -. 히스토리 조회 시 혹은 Diff 서버
                  필요 없음
                  -. 오프라인 상태에서도 조회 가능
                  -. 자신만의 브랜치 가능
   Git은 작다



   분산




    -. 최신 소스코드를 체크아웃하지 않고 레파지토리 전체를 복사하는 것(Clone)
    -. 메인서버에 문제가 생겼을때 누구나 메인서버에 푸시 가능
    -. 성능도 빠르다. 보통 SVN은 체크아웃에서만 다른 DSCM들보다 조금 빠르다.
   빠르다. 같은 DVCS 와의 비교
                    -. Git은 파일을 새로 추가하는 경우
                    를 제외하면 Git은 항상 빠르다.
                    -. 정말정말 큰 데이터를 커밋하는
                    경우는 Hg가 제일 빠르다. 그러나
                    대부분의 경우 Git이 빠르다.
   값싼 Branch




대부분이 권장하는 궁극의 브랜치는 새 디렉토리로 레파지토리를 통째로 복사하는 것.

Git에서는 여러 개의 로컬 브랜치를 가질수 있으며 그 로컬 브랜치들은 서로 완벽하게
독립적이기 때문에 개발 중 수행하는 생성, 머지, 삭제 명령도 독립적으로 수행.
 VCS
 Git 디자인 목표
 Git 과 Svn같은 VCS 와의 차이점
 Git Workflow
 Git의 세가지 상태
 Git 구조
 Merge, Rebase, Cherry Pick
 Subversion같은 중앙집중식 시스템를 사용하다가 넘어온 사람들이 사용
 내가 마지막으로 fecth한 후에 아무도 푸시하지 못하도록 할 수 있음.
  (그래서 중앙 집중식 가능.)




    1. 한개발자가 한일을 커밋하고 아무 문제 없이 서버에 Push
    2. 다른 개발자는 한 일을 커밋하고 Push 하기 전에 첫번째 개발자가 한 일을 먼
    저 Fetch 하고 Merge 후 Push
 개발자 자신은 읽고 쓸 수 있고 다른 개발자는 읽을 수만 있는 공개 저장소 사
  용 하는 방식
 보통 프로젝트를 대표하는 하나의 공식 저장소 있음.




    1. 프로젝트 Integration Manager는 프로젝트 메인 저장소에 Push
    2. 프로젝트 기여자는 메인 저장소를 Clone하고 수정
    3. 기여자는 자신의 저장소에 Push 하고 Integration-Manager가 접근 할 수 있도록 공개
    4. 기여자는 integration-Manager에게 변경사항을 적용해 줄 것을 E-mail 같은 것으로 요청
    5. Integration-Manager는 기여자의 저장소를 리모트 저장소로 등록하고 수정사항을 Merge하여 테스
    트
    6. Integration-Manager는 Merge한 사항을 메인 저장소에 Push
 여러 저장소를 운영하는 방식을 변형한 구조
 보통 수백명의 개발자가 기여하는 아주 큰 프로젝트를 운영할 때 이 방식 사용
 리눅스 커널 프로젝트가 대표적




    1. 개발자는 코드를 수정하고 master 브랜치를 기준으로 자신의 토픽 브랜치를 Rebase. Master 브랜치
    란 Dictator의 브랜치
    2. Lieutenant들은 개발자들의 수정사항을 자신이 관리하는 master 브랜치에 Merge
    3. Dictator는 Lieutenant의 master 브랜치를 자신의 master 브랜치로 Merge
    4. Dictator는 Merge한 자신의 master 브랜치를 Push 하여 다른 모든 개발자가 Rebase 할 수 있는 기준
    으로 만듦.
 VCS
 Git 디자인 목표
 Git 과 Svn같은 VCS 와의 차이점
 Git Workflow
 Git의 세가지 상태
 Git 구조
 Merge, Rebase, Cherry Pick
Git Directory : Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳
Working Directory : 프로젝트의 특정 버전을 Checkout 한 것
Staging Area : Git Directory에 있다. 단순한 파일이고 곧 Commit 할 파일에 대한 정보
를 저장
Untracked : 관리 대상이 아님
Tracked : 관리 대상임. 이미 Snapshot에 포함돼 있던 파일. 아래의 3가지 상태중 하나
 -. Unmodified : 수정하지 않음
 -. Modified : 수정함
 -. Staged : 커밋을 하면 현재 수정사항을 저장소에 기록함
 VCS
 Git 디자인 목표
 Git 과 Svn같은 VCS 와의 차이점
 Git Workflow
 Git의 세가지 상태
 Git 구조
 Merge, Rebase, Cherry Pick
 Content-addressable 파일 시스템 그 위에 VCS 사용자 인터페이스가 있는 구조
 단순한 Key-Value 데이터 저장소
 어떤 형식의 데이터라도 집어넣을 수 있고 해당 Key로 언제든지 데이터를 다
  시 가져올 수 있음.
   초기화 시 폴더 구조
   Plumbing 명령과 Porcelain 명령
   Git 개체
     Blob 개체
     Tree 개체
     Commit 개체
   Git 레퍼런스
     HEAD
     Tag
     Remote 레퍼런스
   PackFile
   데이터 전송 프로토콜
     Dump 프로토콜
     Smart 프로토콜
Git 초기화                                          Git 초기화시 폴더 구조




   hook 디렉토리   : 클라이언트 훅이나 서버 훅을 넣음.

   info 디렉토리 : .gitignore 파일처럼무시할 파일의 패턴을 적어 두는 곳이다. 하지만 .gitignore 파일과는 달리 Git으
    로 관리되지 않음.

   objects 디렉토리 : 모든 컨텐트를 저장하는 데이터베이스

   refs 디렉토리   : Commit 개체의 포인터를 저장

   config 파일   : 해당 프로젝트에만 적용되는 설정 옵션이 들어 있음

   description 파일 : 기본적으로 GitWeb 프로그램에서만 사용

   HEAD 파일     : 현재 Checkout한 브랜치를 가리킴

   index 파일    : Staging Area의 정보를 저장. Staging 영역이 생겨야 만들어짐. Init 시에는 안만들어짐.
   Plumbing
     명령어 여러 개를 Unix 스타일로 함께 엮어서 실
     행하거나 스크립트에서 호출될 수 있도록 디자
     인됨. 이러한 저수준 명령어를 가리킴
   Porcelain
     좀 더 사용자 친화적인 명령어. (commit, add 등)
hash-object에 데이터를 주면 .git 디렉토리에
저장하고 그 key를 알려줌. –w 옵션 줘야 저장




                   -. 헤더 정보와 데이터 정보를 합쳐서 SHA-1 해시 정보 생성
                   -. 해시 처음 2글자를 따서 디렉토리 이름. 나머지 38 글자는
                   파일이름. 새로 만든 파일에 데이터 저장
해쉬의 내용 확인
(cat-file 명령으로 저장한 데이터를 불러올 수 있음.
-p 는 파일 내용 출력)

-. 파일의 이름은 저장하지 않았음.
-. 단지 파일 내용만 저장했을 뿐.
-. 이런 종류의 개체를 Blob 개체라고 함.
test.txt 파일을 수정 ( version 2 라는 내용으로 변경)




hash-object –w를 사용하여 저장소에 저장




Objeccts 폴더에 55로 시작하는 것이 추가됨
첫번째 버전으로 되돌리는 경우




두번째 버전으로 되돌리는 경우
 Git 모든 것을 Tree와 Blob 개체로 저장
 Tree 개체로 파일 이름을 저장할 수 있고 파일 여러개를 한 번에 저장




    -. Tree는 유닉스의 디렉토리에 대응
    -. Blob은 Inode나 일반 파일에 대응
    -. Tree 개체 하나는 항목을 여러 개 가질 수 있음
          파일 모드
          개체 타입
          Blob 개체나 하위 Tree 개체를 가리키는 SHA-1 포인터
          파일 이름
 Git은 일반적으로 Staging Area(Index)의 상태대로 Tree 개체를 만들고 기록
 Tree 개체를 만들려면 Staging Area에 파일을 추가해서 Index를 만들어야 함

    Ex )




                                 Plumbing 명령으로 만들어진 Tree
                                 구조 예제
   Snapshot을 누가, 언제, 왜 저장했는지에 대
    한 정보
   Tree 개체에 대한 SHA-1 값


    ※ 깨진 글자는 “테스트 커밋 1” 임


    Snapshot에서 최상단 Tree를하나 가리킴
    user.name과 user.email 설정에서 가져온 Author/Committer 정보, 시간
    정보, 그리고 한 줄 띄운 다음 커밋 메시지
Git 데이터 구조 예제


                       Git 저장소 내의 모든 개체 예제

 ※ 해쉬 값은 틀리므로 참고하지 말고 전체 적인 구조를 눈에 담으면 됨.
   Log 볼 경우 sha-1 값을 기억해야 함.
   Sha-1 값을 쉬운 이름으로 저장된 파일을 레퍼런스 혹은 refs 라 함




   오직 sha-1 값만 저장되어 있음
   Commit , tree, blob 와 refs 가 연계된 예제.
 HEAD 파일은 현 브랜치를 가리키는 간접(symbolic) 레퍼런스
 그래서 branch 시 마지막 커밋의 sha-1값 알수 있음
 git commit을 실행하면 Commit 개체가 만들어지는데, 지금 HEAD가 가리키고
  있던 커밋의 SHA-1 값이 그 Commit 개체의 부모로 사용
 Commit 개체랑 비슷
 누가, 언제 Tag를 달았는지 Tag 메시지는 무엇이고 어떤
  커밋을가리키는지에 대한 정보가 포함
 Tag 개체는 Tree 개체가 아니라 Commit 개체를 가리킨다
  는 것이 그 둘의 차이
 브랜치처럼 Commit 개체를 가리키지만 옮길 수는 없음

   Annotated Tag
     만들기 쉬움.
     브랜치랑 비슷하지만 브랜치처럼 옮길 수는 없음.

   Lightweight Tag
     Tag 개체를 만들고 거기에 커밋을 가리키는 레퍼런스를 저장
     커밋을 직접 가리키지 않고 Tag 개체를 가리킴
   Remote를 추가하고 Push하면 Git은 각 브랜치마다Push한
    마지막 커밋이 무엇인지 refs/remotes 디렉토리에 저장

   Remote 레퍼런스와 refs/heads에 있는 레퍼런스인 브랜치
    와 차이점은 Checkout할 수 없다는것

   Remote 레퍼런스는 서버의 브랜치가 가리키는 커밋이 무
    엇인지 적어둔 일종의 북마크
 Git이 처음 개체를 저장하는 형식 : Loose 개체 포맷.
 이 개체들을 파일 하나로 압축(Pack) : Pack File
 Pack File 생성 시점
       Loose 개체가 너무 많을 때
       git gc 명령을 실행했을 때
       리모트 서버로 Push할 때
 Pack File : 파일 시스템에서 삭제된 개체가 전부 pack 파일에 저장됨
 Index File : 빠르게 찾을 수 있도록 Pack File의 오프셋이 들어 있음.
   Pack 파일 확인 : git verify-pack –v 인덱스 파일
 Git은 각 시점의 스냅샷을 저장하기도 하지만 그 스냅샷 사이의 델타를 저장하
  기도 함.
 커밋을 하면 그 시점의 스냅샷이 저장되는 것이고 그 커밋과 부모의 커밋을 비
  교(diff)하면 델타를 얻을 수 있음.




               Git gc 실행




                       마지막 버전의 파일 하나만 통째로 저장하고 이전 버전들은 델타
                       (diff 파일)를 저장

                       rev6를 요구하면 rev6의 파일을 그대로 반환. 하지만, rev4를 요구
                       하면 rev6 파일에 rev5, rev4의 델타를 적용해서 반환
 Mercurial은 처음에 스냅샷을 저장하고 그다음 버전부터는 델타를 저장.
 최신 버전의 파일이 요구하면 첫 스냅샷 파일과 최근까지의 델타를 적용해서
  반환
   프로토콜 2가지 종류
       Dump 프로토콜이라 부를 수 있는 Http
       Smart 프로토콜이라고 부를 수 있는 file://, ssh://, and git:// 프로토콜

   Dump 프로토콜(Http)
       데이터를 전송할 때 서버에서는 Git만을 위해 특화된 코드를 전혀 사용하지 않음.
       Fetch 하는 과정은 여러 개의GET 요청을 순서대로 보내고 데이터 받음
       순서
        ▪ info/refs 파일 다운(리모트 레퍼런스와 SHA 값이 든 목록을 가져옴)
        ▪ HEAD 레퍼런스를 다운(데이터를 내려받고 나서 어떤 레퍼런스를 Checkout할 지 알게됨)
        ▪ 데이터 전송을 마치고 나면 master 브랜치를 Checkout할 준비가 끝
        ▪ info/refs 의 Sha-1의 값을 가지고 Fetch
        ▪ 서버로부터 얻어온 개체를 zlib로 압축을 풀고 header를 떼어냄
        ▪ Commit 개체 및 Tree 개체를 다운 받음
        ▪ 예외) Commit 개체나 Tree 개체가 서버에 없을 경우 다른 서버나 Pack file에 존재
           다른 서버에 있는 지 체크
           Packfile의 인덱스 파일에 있는지 체크
   Smart 프로토콜
       HTTP 프로토콜은 매우 단순하다는 장점이 있으나 전송은 효율적이지 못함.
       Smart 프로토콜로 데이터를 전송하는 것이 더 일반적
       서버는 클라이언트가 어떤 데이터를 갖고 있고 어떤 데이터가 필요한지 분석하여 실제로 전송할
        데이터를 추려냄
       데이터 업로드
        ▪   Send pack 과 Receive Pack 과정(서버가 가진 정보를 앎)




        ▪   어떤 커밋 데이터가 서버에 없는가를 분석
        ▪   send-pack은 Push할 레퍼런스에 대한 정보를 서버의 receive-pack에 전달
   Smart 프로토콜




       master 브랜치를 업데이트하고 experiment 브랜치를 추가하려 한다면 send-pack은서버에 다음
        과 같은 정보를 서버에 보냄
       SHA-1 값이 모두 0이면 전에 없었던 것(새로 추가하는 experiment 레퍼런스가 이에 해당)
       레퍼런스를 삭제하려면 반대편 즉 업데이트를 할 오른편 위치의 해시 값을 모두 0으로 채움
       Git은 업데이트할 레퍼런스의 예전 SHA, 새로운 SHA, 레퍼런스 이름을 각 줄에 담아 전송
       각 줄에는 클라이언트의 Capability도 포함
       클라이언트는 서버가 갖고 있지 않은 모든 데이터를 하나의 Packfile에 담아서 전송
       서버는 성공적으로 데이터를 처리했다고 응답하거나 아니면 실패했다고 응답
 VCS
 Git 디자인 목표
 Git 과 Svn같은 VCS 와의 차이점
 Git의 세가지 상태
 Git 구조
 Merge, Rebase, Cherry Pick
 Git Workflow
 Branch를 만든다.
 Merge Base를 자동으로 기록
 나중에 Merge를 하면 두 스냅샷을 기준으로 diff 프로그램을 이용해서 델타를
  만들어서 한쪽 브랜치에 patch 프로그램으로 적용
 3-Way Merge 사용. (Svn은 2-Way Merge 방식. Merge Base를 기록해주지 않아
  수동 머지 해야함.)
 Merge와 비슷
 델타를 만들어서 적용하는 것은 같지만 히스토리를 구성하는게 다름.
 커밋 순서를 순차적으로 배열
 Git과 Svn 연결해서 사용시 서버로 Push 전 이 방식으로만 씀.
 Cherry-pick은 특정 커밋과 그 커밋의 부모와의 델타를 구해서(그러니까 해당
  커밋의 델타만) 현 브랜치에 적용하는 것
 고른 커밋 하나에 대해서만 Rebase하는 것
   주요 브랜치 두 개는 중앙 저장소에 영원히 유지
       Master(배포했거나 곧 배포할(production-ready) 코드는 origin/master에 두고 관리)
       Develop(다음에 배포할 것을 개발하는 코드는 origin/develop에 두고 관리)
   Feature 브랜치
       다음, 아니면 다다음, 어쨌든 조만간에 배포할 기능을 개발하는 브랜치
       사실 언제 배포할 수 있는지 알 수 없음.
       feature 브랜치는 그 기능을 다 완성할 때까지 유지하고 다 완성되면 develop 브랜치로 merge
   Release 브랜치
       제품 배포를 준비하는 브랜치
       배포하는 데 필요한 버전 넘버, 빌드 일정 등의 메타데이터를 준비하고 사소한 버그도 잡음.
       이런 일을 release 브랜치에서 함으로써 develop 브랜치는 다음에 배포할 때 추가할 기능에 집중
        할 수 있음
       develop 브랜치가 배포할 수 있는 상태에 다다랐을 때 release 브랜치를 만드는 것이 중요
       이제 배포 버전을 부여하겠다는 것을 의미
   Hotfix 브랜치
       master 브랜치에서 만듦
       ex) 현재 운영 버전이 1.2이고 심각한 버그가 발견. develop 브랜치는 아직 불안정하기 때문에
        hotfix 브랜치를 만
       브랜치를 만들고 버전 넘버를 바꾸는 것을 잊으면 안됨들고 거기서 버그를 잡음
       버그를 잡았으면 master에 merge하고 다시 develop 브랜치에도 merge
감사합니다

Contenu connexe

Tendances

Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기Youngbin Han
 
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.JAndrew J. Kim
 
오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식Matthew (정재화)
 
Git 입문자를 위한 가이드
Git 입문자를 위한 가이드Git 입문자를 위한 가이드
Git 입문자를 위한 가이드chandler0201
 
Git: A Motivating Introduction
Git: A Motivating IntroductionGit: A Motivating Introduction
Git: A Motivating IntroductionJongwook Choi
 
Git & Github Seminar-1
Git & Github Seminar-1Git & Github Seminar-1
Git & Github Seminar-1sangyun han
 
Git의 개념과 사용
Git의 개념과 사용Git의 개념과 사용
Git의 개념과 사용환민 홍
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective GitChanwoong Kim
 
Git는 머꼬? GitHub는 또 머지?
Git는 머꼬? GitHub는 또 머지?Git는 머꼬? GitHub는 또 머지?
Git는 머꼬? GitHub는 또 머지?Ian Choi
 
Git 사용 가이드
Git 사용 가이드Git 사용 가이드
Git 사용 가이드도형 임
 
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함Ji-Woong Choi
 
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+githubGit 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+githubJunyoung Lee
 
버전관리시스템 종류와 소개
버전관리시스템 종류와 소개버전관리시스템 종류와 소개
버전관리시스템 종류와 소개Jong-il Seok
 

Tendances (20)

Git tutorials
Git tutorialsGit tutorials
Git tutorials
 
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
Git 과 GitHub 를 이용한 버전관리와 협업 - 2주차A - 비교하기와 되돌리기
 
git-basic-commands
git-basic-commandsgit-basic-commands
git-basic-commands
 
Github 사용법
Github 사용법Github 사용법
Github 사용법
 
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
 
오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식오픈소스 공헌을 위한 필수 지식
오픈소스 공헌을 위한 필수 지식
 
Git 코드랩 스터디 2
Git 코드랩 스터디 2Git 코드랩 스터디 2
Git 코드랩 스터디 2
 
Git 입문자를 위한 가이드
Git 입문자를 위한 가이드Git 입문자를 위한 가이드
Git 입문자를 위한 가이드
 
Git: A Motivating Introduction
Git: A Motivating IntroductionGit: A Motivating Introduction
Git: A Motivating Introduction
 
Git & Github Seminar-1
Git & Github Seminar-1Git & Github Seminar-1
Git & Github Seminar-1
 
Git의 개념과 사용
Git의 개념과 사용Git의 개념과 사용
Git의 개념과 사용
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective Git
 
Git는 머꼬? GitHub는 또 머지?
Git는 머꼬? GitHub는 또 머지?Git는 머꼬? GitHub는 또 머지?
Git는 머꼬? GitHub는 또 머지?
 
Git 사용 가이드
Git 사용 가이드Git 사용 가이드
Git 사용 가이드
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
[오픈소스컨설팅]Subversion vs git - 참을 수 없는 간단함
 
Advanced git
Advanced gitAdvanced git
Advanced git
 
Git
GitGit
Git
 
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+githubGit 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
 
버전관리시스템 종류와 소개
버전관리시스템 종류와 소개버전관리시스템 종류와 소개
버전관리시스템 종류와 소개
 

En vedette

정보사회학
정보사회학정보사회학
정보사회학Il-woo Lee
 
Docker.소개.30 m
Docker.소개.30 mDocker.소개.30 m
Docker.소개.30 mWonchang Song
 
NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가Choonghyun Yang
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYHyun-woo Park
 
NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스Choonghyun Yang
 
NoSQL 동향
NoSQL 동향NoSQL 동향
NoSQL 동향NAVER D2
 
[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델kidoki
 
No sql 5장 일관성
No sql 5장   일관성No sql 5장   일관성
No sql 5장 일관성rooya85
 
개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망 개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망 Donghan Kim
 
NoSQL Database
NoSQL DatabaseNoSQL Database
NoSQL DatabaseSteve Min
 
NoSQL 분석 Slamdata
NoSQL 분석 SlamdataNoSQL 분석 Slamdata
NoSQL 분석 SlamdataPikdata Inc.
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터jinho park
 
파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the Basic파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the BasicHyun-woo Park
 
Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Steve Min
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30Donghan Kim
 
Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins Choonghyun Yang
 

En vedette (20)

정보사회학
정보사회학정보사회학
정보사회학
 
Docker.소개.30 m
Docker.소개.30 mDocker.소개.30 m
Docker.소개.30 m
 
NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 
NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스
 
Express 프레임워크
Express 프레임워크Express 프레임워크
Express 프레임워크
 
NoSQL 동향
NoSQL 동향NoSQL 동향
NoSQL 동향
 
[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델
 
Big data
Big dataBig data
Big data
 
No sql 5장 일관성
No sql 5장   일관성No sql 5장   일관성
No sql 5장 일관성
 
개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망 개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망
 
NoSQL Database
NoSQL DatabaseNoSQL Database
NoSQL Database
 
NoSQL 분석 Slamdata
NoSQL 분석 SlamdataNoSQL 분석 Slamdata
NoSQL 분석 Slamdata
 
No sql 분산모델
No sql 분산모델No sql 분산모델
No sql 분산모델
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터
 
파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the Basic파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the Basic
 
TRIZ
TRIZTRIZ
TRIZ
 
Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
 
Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins
 

Similaire à Git

Git 분산버전관리 시스템(1)
Git 분산버전관리 시스템(1)Git 분산버전관리 시스템(1)
Git 분산버전관리 시스템(1)Hyunjun Roh
 
[17.02.09] Github introduction (Korean Version)
[17.02.09] Github introduction (Korean Version)[17.02.09] Github introduction (Korean Version)
[17.02.09] Github introduction (Korean Version)Ildoo Kim
 
Git basic2 chaos
Git basic2 chaosGit basic2 chaos
Git basic2 chaosYunkyu Choi
 
Hadoop distributed file system rev3
Hadoop distributed file system rev3Hadoop distributed file system rev3
Hadoop distributed file system rev3Sung-jae Park
 
리스펙토링 세미나 - Git, Github 알아보기
리스펙토링 세미나 - Git, Github 알아보기리스펙토링 세미나 - Git, Github 알아보기
리스펙토링 세미나 - Git, Github 알아보기Wooyoung Ko
 
Git Tutorial
Git TutorialGit Tutorial
Git TutorialMDLicht
 
해커스 가이드 투 깃
해커스 가이드 투 깃해커스 가이드 투 깃
해커스 가이드 투 깃Jongdeok Kim
 
git, git flow
git, git flowgit, git flow
git, git floweva
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기CONNECT FOUNDATION
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드Insub Lee
 
Hadoop Overview 1
Hadoop Overview 1Hadoop Overview 1
Hadoop Overview 1Kay Kim
 
GitHub 활용하기
GitHub 활용하기GitHub 활용하기
GitHub 활용하기DataUs
 
Git & Github Seminar-2
Git & Github Seminar-2Git & Github Seminar-2
Git & Github Seminar-2sangyun han
 
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDBNAVER D2
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
 
Git server 구축(git olite,gitweb)
Git server 구축(git olite,gitweb)Git server 구축(git olite,gitweb)
Git server 구축(git olite,gitweb)진혁 박
 

Similaire à Git (20)

Git 분산버전관리 시스템(1)
Git 분산버전관리 시스템(1)Git 분산버전관리 시스템(1)
Git 분산버전관리 시스템(1)
 
[17.02.09] Github introduction (Korean Version)
[17.02.09] Github introduction (Korean Version)[17.02.09] Github introduction (Korean Version)
[17.02.09] Github introduction (Korean Version)
 
Git basic2 chaos
Git basic2 chaosGit basic2 chaos
Git basic2 chaos
 
Hadoop distributed file system rev3
Hadoop distributed file system rev3Hadoop distributed file system rev3
Hadoop distributed file system rev3
 
리스펙토링 세미나 - Git, Github 알아보기
리스펙토링 세미나 - Git, Github 알아보기리스펙토링 세미나 - Git, Github 알아보기
리스펙토링 세미나 - Git, Github 알아보기
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
해커스 가이드 투 깃
해커스 가이드 투 깃해커스 가이드 투 깃
해커스 가이드 투 깃
 
Git
GitGit
Git
 
git, git flow
git, git flowgit, git flow
git, git flow
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
Git & GitHub
Git & GitHubGit & GitHub
Git & GitHub
 
Git
GitGit
Git
 
Hadoop Overview 1
Hadoop Overview 1Hadoop Overview 1
Hadoop Overview 1
 
GitHub 활용하기
GitHub 활용하기GitHub 활용하기
GitHub 활용하기
 
Git & Github Seminar-2
Git & Github Seminar-2Git & Github Seminar-2
Git & Github Seminar-2
 
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래
 
Git 기본
Git 기본Git 기본
Git 기본
 
Git server 구축(git olite,gitweb)
Git server 구축(git olite,gitweb)Git server 구축(git olite,gitweb)
Git server 구축(git olite,gitweb)
 

Git

  • 1. 아꿈사 http://cafe.naver.com/architect1 박진호 http://blog.naver.com/jinojjan
  • 2.  VCS  Git 디자인 목표  Git 과 Svn같은 VCS 와의 차이점  Git Workflow  Git의 세가지 상태  Git 구조  Merge, Rebase, Cherry Pick
  • 3.  대표적으로 RCS. (Patch Set 즉 파일에서 변경되는 부분 관리)  관리 중인 파일의 변경 정보를 로컬에 저장
  • 4. CVS, Subversion, Perforce 같은 것들  모든 파일을 관리하는 서버가 별도로 있고 많은 클라이언트가 중앙 서버에서 파일을 받아서 사용  장점 : 프로젝트 관리자가 누가 무엇을 하는지 체크 및 관리 가능  단점 : - 중앙 서버에 문제 발생 시 다른사람과의 협업 중단 및 하는 일을 백업 할 방법 없음. -. 중앙 데이터 베이스가 있는 하드디스크에 문제가 생기면 프로젝트의 모든 히스 토리를 잃음.
  • 5. Git, Mecurial, Bazar, Darcs 등  SVN 이나 CVS 처럼 마지막 Snapshot을 체크 아웃 하지 않음. 저장소 전부 복제  서버에 문제가 생기면 이 복제물로 다시 작업 시작 가능  장점 : 비선형 개발 및 다양한 방법으로 협업 가능  단점 : 어렵다
  • 6.  VCS  Git 디자인 목표  Git 과 Svn같은 VCS 와의 차이점  Git Workflow  Git의 세가지 상태  Git 구조  Merge, Rebase, Cherry Pick
  • 7. 빠른 속도  단순한 구조  비선형적인 개발(수천 개의 동시 다발적인 브랜치)  완벽한 분산  리눅스 커널 같은 대형 프로젝트에도 유용 할 것(속도나 데이터 크기 면에서)
  • 8.  VCS  Git 디자인 목표  Git 과 Svn같은 VCS 와의 차이점  Git Workflow  Git의 세가지 상태  Git 구조  Merge, Rebase, Cherry Pick
  • 9. 차이점 저장이 아닌 Snapshot 저장 각 파일에 대한 변화만 저장하는 시스템(SVN 등) Git 방식. 시간순으로 순차적으로 저장. SnapShot 방식 저장. 파일이 달라지지 않았으면 Git은 성 능을 위해서 파일을 저장하지 않음. 단지 이전 상태의 파일에 대한 링크 만 저장. 작은 파일 시스템
  • 10. 거의 모든 명령을 로컬에서 실행 SVN이나 CVS는 오프라인인 경우 파일 편집 가능하지만 Commit 불가 능 프로젝트의 모든 히스토리가 로컬 디스크에 있기 때문에 모든 명령 순 식간에 실행 -. 히스토리 조회 시 혹은 Diff 서버 필요 없음 -. 오프라인 상태에서도 조회 가능 -. 자신만의 브랜치 가능
  • 11. Git은 작다  분산 -. 최신 소스코드를 체크아웃하지 않고 레파지토리 전체를 복사하는 것(Clone) -. 메인서버에 문제가 생겼을때 누구나 메인서버에 푸시 가능 -. 성능도 빠르다. 보통 SVN은 체크아웃에서만 다른 DSCM들보다 조금 빠르다.
  • 12. 빠르다. 같은 DVCS 와의 비교 -. Git은 파일을 새로 추가하는 경우 를 제외하면 Git은 항상 빠르다. -. 정말정말 큰 데이터를 커밋하는 경우는 Hg가 제일 빠르다. 그러나 대부분의 경우 Git이 빠르다.
  • 13. 값싼 Branch 대부분이 권장하는 궁극의 브랜치는 새 디렉토리로 레파지토리를 통째로 복사하는 것. Git에서는 여러 개의 로컬 브랜치를 가질수 있으며 그 로컬 브랜치들은 서로 완벽하게 독립적이기 때문에 개발 중 수행하는 생성, 머지, 삭제 명령도 독립적으로 수행.
  • 14.  VCS  Git 디자인 목표  Git 과 Svn같은 VCS 와의 차이점  Git Workflow  Git의 세가지 상태  Git 구조  Merge, Rebase, Cherry Pick
  • 15.  Subversion같은 중앙집중식 시스템를 사용하다가 넘어온 사람들이 사용  내가 마지막으로 fecth한 후에 아무도 푸시하지 못하도록 할 수 있음. (그래서 중앙 집중식 가능.) 1. 한개발자가 한일을 커밋하고 아무 문제 없이 서버에 Push 2. 다른 개발자는 한 일을 커밋하고 Push 하기 전에 첫번째 개발자가 한 일을 먼 저 Fetch 하고 Merge 후 Push
  • 16.  개발자 자신은 읽고 쓸 수 있고 다른 개발자는 읽을 수만 있는 공개 저장소 사 용 하는 방식  보통 프로젝트를 대표하는 하나의 공식 저장소 있음. 1. 프로젝트 Integration Manager는 프로젝트 메인 저장소에 Push 2. 프로젝트 기여자는 메인 저장소를 Clone하고 수정 3. 기여자는 자신의 저장소에 Push 하고 Integration-Manager가 접근 할 수 있도록 공개 4. 기여자는 integration-Manager에게 변경사항을 적용해 줄 것을 E-mail 같은 것으로 요청 5. Integration-Manager는 기여자의 저장소를 리모트 저장소로 등록하고 수정사항을 Merge하여 테스 트 6. Integration-Manager는 Merge한 사항을 메인 저장소에 Push
  • 17.  여러 저장소를 운영하는 방식을 변형한 구조  보통 수백명의 개발자가 기여하는 아주 큰 프로젝트를 운영할 때 이 방식 사용  리눅스 커널 프로젝트가 대표적 1. 개발자는 코드를 수정하고 master 브랜치를 기준으로 자신의 토픽 브랜치를 Rebase. Master 브랜치 란 Dictator의 브랜치 2. Lieutenant들은 개발자들의 수정사항을 자신이 관리하는 master 브랜치에 Merge 3. Dictator는 Lieutenant의 master 브랜치를 자신의 master 브랜치로 Merge 4. Dictator는 Merge한 자신의 master 브랜치를 Push 하여 다른 모든 개발자가 Rebase 할 수 있는 기준 으로 만듦.
  • 18.  VCS  Git 디자인 목표  Git 과 Svn같은 VCS 와의 차이점  Git Workflow  Git의 세가지 상태  Git 구조  Merge, Rebase, Cherry Pick
  • 19. Git Directory : Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳 Working Directory : 프로젝트의 특정 버전을 Checkout 한 것 Staging Area : Git Directory에 있다. 단순한 파일이고 곧 Commit 할 파일에 대한 정보 를 저장
  • 20. Untracked : 관리 대상이 아님 Tracked : 관리 대상임. 이미 Snapshot에 포함돼 있던 파일. 아래의 3가지 상태중 하나 -. Unmodified : 수정하지 않음 -. Modified : 수정함 -. Staged : 커밋을 하면 현재 수정사항을 저장소에 기록함
  • 21.  VCS  Git 디자인 목표  Git 과 Svn같은 VCS 와의 차이점  Git Workflow  Git의 세가지 상태  Git 구조  Merge, Rebase, Cherry Pick
  • 22.  Content-addressable 파일 시스템 그 위에 VCS 사용자 인터페이스가 있는 구조  단순한 Key-Value 데이터 저장소  어떤 형식의 데이터라도 집어넣을 수 있고 해당 Key로 언제든지 데이터를 다 시 가져올 수 있음.
  • 23. 초기화 시 폴더 구조  Plumbing 명령과 Porcelain 명령  Git 개체  Blob 개체  Tree 개체  Commit 개체  Git 레퍼런스  HEAD  Tag  Remote 레퍼런스  PackFile  데이터 전송 프로토콜  Dump 프로토콜  Smart 프로토콜
  • 24. Git 초기화 Git 초기화시 폴더 구조  hook 디렉토리 : 클라이언트 훅이나 서버 훅을 넣음.  info 디렉토리 : .gitignore 파일처럼무시할 파일의 패턴을 적어 두는 곳이다. 하지만 .gitignore 파일과는 달리 Git으 로 관리되지 않음.  objects 디렉토리 : 모든 컨텐트를 저장하는 데이터베이스  refs 디렉토리 : Commit 개체의 포인터를 저장  config 파일 : 해당 프로젝트에만 적용되는 설정 옵션이 들어 있음  description 파일 : 기본적으로 GitWeb 프로그램에서만 사용  HEAD 파일 : 현재 Checkout한 브랜치를 가리킴  index 파일 : Staging Area의 정보를 저장. Staging 영역이 생겨야 만들어짐. Init 시에는 안만들어짐.
  • 25. Plumbing  명령어 여러 개를 Unix 스타일로 함께 엮어서 실 행하거나 스크립트에서 호출될 수 있도록 디자 인됨. 이러한 저수준 명령어를 가리킴  Porcelain  좀 더 사용자 친화적인 명령어. (commit, add 등)
  • 26. hash-object에 데이터를 주면 .git 디렉토리에 저장하고 그 key를 알려줌. –w 옵션 줘야 저장 -. 헤더 정보와 데이터 정보를 합쳐서 SHA-1 해시 정보 생성 -. 해시 처음 2글자를 따서 디렉토리 이름. 나머지 38 글자는 파일이름. 새로 만든 파일에 데이터 저장
  • 27. 해쉬의 내용 확인 (cat-file 명령으로 저장한 데이터를 불러올 수 있음. -p 는 파일 내용 출력) -. 파일의 이름은 저장하지 않았음. -. 단지 파일 내용만 저장했을 뿐. -. 이런 종류의 개체를 Blob 개체라고 함.
  • 28. test.txt 파일을 수정 ( version 2 라는 내용으로 변경) hash-object –w를 사용하여 저장소에 저장 Objeccts 폴더에 55로 시작하는 것이 추가됨
  • 29. 첫번째 버전으로 되돌리는 경우 두번째 버전으로 되돌리는 경우
  • 30.  Git 모든 것을 Tree와 Blob 개체로 저장  Tree 개체로 파일 이름을 저장할 수 있고 파일 여러개를 한 번에 저장 -. Tree는 유닉스의 디렉토리에 대응 -. Blob은 Inode나 일반 파일에 대응 -. Tree 개체 하나는 항목을 여러 개 가질 수 있음 파일 모드 개체 타입 Blob 개체나 하위 Tree 개체를 가리키는 SHA-1 포인터 파일 이름
  • 31.  Git은 일반적으로 Staging Area(Index)의 상태대로 Tree 개체를 만들고 기록  Tree 개체를 만들려면 Staging Area에 파일을 추가해서 Index를 만들어야 함 Ex ) Plumbing 명령으로 만들어진 Tree 구조 예제
  • 32. Snapshot을 누가, 언제, 왜 저장했는지에 대 한 정보  Tree 개체에 대한 SHA-1 값 ※ 깨진 글자는 “테스트 커밋 1” 임 Snapshot에서 최상단 Tree를하나 가리킴 user.name과 user.email 설정에서 가져온 Author/Committer 정보, 시간 정보, 그리고 한 줄 띄운 다음 커밋 메시지
  • 33. Git 데이터 구조 예제 Git 저장소 내의 모든 개체 예제 ※ 해쉬 값은 틀리므로 참고하지 말고 전체 적인 구조를 눈에 담으면 됨.
  • 34. Log 볼 경우 sha-1 값을 기억해야 함.  Sha-1 값을 쉬운 이름으로 저장된 파일을 레퍼런스 혹은 refs 라 함  오직 sha-1 값만 저장되어 있음
  • 35. Commit , tree, blob 와 refs 가 연계된 예제.
  • 36.  HEAD 파일은 현 브랜치를 가리키는 간접(symbolic) 레퍼런스  그래서 branch 시 마지막 커밋의 sha-1값 알수 있음  git commit을 실행하면 Commit 개체가 만들어지는데, 지금 HEAD가 가리키고 있던 커밋의 SHA-1 값이 그 Commit 개체의 부모로 사용
  • 37.  Commit 개체랑 비슷  누가, 언제 Tag를 달았는지 Tag 메시지는 무엇이고 어떤 커밋을가리키는지에 대한 정보가 포함  Tag 개체는 Tree 개체가 아니라 Commit 개체를 가리킨다 는 것이 그 둘의 차이  브랜치처럼 Commit 개체를 가리키지만 옮길 수는 없음  Annotated Tag  만들기 쉬움.  브랜치랑 비슷하지만 브랜치처럼 옮길 수는 없음.  Lightweight Tag  Tag 개체를 만들고 거기에 커밋을 가리키는 레퍼런스를 저장  커밋을 직접 가리키지 않고 Tag 개체를 가리킴
  • 38. Remote를 추가하고 Push하면 Git은 각 브랜치마다Push한 마지막 커밋이 무엇인지 refs/remotes 디렉토리에 저장  Remote 레퍼런스와 refs/heads에 있는 레퍼런스인 브랜치 와 차이점은 Checkout할 수 없다는것  Remote 레퍼런스는 서버의 브랜치가 가리키는 커밋이 무 엇인지 적어둔 일종의 북마크
  • 39.  Git이 처음 개체를 저장하는 형식 : Loose 개체 포맷.  이 개체들을 파일 하나로 압축(Pack) : Pack File  Pack File 생성 시점  Loose 개체가 너무 많을 때  git gc 명령을 실행했을 때  리모트 서버로 Push할 때
  • 40.  Pack File : 파일 시스템에서 삭제된 개체가 전부 pack 파일에 저장됨  Index File : 빠르게 찾을 수 있도록 Pack File의 오프셋이 들어 있음.
  • 41. Pack 파일 확인 : git verify-pack –v 인덱스 파일
  • 42.  Git은 각 시점의 스냅샷을 저장하기도 하지만 그 스냅샷 사이의 델타를 저장하 기도 함.  커밋을 하면 그 시점의 스냅샷이 저장되는 것이고 그 커밋과 부모의 커밋을 비 교(diff)하면 델타를 얻을 수 있음. Git gc 실행 마지막 버전의 파일 하나만 통째로 저장하고 이전 버전들은 델타 (diff 파일)를 저장 rev6를 요구하면 rev6의 파일을 그대로 반환. 하지만, rev4를 요구 하면 rev6 파일에 rev5, rev4의 델타를 적용해서 반환
  • 43.  Mercurial은 처음에 스냅샷을 저장하고 그다음 버전부터는 델타를 저장.  최신 버전의 파일이 요구하면 첫 스냅샷 파일과 최근까지의 델타를 적용해서 반환
  • 44. 프로토콜 2가지 종류  Dump 프로토콜이라 부를 수 있는 Http  Smart 프로토콜이라고 부를 수 있는 file://, ssh://, and git:// 프로토콜  Dump 프로토콜(Http)  데이터를 전송할 때 서버에서는 Git만을 위해 특화된 코드를 전혀 사용하지 않음.  Fetch 하는 과정은 여러 개의GET 요청을 순서대로 보내고 데이터 받음  순서 ▪ info/refs 파일 다운(리모트 레퍼런스와 SHA 값이 든 목록을 가져옴) ▪ HEAD 레퍼런스를 다운(데이터를 내려받고 나서 어떤 레퍼런스를 Checkout할 지 알게됨) ▪ 데이터 전송을 마치고 나면 master 브랜치를 Checkout할 준비가 끝 ▪ info/refs 의 Sha-1의 값을 가지고 Fetch ▪ 서버로부터 얻어온 개체를 zlib로 압축을 풀고 header를 떼어냄 ▪ Commit 개체 및 Tree 개체를 다운 받음 ▪ 예외) Commit 개체나 Tree 개체가 서버에 없을 경우 다른 서버나 Pack file에 존재 다른 서버에 있는 지 체크 Packfile의 인덱스 파일에 있는지 체크
  • 45. Smart 프로토콜  HTTP 프로토콜은 매우 단순하다는 장점이 있으나 전송은 효율적이지 못함.  Smart 프로토콜로 데이터를 전송하는 것이 더 일반적  서버는 클라이언트가 어떤 데이터를 갖고 있고 어떤 데이터가 필요한지 분석하여 실제로 전송할 데이터를 추려냄  데이터 업로드 ▪ Send pack 과 Receive Pack 과정(서버가 가진 정보를 앎) ▪ 어떤 커밋 데이터가 서버에 없는가를 분석 ▪ send-pack은 Push할 레퍼런스에 대한 정보를 서버의 receive-pack에 전달
  • 46. Smart 프로토콜  master 브랜치를 업데이트하고 experiment 브랜치를 추가하려 한다면 send-pack은서버에 다음 과 같은 정보를 서버에 보냄  SHA-1 값이 모두 0이면 전에 없었던 것(새로 추가하는 experiment 레퍼런스가 이에 해당)  레퍼런스를 삭제하려면 반대편 즉 업데이트를 할 오른편 위치의 해시 값을 모두 0으로 채움  Git은 업데이트할 레퍼런스의 예전 SHA, 새로운 SHA, 레퍼런스 이름을 각 줄에 담아 전송  각 줄에는 클라이언트의 Capability도 포함  클라이언트는 서버가 갖고 있지 않은 모든 데이터를 하나의 Packfile에 담아서 전송  서버는 성공적으로 데이터를 처리했다고 응답하거나 아니면 실패했다고 응답
  • 47.  VCS  Git 디자인 목표  Git 과 Svn같은 VCS 와의 차이점  Git의 세가지 상태  Git 구조  Merge, Rebase, Cherry Pick  Git Workflow
  • 48.  Branch를 만든다.  Merge Base를 자동으로 기록  나중에 Merge를 하면 두 스냅샷을 기준으로 diff 프로그램을 이용해서 델타를 만들어서 한쪽 브랜치에 patch 프로그램으로 적용  3-Way Merge 사용. (Svn은 2-Way Merge 방식. Merge Base를 기록해주지 않아 수동 머지 해야함.)
  • 49.  Merge와 비슷  델타를 만들어서 적용하는 것은 같지만 히스토리를 구성하는게 다름.  커밋 순서를 순차적으로 배열  Git과 Svn 연결해서 사용시 서버로 Push 전 이 방식으로만 씀.
  • 50.  Cherry-pick은 특정 커밋과 그 커밋의 부모와의 델타를 구해서(그러니까 해당 커밋의 델타만) 현 브랜치에 적용하는 것  고른 커밋 하나에 대해서만 Rebase하는 것
  • 51. 주요 브랜치 두 개는 중앙 저장소에 영원히 유지  Master(배포했거나 곧 배포할(production-ready) 코드는 origin/master에 두고 관리)  Develop(다음에 배포할 것을 개발하는 코드는 origin/develop에 두고 관리)
  • 52. Feature 브랜치  다음, 아니면 다다음, 어쨌든 조만간에 배포할 기능을 개발하는 브랜치  사실 언제 배포할 수 있는지 알 수 없음.  feature 브랜치는 그 기능을 다 완성할 때까지 유지하고 다 완성되면 develop 브랜치로 merge
  • 53. Release 브랜치  제품 배포를 준비하는 브랜치  배포하는 데 필요한 버전 넘버, 빌드 일정 등의 메타데이터를 준비하고 사소한 버그도 잡음.  이런 일을 release 브랜치에서 함으로써 develop 브랜치는 다음에 배포할 때 추가할 기능에 집중 할 수 있음  develop 브랜치가 배포할 수 있는 상태에 다다랐을 때 release 브랜치를 만드는 것이 중요  이제 배포 버전을 부여하겠다는 것을 의미
  • 54. Hotfix 브랜치  master 브랜치에서 만듦  ex) 현재 운영 버전이 1.2이고 심각한 버그가 발견. develop 브랜치는 아직 불안정하기 때문에 hotfix 브랜치를 만  브랜치를 만들고 버전 넘버를 바꾸는 것을 잊으면 안됨들고 거기서 버그를 잡음  버그를 잡았으면 master에 merge하고 다시 develop 브랜치에도 merge
  • 55.