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
- SSH
자세한 내용은 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라는 명칭이 표준이 되어가고 있다
- Local Repository
Git을 Commit을 할 경우 작업소스가 이곳에 반영되며, .git 안에 HEAD와 Index가 존재
- Remote Repository
주로 git clone / fetch or pull로 가져오고, push로 반영한다.
1.4 Git 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 clone으로 deep clone을 하여 .git (git 관련 config 및 관련파일) 모두 받아오지만, 문제는 snapshot의 크기가 너무 커진다.
https://git-scm.com/docs/git-clone
* 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의 주요사항
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 (좋은그림)
http://mcchae.egloos.com/10881235
http://forum.falinux.com/zbxe/index.php?document_srl=588283&mid=lecture_tip
출처: http://blog.osteele.com/posts/2008/05/my-git-workflow |
출처: http://blog.osteele.com/posts/2008/05/my-git-workflow |
1.4 Git Repository를 만드는 방법
- Local에는 기존의 작업소스가 있으면, 이것을 Local Repository 반영하는 방법
- 외부서버에서 제공하는 존재하는 Repository를 Clone하는 방법
- 기존작업소스가 있으며, Local에 Reposiory를 생성해서 만드는 방법 (1번)
- git init : .git 디렉토리를 생성하여, empty Git repository를 생성
- git add *.c : Stage Area or Index에 반영.
- git commit -m 'first version ' : 이용하여 Local Repository에 반영
- 외부서버에 CLONE으로 가져오는 방법 (2번)
- 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 $ 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 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의 정보가 없으면, git init로 강제 생성 후 실행
- 만약 기존 .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을 관리하는 정보들이 포함
- HEAD: branch 참조 file이며, 현재 checkout한 branch 위치
- index: Staging Area로 commit 할 files들을 저장한 file
- objects: 이 Directory는 source의 snapshot 저장정보.
- refs: 이 Directory는 Commit 의 pointer를 저장한다.
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
- GIT 간편설명서
- Window GIT
http://mcchae.egloos.com/10881235
http://forum.falinux.com/zbxe/index.php?document_srl=588283&mid=lecture_tip
- Android 이클립스에서 소스 다운
- GIT 설치
- GIT 쉬운설명
- GITHuB
- GIT 사용법