버전관리 git 명령어 사용법 정리

git의 장점 중 하나는 git 서버없이 로컬 상에서도 모든 작업을 할 수 있다는 것이다. 즉 오프라인이라도 작업을 할 수가 있다.

반면에 중앙집중식 버전관리 시스템 (CVCS)은 서버에서 데이터를 관리한다. 클라이언트는 서버에서 Checkout 해서 작업한 후에 작업물을 다시 서버에 Commit 하는 방식이다. 이 방식은 중앙서버에서 실시간으로 협업자들의 상태를 관리할 수 있기 때문에 효율적이기는 하지만 온라인 상에서만 작업이 가능하고 혹시라도 서버에 문제가 생긴다면 프로젝트에 치명적일 수도 있다.

Git은 분산 버전 관리 시스템(DVCS)으로 클라이언트에서 원격 저장소의 내용을 통채로 복사해서 작업할 수 있다. 따라서 오프라인에서 작업이 가능하며 원본 저장소에 문제가 생겨도 다른 저장소의 내용으로 복원이 가능하므로 더 안전하다고 볼 수 있다.

우선 Git을 사용하려면 자신의 컴퓨터에 git을 설치한 후 git 저장소(repository)를 만들기만 하면 된다. git 저장소를 git repository라고 하는데 로컬에 git repository를 만든 후 작업을 하거나 원격에 있는 저장소의 내용을 가져와(clone) 사용할 수도 있다. clone을 하는 것은 해당 저장소를 통채로 복사하는 것이다. 그리고 나중에 작업물을 원격 저장소로 push할 수있다.

이런 모든 작업을 하기 위해서는 git의 개념과 명령어를 정확히 알아야 한다. 

우선 로컬 상에서 작업하는 것을 설명한다.(윈도우10 OS를 중심으로 설명한다.)

git의 설치는 여기에서 다운로드 받아서 하면 된다. 그리고 Git GUI를 사용할 수도 있지만 여기에서는 CLI의 명령어 위주로 설명한다.

우선 시나리오는 이렇다 내 컴퓨터 C:\Myprj 폴더에 abc.txt 파일에 글을 쓰는 중이다. 현재 텍스트 파일에는 "Hello."라는 내용이 입력되어 있다.

저장소 초기화

이제 C:\Myprj의 작업을 git 저장소로 관리해 보자. 

C:\Myprj> git init

위 명령을 내린 후 해당 폴더 내에는 .git이라는 폴더가 생긴다. 폴더명 앞에 .이 붙어 있어서 숨김파일로 되어 있기 때문에 보이지 않는다면 탐색기 -> 파일 -> 옵션 -> 보기 -> 숨김 파일 표시 옵션 선택해주면 된다.

저장소 기본 설정

C:\Myprj> git conifg --list

위 명령을 내리면 git 설정 key들의 목록과 값들이 나온다.

core.symlinks=false

core.autocrlf=true

core.fscache=true

color.diff=auto

color.status=auto

color.branch=auto

.......

user.email=abc@gmail.com

core.repositoryformatversion=0

core.filemode=false

core.bare=false

core.logallrefupdates=true

core.symlinks=false

core.ignorecase=true

user.name=abc

위 키 값 중에 지금은 user.name과 user.email만 설정해 보도록 하자. user.name과 user.email은 작업을 commit한 사람의 정보이므로 꼭 설정해두도록 하자. 나머지는 지금 당장 몰라도 된다.

C:\Myprj> git config user.name "Thrill"

C:\Myprj> git config user.email "Thrill.gmail.com"

이제 user.name과 user.email의 키값을 확인해 보자.

C:\Myprj> git config user.name

Thrill

PS C:\Myprj> git config user.email

Thrill.gmail.com

C:\Myprj>

git config --list는 모든 키와 해당 키값을 보여주는데 위와 같이 하면 개별 키값만 볼 수 있다.

※ 설정이 저장되는 곳

위 설정이 저장되는 곳은 git init 명령으로 만들어진 .git 폴더의 config 파일이다. 

이 파일을 에디터로 열어보면 키들과 키값들을 확인할 수 있다.

그런데 이 config 파일은 Myprj 폴더에 만든 저장소(repository)에만 적용된다. 따라서 다른 저장소를 만들었다면 설정을 또 해야한다. 이럴 때는 다음과 같이 --global 옵션을 주어 한번만 설정해주면 된다.

C:\Myprj> git config --global user.name "Thrill"

C:\Myprj> git config --global user.email "Thrill.gmail.com"

이렇게 --global을 사용하면 C:\Users\MyID(사용자의계정이름)\.gitconfig 파일에 설정이 저장된다.

git 설정은 이렇게 중복이 가능한데 설정을 찾는 순서는 .gitconfig를 먼저 찾고 앞에서 살펴본 .git 폴더의 config파일 찾는다. 그리고 나중에 읽는 것(config)이 적용된다.

Stage Area에 올리고 Commit해보기

git status 명령으로 현재 branch의 상태와 작업 디렉토리, Stage Area 를 알 수 있다. 현재 abc.txt가 Untracked files이라는 뜻이다. 해석해보면 abc.txt가 추적되지 않는 파일이라는 것인데 이것은 현재 작업디렉토리에는 있지만 Stage Area에는 올라가지 않은 파일을 의미한다. commit을해서 git repository에 저장하기 위해서는 우선 Stage Area에 올려놔야 한다. 설명을 읽어보면 git add 명령으로 track 상태, 즉 Stage Area에 올릴 수 있다고 친절히 알려준다.

abc.txt 를 Stage Area에 올려놓은 후 git status 명령으로 상태를 확인한 것이다. 새롭게 stage Area에 올라간 파일이 abc.txt라고 알려준다. 참고로 unstage 하려면 git rm --cached 파일명 을 하면 된다고 설명하고 있다. 

이 명령으로 abc.txt 파일은 untracked file이 되었음을 알 수 있다.

이제 다음 명령으로 abc.txt 파일을 commit을 해보자.

git add --all 은  작업 디렉토리의 모든 새로운 파일 또는 수정된 파일들을 Stage Area에 올리는 명령이다.

git commit -m "커밋 메세지" 명령으로 Stage Area에 새롭게 올라온 파일또는 파일의 변경사항을 commit할 수있다. -m옵션 다음에 오는 메세지에 는 파일의 수정 후 어떤 변화가 있는지를 알수있도록 서술하도록 한다.

branch에 대해서는 나중에 설명하겠지만 master라는 branch가 기본으로 생성되어 마지막으로 commit된 지점의 스냅샷을 가리킨다. 그림으로 그리자면 다음과 같은 형태라 볼 수 있다. *는 현재 작업중이 branch를 의미하며 일종의 포인터라고 볼 수있는데 HEAD라는 식별자로 현재 작업 branch를 알 수 있다.

이제 abc.txt의 내용을 수정한 후에 git status명령을 내려보자.

abc.txt가 수정되어 modified 상태가 되었음을 알려준다. 그런데 abc.txt 파일은 이미 Stage Area에 올라가 있지만 수정된 사항을 commit 하기 위해서는 add 명령어를 사용해서 수정된 사항을 Stage Area에 다시 올려줘야 한다. 이렇게 새롭게 만든 파일이든 수정된 파일이든 commit 하기 전에 add 명령어가 필요하다. 그 전에 어떤 부분이 수정되었는지 diff 명령을 사용해보자.(작업디렉토리와 Stage Area 비교)

--- a/abc.txt 는 수정되기 전의 파일을 의미한다.

+++ b/abc.txt는 수정된 후의 파일을 의미한다.

@@ -1 +1, 2 @@ 에서 -1은 수정되기 전 파일의 1째줄을 의미하고 +1, 2는 수정된 후의 파일의 1째줄부터 2째줄 까지를 의미한다. 해석하자면 수정되기 전 파일의 1째줄이 수정되어 수정된 후 파일의 1줄 부터 2줄로 되었다는 의미다. 그 다음 정보는 수정 전 내용과 수정 후 내용을 비교하여 보여준다.

이제 수정된 내용을 add 한 후에 diff 명령을 내려보면 아무런 반응이 없다. 작업디렉토리와 Stage Area의 abc.txt 파일의 내용이 같기 때문이다.

대신 git diff --cached 명령을 내리면 아까와 같은 정보를 보여준다.

이 둘의 차이점은 git diff는 작업디렉토리와 Stage Area의 차이를 보여주고 git diff --cached는 Stage Area와 git repository의 차이를 보여주는 것이다.

자 이제 commit을 해서 git repository에 저장해 보자. 그리고 지금까지 commit 한 기록(history)를 log 명령어를 통해 확인해보자.

commit 된 시간 그리고 commit 한 사람의 정보와 commit 메세지 commit의 고유 해시값 등을 볼 수 있다. 여기서 우리는 commit의 고유 해시값을 사용해서 해당 시점으로 작업 내용을 변경할 수 있다.

예를들어 현재 abc.txt파일의 내용을 확인해보면 다음과 같을 것이다.

그렇다면 제일 처음 Commit한 시점으로 돌려보자.

방법은 간단하다. checkout 명령 다음에 해당 commit 지점의 해시값을 써주면 되는데 해시값은 대게 고유하기 때문에 모두 다 적을 필요 없이 위와 같이 다른 해시값들과 구별할 수 있을 정도로만 적어주면 된다.

자 이제 abc.txt 파일을 다시 열어보자.

이렇게 해시값으로 commit 지점을 옮겨 다니다보면 헷갈릴 수가 있다. 그래서 우리는 branch를 사용하는데 이 부분은 다음 시간에 설명할 것이다. 그리고 지금까지의 기본내용을 다 이해했다면 git의 핵심은 대부분 이해했다고 보면 된다. 나머지는 기타 명령어들과 개발 프로세스 방법론 등을 익히면 된다.

이 댓글을 비밀 댓글로
    • 손정은
    • 2017.11.15 16:36
    정말 좋은내용 감사드립니다 !! 덕분에 이해하는데 많은 도움이 되었습니다 ^^
    • 오상진
    • 2018.02.02 11:27
    관리자의 승인을 기다리고 있는 댓글입니다