일공이의 IT노트

[Git & GitHub] 깃으로 버전을 관리하는 방법과 원리 총정리(1) 본문

Work Tools/Git & GitHub

[Git & GitHub] 깃으로 버전을 관리하는 방법과 원리 총정리(1)

일공ILGONG 2021. 1. 13. 00:04
이 글은 'Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문' 교재를 참고하여 정리한 내용입니다.

 

 

목차

목차를 클릭하면 해당 게시글로 더 빠르게 접근할 수 있습니다.

 

 

깃의 가장 기본이자 중요한 기능은 버전을 관리하는 것이다. '버전'은 문서를 수정할 때마다 깃에서 간단한 메모와 함께 수정 내용을 저장하는 것을 말한다. 이렇게 문서를 수정하면서 수정 내용을 버전으로 저장하는 방법과, 저장한 버전을 사용해 이전 내용으로 되돌리는 방법을 살펴보도록 한다.

 

 

 

깃 저장소 만들기

저장소를 만들고 싶은 디렉터리로 이동하여 깃을 초기화하면 그때부터 해당 디렉터리에 있는 파일들을 버전 관리할 수 있다.

 

홈 디렉터리에 hello-git이라는 디렉터리를 만들고 나서 cd명령을 이용해 hello-git 디렉터리로 이동한다.

$ mkdir hello-git

$ cd hello-git

 

이 디렉터리에 저장소를 만들기 위해 git init 명령을 입력하여 깃을 사용할 수 있도록 디렉터리를 초기화한다.

$ git init

Initialized empty Git repository in C:/Users/soyeonh/hello-git/.git

 

ls 명령을 사용해서 디렉터리 안에 '.git'이라는 디렉터리가 생긴 것을 확인한다. 이 디렉터리가 깃을 사용하면서 버전이 저장될 '저장소(repository)'이다.

$ ls -la

total 16

drwxr-xr-x drwxr-xr-x 1 LG 197121 0 Jan 11 20:48 ./
drwxr-xr-x 1 LG 197121 0 Jan 11 20:46 ../
drwxr-xr-x 1 LG 197121 0 Jan 11 20:48 .git/

 

 

 

 

버전 만들기

깃에서 버전이란 흔히 알고 있듯이 문서를 수정하고 저장할 때마다 생기는 것이라고 생각하면 쉽다.

 

깃과 같은 버전 관리 시스템을 이용하여 버전을 관리하면 원래 파일 이름은 그대로 유지하면서 파일에서 무엇을 변경했는지를 변경 시점마다 저장할 수 있다. 또 각 버전마다 작업했던 내용을 확인할 수 있고, 그 버전으로 되돌아갈 수도 있다.

 

스테이지와 커밋 이해하기

깃에서 버전을 만드는 단계는 다음과 같이 이루어져 있다.

 

 

작업 트리(working tree)

작업 트리는 파일 수정, 저장 등의 작업을 하는 디렉터리로, '작업 디렉터리(working directory)'라고도 한다. 앞에서 만들었던 hello-git 디렉터리가 작업 트리가 된다. 즉, 우리 눈에 보이는 디렉터리이다.

 

스테이지(stage)

스테이지는 버전으로 만들 파일이 대기하는 곳이다. 스테이지 영역(staging area)이라고 부르기도 한다.

 

저장소(repository, 리포지토리)

저장소는 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳이다.

 

 

스테이지와 저장소는 눈에 보이지 않는다. 깃을 초기화했을 때 만들어지는 .git 디렉터리 안에 숨은 파일 형태로 존재하는 영역이다. 

 

먼저 작업 트리에서 문서를 수정한 후 수정한 파일 중 버전으로 만들고 싶은 것을 스테이지에 저장한다. 그리고 스테이지에 있던 파일을 저장소로 커밋(commit)하면 새로운 버전이 생성된다.

 

 

작업 트리에서 빔으로 문서 수정하기

앞서 생성한 hello-git 디렉터리에서 깃 상태를 확인하기 위해 다음과 같이 입력할 수 있다.

$ git status

On branch master

 

No comits yet

 

nothing to comit (create/copy files and use "git add" to track)

 

각 메시지의 의미

  • On branch master : 현재 master 브랜치에 있습니다.
  • No commits yet : 아직 커밋한 파일이 없습니다.
  • nothing to commit : 현재 커밋할 파일이 없습니다.

 

hello-git 디렉터리에 빔으로 새로운 파일을 만든다.

$ vim hello.txt

 

빔 화면이 나타나면 I 또는 A를 눌러 입력 모드로 전환한 후 아무거나 입력하고 나서, Esc를 눌러 ex 모드로 돌아가 ':wq'를 입력하고 Enter를 누르면 수정한 문서를 저장하고 편집기를 종료한다.

 

터미널 창으로 돌아와 ls -la 명령을 입력하면 방금 만든 hello.txt 파일이 디렉터리 안에 들어있는 것을 확인할 수 있다. 

 

$ ls -la

total 21

drwxr-xr-x drwxr-xr-x 1 LG 197121 0 Jan 11 20:48 ./ 
drwxr-xr-x 1 LG 197121 0 Jan 11 20:46 ../ 
drwxr-xr-x 1 LG 197121 0 Jan 11 20:48 .git/

-rw-r--r-- 1 LG 197121 2 Jan 11 22:12 hello.txt

 

 

수정한 파일을 스테이징 하지 않은 채 깃의 상태 확인

$ git status

On branch master

 

No commits yet

 

Untracked files

...

 

  • Untracked files : 아직 한번도 버전 관리하지 않은 파일

 

 

수정한 파일을 스테이징(staging)하기

git add 명령을 통해 스테이징할 수 있다.

$ git add hello.txt

 

git status

On branch master

 

No commits yet

 

Changes to be committed:

...

             new file: hello.txt

 

 

 

위와 같이 뜨면 hello.txt가 성공적으로 스테이지에 추가된 것이다.

 

 

스테이지에 올라온 파일 커밋(commit)하기

깃에서 버전을 만드는 것을 간단히 '커밋(commit)한다'고도 말한다. -m 옵션으로 커밋과 함께 저장할 커밋 메시지를 적을 수 있다.

 

$ git commit -m "message1"

[master (root-commit) ac5b4fa] message1

1 file changed, 1 insertion(+)

create mode 100644 hello.txt

 

깃 상태는 다음과 같이 변한다.

 

$ git status

On branch master

nothing to commit, working tree clean

 

버전이 제대로 만들어졌는지 확인하기 위해 git log 명령을 사용하여 저장소에 저장된 버전을 확인한다.

 

$ git log

commit   ...   (HEAD -> master)

Author: soyeonh <soyeonh@gmail.com>

Date:    Mon Jan 11 22:24:32 2021 +0900

 

     message1

 

 

이렇게 뜬다면 스테이지에 있던 hello.txt 파일의 버전이 성공적으로 저장소에 만들어진 것이다.

 

 

스테이징과 커밋 한꺼번에 처리하기

commit 명령에 -am 옵션을 사용하면 스테이지에 올리고 커밋하는 과정을 한꺼번에 처리할 수 있다. 

 

단, 이 방법은 한 번이라도 커밋한 적이 있는 파일을 다시 커밋할 때에만 사용할 수 있다.

 

빔에서 hello.txt 파일을 열어 내용을 추가한 후, 다음과 같이 commit 명령에 -am 옵션을 붙여서 스테이징과 커밋을 한꺼번에 처리한다.

 

$ git commit -am "message2"

 

 

 

 

커밋 내용 확인하기

버전을 확인하기 위해서 지금까지 어떤 버전을 만들었고, 또 각 버전마다 어떤 차이가 있는지 파악해야 한다.

 

 

커밋 기록 자세히 살펴보기 - git log

git log 명령을 입력하면 지금까지 만든 버전이 화면에 나타나고, 각 버전마다 설명도 함께 나타난다.

 

 

 

변경 사항 확인하기 - git diff

  • 작업 트리에 있는 파일과 스테이지에 있는 파일 비교
  • 스테이지에 있는 파일과 저장소에 있는 최신 커밋을 비교