7/12/2014

GIT 기본개념

1. GIT의 기초와 용어

GIT 문서 혹은 인터넷에 있는 그림을 읽다보면, 기본용어부터 혼동이 되어, 자꾸 헷갈리고 한다. 그래서 이부분 부터 정리하고 가는 것이 나은 것 같아,
아래와 같이 간단히 정리하고자 한다.

  • GIT 한글 메뉴얼/ 영문메뉴얼 
한글 메뉴얼을 보다 이해가지 않다가 영문메뉴얼보면 잘 이해가 갈때가 많다.

   https://git-scm.com/book/ko/v2
   https://git-scm.com/book/en/v2


1.1 GIT의 지원 Protocol 

Git 현재 4가지 Protocol을 지원을 해주며, 많이 사용되는 것이 http/ssh/git 이다.
(Local, SSH, Git, HTTP)

  • HTTP/HTTPS
주로 아래와 같이 pull 전용을 사용을 하며, push할 경우는 WebDAV를 이용한다고 합니다.
  • SSH
기본적으로 인증을 필요하며, login이 필요로 하며, push, pull하기가 쉽지만, login과 인증단점입니다.

자세한 내용은 4.1 Git Manual을 보시면, 장단점을 아실수가 있습니다.
  
  https://git-scm.com/book/ko/v1/Git-%EC%84%9C%EB%B2%84-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

1.2  Git Local Operations

Repository는 Local과 Remote가 존재하며, Remote는 원격지 Git Server가 있을 경우 사용한다.
만약 없다면, 아래와 같이 Local Repository로 Source 관리를 진행을 한다.

아래의 용어들은 반드시 이해를 해야한다.

Git의 기본상태 
  • Committed란 데이터가 로컬 데이터베이스에 안전하게 저장됐다는 것을 의미한다. 
  • Modified는 수정한 파일을 아직 Local Repository에 Commit하지 않은 것을 말한다. 
  • Staged란 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미한다.




  • Tracked : 마지막 snopshot에 저장된 file들로, 상태는 unmodifed, modified or staged 상태.
  • UnTracked: Staging Area안 에 없거나 마지막 snapshoot에도 없는 모든 file들, 신규파일 





    https://git-scm.com/book/en/v2/Getting-Started-Git-Basics
    https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository


1.3  GIT 관련 작업흐름용어 

  • Workspace or Working directory 
실제 개발자의 작업소스 , 즉 개발소스가 위치해 있는 곳이며, 개발유저가 작업하는 공간을 말한다

  • Index or Stage Area or Staging Area
Staging Area는 .git 디렉토리에 존재하며, 단순한 파일(Index) 이고 곧 커밋할 파일에 대한 정보를 저장한다.
종종 인덱스라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다

  • Local Repository 
HEAD는 현재 Local Repository의 GIT Commit 위치를 표시하며, 개발자가 처음 clone으로 Local로 가져온 Local Repository를 말한다. 
Git을 Commit을 할 경우 작업소스가 이곳에 반영되며, .git 안에 HEAD와 Index가 존재

  • Remote Repository 
Remote에 저장된 Repository로 .git 의 관련파일과 Workspace도 같이 존재한다. 
주로 git clone / fetch or pull로 가져오고, push로 반영한다.




출처: http://blog.osteele.com/posts/2008/05/my-git-workflow





출처: http://blog.osteele.com/posts/2008/05/my-git-workflow


1.4  Git Repository를 만드는 방법

  1. Local에는 기존의 작업소스가 있으면, 이것을 Local Repository 반영하는 방법 
  2. 외부서버에서 제공하는  존재하는 Repository를  Clone하는 방법 

  • 기존작업소스가 있으며, Local에 Reposiory를 생성해서 만드는 방법 (1번)
  1. git init      :   .git 디렉토리를 생성하여, empty Git repository를 생성
  2. git add *.c :   Stage Area or Index에 반영. 
  3. git commit -m 'first version ' :  이용하여 Local Repository에 반영 

  • 외부서버에 CLONE으로 가져오는 방법 (2번)
  1. git clone url : remote에서 Repository에서 가져와 Local Repository에 저장. 


    Git manual 9장 참조
    https://git-scm.com/book/ko/v1/Git%EC%9D%98-%EB%82%B4%EB%B6%80-Plumbing-%EB%AA%85%EB%A0%B9%EA%B3%BC-Porcelain-%EB%AA%85%EB%A0%B9
    https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository#Initializing-a-Repository-in-an-Existing-Directory

  • git init으로 .git를 생성
git init로 바로 생성하여 내부구성
$ git init 
$ ll
.git  // Kernel 내부 .git config
$ tree .git
├── HEAD  // ref: refs/heads/master  (현재 사용중인 Git 의 정보위치이며 Branch or Tag가 있다면 변경) 아직 index는 미생성 
├── branches
├── config  // Git의 Config  (중요) 
├── description
├── hooks  // Git의 hooking 이 존재하는데, 세부사용법은 아직 모름 
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-rebase.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags
$ rm -rf .git


  • git clone (shallow clone 과 deep clone) 비교 및 .git 구성확인 
Git clone 은 현재 Git의 History 와 소스를 받아오는 기능으로, History를 depth 기능 옵션으로 조절가능하다. 

// Git Kernel 소스는 download하지만 전체이력을 못 받음 
$ git clone --depth 1 https://github.com/hardkernel/linux.git -b odroid-3.0.y-android  
$ ll
.git   // 상위 설정과 동일 
linux  // Linux Kernel  Branch Version: odroid-3.0.y-android ( Workspace 생성)
$ cd linux
$ tree --charset unicode .git  // .git 정보분석 
.git
├── HEAD     //ref: refs/heads/odroid-3.0.y-android  (현재 Git의 위치) 
├── branches  // branch Directory로 현재 Branch가 없음  
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-rebase.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── index     // index 존재하며, Binary이며, 변경사항이 있다면 변경 
├── info
│   └── exclude
├── logs            
│   ├── HEAD
│   └── refs
│       └── heads
│           └── odroid-3.0.y-android  // Log로 refs/heads/branch 정보를 볼수 있다. 
├── objects  // 1 depth 이므로 모든 History를 가져오지 않으므로 사이즈가 작음 
│   ├── info
│   └── pack // Local Repository Snapshot Data
│       ├── pack-eb0888d55e1033caf11a41b0e613155f0c7b853e.idx   
│       └── pack-eb0888d55e1033caf11a41b0e613155f0c7b853e.pack
├── packed-refs
├── refs
│   ├── heads   //Local Repository refs/heads/odroid-3.0.y-android  위치 
│   │   └── odroid-3.0.y-android   //41124682529c80d880993276110c286d0a41dd38  
│   ├── remotes   //Remote Repository 위치 정보 
│   │   └── origin                
│   │       └── HEAD                      //ref: refs/remotes/origin/odroidg12-4.9.y    
│   └── tags                                         // tag 정보지만 현재 없음 
└── shallow          // depath 옵션을 주었기 때문에 shallow 생성되며, 위치정보 (41124682529c80d880993276110c286d0a41dd38)  

$ vi .git/config  //상위 head 파일 중심으로 보면됨  
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/hardkernel/linux.git
        fetch = +refs/heads/odroid-3.0.y-android:refs/remotes/origin/odroid-3.0.y-android
[branch "odroid-3.0.y-android"]
        remote = origin
        merge = refs/heads/odroid-3.0.y-android

$ du -sh .git
124M    .git

$ du -sh .git/objects/
120M    .git/objects/

$ rm -rf .git

일반적으로 git clone으로 deep clone을 하여  .git (git 관련 config 및 관련파일) 모두 받아오지만, 문제는 snapshot의 크기가 너무 커진다. 
// Git Kernel 소스 와 전체이력을 받아오지만 Size 차이가 너무많이남 
$ git clone https://github.com/hardkernel/linux.git -b odroid-3.0.y-android  // Git Deep Clone 

$ tree --charset unicode linux/.git
linux/.git
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   `-- update.sample
|-- index
|-- info
|   `-- exclude
|-- logs
|   |-- HEAD
|   `-- refs
|       |-- heads
|       |   `-- odroid-3.0.y-android
|       `-- remotes
|           `-- origin
|               `-- HEAD
|-- objects
|   |-- info
|   `-- pack
|       |-- pack-cc7be19c1c52440ab7be476f1eebe7b55e39139e.idx
|       `-- pack-cc7be19c1c52440ab7be476f1eebe7b55e39139e.pack
|-- packed-refs
`-- refs
    |-- heads
    |   `-- odroid-3.0.y-android
    |-- remotes
    |   `-- origin
    |       `-- HEAD
    `-- tags

$ vi linux/.git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/hardkernel/linux.git
        fetch = +refs/heads/odroid-3.0.y-android:refs/remotes/origin/odroid-3.0.y-android
[branch "odroid-3.0.y-android"]
        remote = origin
        merge = refs/heads/odroid-3.0.y-android

$ du -sh linux/.git
3.7G    linux/.git

$ du -sh linux/.git/objects/
3.7G    linux/.git/objects/

$ rm -rf .git

  https://git-scm.com/docs/git-clone

  • git fetch 의 .git 구성 비교
git fetch는 git clone과 다르게,  workspace인 현재 아래의 remote의 Kernel 소스는 가져오지 않으며, .git 에 관련된 정보만 가져온다. 
  1. 만약 .git의 정보가 없으면, git init로 강제 생성 후 실행 
  2. 만약 기존 .git 정보가 존재하면, 변경된 사항을 가져온다.  
$ git init
$ git fetch https://github.com/hardkernel/linux.git odroid-3.0.y-android
$ ll
.git
$ tree .git
.git/
├── FETCH_HEAD   // 41124682529c80d880993276110c286d0a41dd38                branch 'odroid-3.0.y-android' of https://github.com/hardkernel/linux
├── HEAD         // ref: refs/heads/master  
├── branches
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack // 상위 Index는 존재하지 않으며, snapshot data만 존재 
│       ├── pack-4c5025bde724819ecf7d0e94d0b62eb7e51cc378.idx
│       └── pack-4c5025bde724819ecf7d0e94d0b62eb7e51cc378.pack
└── refs
    ├── heads
    └── tags

$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true

$ du -sh .git/
768M    .git/

$ rm -rf .git

          * odroid-3.0.y-android branch 이름

    https://git-scm.com/book/ko/v1/Git%EC%9D%98-%EB%82%B4%EB%B6%80-Git-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4


1.5 Git Directory의 주요사항  

  • .git 안의 아래의 FILE 혹은 Directory이며 GIT을 관리하는 정보들이 포함
  1. HEAD: branch 참조 file이며, 현재 checkout한 branch 위치  
  2. index: Staging Area로 commit 할 files들을 저장한 file 
  3. objects: 이 Directory는 source의 snapshot 저장정보.
  4. refs: 이 Directory는 Commit 의 pointer를 저장한다. 
    https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain
    https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
    https://git-scm.com/book/en/v2/Git-Internals-Git-References
    https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

결론적으로, 유저가 직접 수정해야 관리해야하는 Workspace 하나이지만, index와 local repository는 유저에 안에 있으며, git command로 소스관리 목적하에 관리되어진다. 

    https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging


1.6 GIT Update 관련  

   https://kldp.org/node/134487
   https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html
   http://blog.outsider.ne.kr/666
     

2. Git 관련사이트 및 참조내용  

아래내용들을 참조하자

  • 참조사이트 

  http://rogerdudler.github.io/git-guide/index.ko.html          (쉬운설명)
  http://dogfeet.github.io/articles/2012/progit.html              (Progit 매뉴얼)
  http://blog.osteele.com/posts/2008/05/my-git-workflow   (좋은그림)
  • ProGIT
  http://dogfeet.github.io/articles/2012/progit.html
  • GIT 간편설명서
  http://rogerdudler.github.io/git-guide/index.ko.html
  • Window GIT
  http://msysgit.github.com/
  http://mcchae.egloos.com/10881235
  http://forum.falinux.com/zbxe/index.php?document_srl=588283&mid=lecture_tip
  • Android 이클립스에서  소스 다운
  http://hightin.tistory.com/16
  • GIT 설치
  http://blog.naver.com/david_shkim/50106135598
  • GIT 쉬운설명
  http://blog.hjf.pe.kr/37
  • GITHuB
  http://blog.outsider.ne.kr/865
  • GIT 사용법
  http://bunhere.tistory.com/37