해리의 데브로그

생활코딩 Git 02 - git의 원리 (gistory, git add, git commit, git status)

|


분석도구 gistory

gistory는 git을 분석하기 위한 도구입니다. 명령을 내렸을 때 git의 내부에서는 어떤 일이 일어나는가를 분석하면서 git이 어떻게 동작하는가를 스스로 공부하는데 도움을 드리기 위해서 고안된 도구입니다.

  • pip install gistory : gistory 설치 (파이썬이 설치되지 않은 경우, 파이썬을 추가 설치할 것)

git 으로 관리하고 있는 디렉토리가 아니라 버전 관리에 대한 정보가 들어있는 .git 폴더내에서 실행을 해야 제대로 작동이 된다. 혹시, 작동이 안되는 경우 파이썬을 환경변수로 등록하도록 하자.

  • http://localhost:8805/ : gistory 접속
#git 디렉토리에서 실행할 경우
$ gistory
Please execute in .git directory. (.git ▒▒▒丮▒▒ ▒̵▒▒▒ ▒Ŀ▒ ▒▒▒▒▒▒▒ּ▒▒▒)

#.git에서 실행할 경우
$ gistory
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8805/
Hit Ctrl-C to quit.


git add의 원리

  • 파일을 생성해도 gistory에는 아무런 변화가 없음. 파일 생성에는 git은 아무런 관여를 하지않음.
  • git add 시, .\index\objects\ 가 gist에 새로 생성됨.
    • 파일의 이름은 index에 담겨지고, 파일의 내용은 objects에 담겨짐.
    • objects에 담겨있는 파일을 object 또는 객체라고 부름
  • git은 어떠한 파일을 저장할 때, 파일명이 달라도, 내용이 같으면, 같은 object 파일을 가리킴
    • 이는 중복을 제거해 줌.

objects 파일명의 원리

  • git add의 원리: 내용이 같으면 파일의 이름이 같다. 내용을 기반으로 해서 파일의 이름이 결정되는 매커니즘
    • SHA1 해쉬 알고리즘 (http://www.sha1-online.com/)
  • 특정한 텍스트를 입력하면 SHA1 해쉬 알고리즘을 통해 어떠한 일정한 길이의 텍스트가 출력됨
    • hello : aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
    • hi: c22b5f9178342609428d6f51b2c5af4c0bde6a42
  • hello라는 정보가 담긴 파일의 내용을 git으로 관리한다고 가정하면, SHA1 해쉬 알고리즘을 통해 결과값을 도출하며, 결과값에서 앞의 2글자(aa)를 떼서 objects 디렉토리 밑에 새로운 디렉토리를 만들고, f4~fd로 끝나는 파일을 만들어서 그안에 hello라는 정보를 저장함.
    • hello 라는 정보는 objects/aa/f4c61ddcc5e8a2dabede0f3b482cd9aea9434d 파일에 저장됨.
  • 어떠한 파일에 대하여 git add를 하게 되면,
    • git은 사용자가 add 한 파일의 내용(예; a) 을 살펴 봄.
    • a 라는 정보와 부가적인 정보를 추가해서 압축함
    • 압축한 결과를 SHA1 해쉬 알고리즘 통해 hash 결과 값을 도출 함.
    • 그 값에 해당 하는 디렉토리와 파일을 objects 라는 디렉토리 안에 만들고, 그 안에 a라는 정보를 저장함
    • 마지막으로, index 파일 내에 파일 명과 내용에 대한 hash 결과값을 적음


git commit의 원리

  • commit 메세지에 해당 하는 정보가 objects 라는 디렉토리안에 저장됨.
  • commit(버전)도 파일의 내용처럼 objects 안에 들어감 => 내부적으로 commit 도 object(객체)라 할 수 있음.

Commit의 2가지 주요 정보

  • parent: 이전 commit이 누군지? 부모를 나타냄
  • tree: 커밋이 일어난 시점에 우리의 작업 디렉토리의 파일의 이름과, 파일의 이름이 담고 있는 내용 사이의 정보
    • 각각의 버전마다 서로 다른 tree를 가르키며, 각 tree에는 우리가 작성한 버전에 해당되는 파일의 이름과 내용이 링크로 연결되어 있음
    • 이 버전에 적혀있는 트리를 통해서 버전이 만들어진 시점에 대한 프로젝트 상태를 얻을 수 있음
    • 사진을 찍었다 라는 표현으로 snapshot이라하며, snapshot을 트리라는 정보구조를 통해 가지고 있음.
  • object 디렉토리안에는 object 파일이 들어가며 다음과 같이 3가지로 분류됨
    • blob: 파일의 내용을 담고있음
    • tree: 디렉토리의 파일 명과 파일명에 해당하는 내용(blob)의 정보를 담고있음
    • commit: commit에 대한 정보가 담김 (parent, tree, comitter, commit id)
  • 새로운 폴더(디렉토리)를 생성할 경우, blob이 아니라 tree로 분류됨.
#gistory 내 commit 에 대한 정보 예시
[commit] eb8cb46ecfdcdc2179b3c9a5422688eaf66856ff
tree 8cd9d220808a510fe08a61971b4e5cf12f44703f
parent c9a84bd28476612639770ada21fe9d89b7737007
author Harry Lee <tothefullest08@gmail.com> 1549785964 +0900
committer Harry Lee <tothefullest08@gmail.com> 1549785964 +0900

2
    #tree 클릭시,
    [tree] 8cd9d220808a510fe08a61971b4e5cf12f44703f
    100644 blob fa2470945e46b80e026b5307755a1d37fecad10c	f1.txt
    100644 blob 6b7ebdabbd56bc8a06c9c80573229b9b498783a5	f2.txt
    100644 blob fa2470945e46b80e026b5307755a1d37fecad10c	f3.txt
    
        #tree - f2. txt
        [blob] 6b7ebdabbd56bc8a06c9c80573229b9b498783a5
        y
        z
        f2.txt (This information was not included the original message)


    #parent 클릭시, 
    [commit] c9a84bd28476612639770ada21fe9d89b7737007
    tree 10b8459ff150b8007786afc917a22e8d81c77f85
    author Harry Lee <tothefullest08@gmail.com> 1549785598 +0900
    committer Harry Lee <tothefullest08@gmail.com> 1549785598 +0900

    1

        #parent의 tree 클릭 시,
        100644 blob fa2470945e46b80e026b5307755a1d37fecad10c	f1.txt
        100644 blob ab9a1ea4c48eaa0b52c8b1fb5818488198ab1c0a	f2.txt
        100644 blob fa2470945e46b80e026b5307755a1d37fecad10c	f3.txt
        
        
            #parent - tree - f2.txt 클릭시, 
            [blob] ab9a1ea4c48eaa0b52c8b1fb5818488198ab1c0a
            z


git status의 원리

해리@DESKTOP-8D71JEB MINGW64 ~/gitfth2 (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   f2.txt

no changes added to commit (use "git add" and/or "git commit -a")
  • git은 아래의 두 정보를 서로 비교하여, 파일이 수정되었거나 변경되었는지의 여부를 git status로 알려줌.
    • .\index 파일에 나타나는 정보 (파일명과 내용; hash id)
    • workspace 안 파일의 내용
  • git add . 한 이후 git status 는 아래와 같이 변경됨.
    • Changes not staged for commit => Changes to be committed
  • git add 시, 변경된 정보는 index (staging area) 파일에 저장되며, commit 대기상태가 됨
  • git commit -m '메세지명' => 새로운 commit 에 대한 object가 생성됨
    • 새로운 commit object의 tree 내용과 index의 내용은 일치하게 됨
    • 더 나아가, workspace & staging area(index) & local repository 가 일치하므로, git status 를 할 경우, git은 “nothing to commit” 라는 결과를 보여줄 수 있게 됨.

- Working Directory (work space): 작업할 파일이 있는 디렉토리입니다.

- Staging Area (index, cache) : 커밋을 수행할 파일들이 올라가는 영역입니다.

- Git Directory: Git 프로젝트의 메타 데이터와 데이터 정보가 저장되는 디렉토리입니다. 출처: https://ndb796.tistory.com/187 [안경잡이개발자]


생활코딩 Git 01 - 버전 만들기, 변경사항 확인하기, 과거로 돌아가기

|


버전 만들기(init, status, add, commit)

  • git init : git 초기화. 현재 디렉토리를 버젼 관리한다. git으로 관리하겠다 라는 의미.
  • git status : 현재 폴더의 git 상태 확인
  • git add . 현재 폴더 내 모든 파일에 대한 변경사항을 commit하기 위해 준비. 커밋 대기 상태. . 대신에 특정파일 이름도 가능
  • git commit -m '메시지명' : git에 새로운 버전을 만듬. '' 안은 commit 메세지라고 하며, 자유롭게 작성 가능

git add 라는 단계를 거치는 이유는 선택적으로 파일을 commit 하기 위해서이다. git add 를 커밋 대기 상태일명 stage area라고 함

  • stage: 커밋 대기를 하고 있는 파일들이 가는 곳
  • repository: 커밋이 된 결과가 저장되는 곳(저장소)
  • git 버젼에 대한 이름 & 이메일 정보 설정하기
    git config --global user.name 'Harry Lee'
    git config --global user.email 'sinyo0523@gmail.com'
    
  • git bash 로 파일 조작하기
#파일 생성
vim f1.txt

#알파벳 i 누르면 입력을 할 수 있게 설정이 변경됨.
~
f1.txt [unix] (08:59 01/01/1970)                                        
-- 끼워 넣기 --

#내용 입력 후 esc 누르면 입력이 종료됨.
source : 1
~
~
f1.txt[+] [unix] (08:59 01/01/1970) 

#입력 저장 후 나오기
:wq

#파일 내용 읽기
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth (master)
$ cat f1.txt
source : 1


변경사항 확인하기(log, diff)

  • git log : git에 commit된 버젼에 대한 log를 볼 수 있음
  • git diff '커밋 id1'..'커밋id2' : 버젼과 버젼 사이의 소스코드의 차이점을 확인
  • git diff : git add 하기 전과 add 후의 파일 내용을 비교 할 때 사용.


과거로 돌아가기(reset)

  • git reset '커밋 id' --hard : 해당 버젼으로 돌아감
  • git revert '커밋 id' : 해당 버젼으로 돌아가되, 그 내용을 새로운 버전으로 만드는 명령

TIL (Today I learned) 시작

|

jekyll과 Github을 이용하여 드디어 블로그를 생성해보았다.

네이버나 블로그 등에 포스팅되어있는 글을 통해 몇 시간 동안 시행착오를 겪다가 드디어 jekyll을 이용하여 Github 블로그를 생성하였다.

아직까지 Github 블로그 사용이 미숙하지만 계속해서 다듬으며, 공부한 내용을 정리하여 올리면서 블로그를 알차게 채우고 싶다.