본문으로 바로가기

Git 저장소 생성 및 커밋 ( init / add / commit )

category Program/Git 2019. 10. 19. 17:39

 개요


깃 (Git) 의 장점중 하나는 대부분의 명령을 로컬에서 실행한다는 점입니다. 

원격 저장소(remote Repository) 의 정보가 필요한때만 (pull push 등) 네트워크가 필요하고 그 외에는 오프라인 환경에서도 commit 이 가능 합니다.

이는 다른 SVN 같이 중앙서버에서 관리하는 VCS (version control system) 에서는 불가능한데 이 차이가 깃을 사용하다 보면 꽤 편리하게 다가옵니다.


그럼 이번 포스팅에서는 간단하게 로컬 저장소( Local Repository )를 생성하여 변경이력을 커밋을 해보도록 하겠습니다. 

Git 설치 및 세팅에 대한 설명은 이전 포스팅을 참고해 주세요.

Git 설치 및 기본 설정하기 ( macOS / Windows 깃 설치 )



 Git 저장소 생성 ( git init )


먼저 로컬 저장소로 사용할 폴더를 생성하여 해당 폴더로 이동합니다. 저는 tutorial 이라는 이름의 폴더를 사용하겠습니다.

해당 폴더(tutorial)로 이동 후 git init 명령어를 실행하면 새로운 저장소가 생성 됩니다.

$ git init
Initialized empty Git repository in /Users/jihun/git/tutorial/.git/

위 명령어를 실행하면 저장소 구성을 위한 .git 폴더가 생성되며 이 폴더에는 프로젝트 관리를 위한 파일 들과 해당 프로젝트에만 적용할 config 파일 등이 들어있습니다.

해당 프로젝트에 별도 설정이 되어 있지 않다면 이전에  git config --global 옵션으로 설정했던 정보들을 사용합니다.


 파일 상태 확인 ( git status )


git status 명령어를 이용해 현재 저장소내 파일들의 상태를 확인해 볼 수 있습니다.

$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
on brach master는 현재 작업중인 브랜치를 의미합니다. 
기본 브랜치로 "master"를 사용하기 때문에 master로 표기되고 있습니다.
그리고 이제 막 저장소를 생성했기 떄문에 아무런 commit 내역이 없음을 표기해 주고 있네요

 인덱스에 파일 추가 > Stage ( git add )


그럼 해당 폴더에 "test.txt" 파일을 만들어 저장소에 등록 해 보도록 하겠습니다. 

$ ls
test.txt
$ git status
On branch master
No commits yet
Untracked files:
  (use "git add ..." to include in what will be committed)
        test.txt
nothing added to commit but untracked files present (use "git add" to track)

새로 생성한 test.txt 파일이 이력관리 대상에 포함 되지 않은 Untracked files 목록에 표기되는 것을 확인 할 수 있습니다.


Git의 Repository 구조는 크게 세가지로 구성되어 있습니다.

작업폴더(Working directory) > 인덱스(Staging Area) > 저장소(Head -Repository) 


우리가 작업하는 폴더를 작업트리(Working directory) 라고 부르며 commit을 실행하기 전에 작업트리와 저장소 사이에 존재하는 가상의 준비 영역(Staging Area)을 인덱스(Index)라고 합니다.

저장소에 commit하기 위해서 먼저 추가(Untracked files) 및 변경(Modified files) 하고자 하는 파일을 먼저 인덱스에 기록(Stage)하고 이후 스테이징된 목록만 최종적으로 commit 명령어에 의해 저장소에 공개하게 됩니다.


그럼 git add [파일명] 명령을 이용하여 예제의 "test.txt" 파일을 인덱스에 스테이지 한 뒤 상태를 다시 한번 확인해 보겠습니다. 

$ git add test.txt
$ git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   test.txt

test.txt 파일이 인덱스(Staging Area)에 포함 된 것을 확인 할 수 있습니다.

'Changes to be committed' 목록에 있는 파일은 Staged 상태라는 것을 의미 합니다.


추가하려는 파일이 많을 경우 git add . 명령을 이용하면 해당 폴더의 Untracked Files 모두를 한번에 stage 하는 것이 가능합니다. 
인덱스에 추가된 파일을 제외하려면 git rm --cached 명령을 사용합니다. 
$ git rm --cached test.txt
rm 'test.txt'
$ git add .


 변경사항 확정 ( git commit )


마지막으로 git commit -m [설명] 명령을 실행하여 "test.txt" 파일을 HEAD에 적용해 보도록 하겠습니다.

참고로 git commit -a옵션을 사용하면 스테이징 절차(add)를 생략하고 바로 add와 commit을 동시에 하는 것도 가능합니다. 

$ git commit -m "first commit"
[master (root-commit) ec72682] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

$ git log
commit ec72682f07e02f85648bfb7afb82fd097655f08f (HEAD -> master)
Author: JihunPark <ongamenet87@gmail.com>
Date:   Wed Oct 23 14:50:53 2019 +0900

    first commit

$ git status
On branch master
nothing to commit, working tree clean

commit 후 git log 명령을 실행해 보면 commit history 가 정상적으로 남은 것을 볼 수 있습니다.


"ec72682f07e02f85648bfb7afb82fd097655f08f"  값은 commit 할 때 SHA-1 해시를 사용하여 만들어진 40자 길이의 16진수 체크섬(hash) 데이터로, git에서 사용하는 가장 기본적인 원자 데이터입니다.  이후 데이터에 문제가 생겼을 경우 위 데이터(version)를 기준으로 다시 해당 시점으로 되돌아 오거나 할 수 있습니다.


Author 영역의 이름과 이메일 주소는 git config 명령을 통해 세팅했던 user.name / user.email 값이 표기되며 

하단에 commit시 -m 옵션을 통해 남겼던 해당 확정본에 대한 설명이 기재됩니다.


이후 다시 git status 명령을 실행해 저장소의 상태를 확인해 보면 모든 변경내용이 적용되어 저장소와 워킹트리가 동기화 되었음을 알 수 있습니다.


그럼 지금까지 간단하게 저장소를 생성하여 커밋해 봤습니다.  


간단하지만 많은 개발자 분들이 실무에서 git을 처음 사용하게 될경우 IDE세팅하면서 바로 원격 저장소에서 cloning 한 뒤 GUI tool 에서 사용하시기 떄문에 SVN(subversion)같은 다른 VCS를 먼저 접하셨던 분들은 기본 개념이 조금 헷갈릴 수 있는 내용 이었습니다. (제가 그랬어요 ㅜㅜ)


그럼 다음 포스팅에서는 다른 원격 저장소(Gitgub)를 복제 하고(Clone) 다른 사람의 변경 이력을 가져오거나 (PULL) 로컬 저장소에 적용한 내용을 원격저장소에 적용(Push) 해보도록 하겠습니다.


 Reference

https://backlog.com/

https://rogerdudler.github.io/git-guide/index.ko.html