Git 기초 명령어와 사용법 정리

Git 이란

Git이 보편화 되기 전에는 Git에 대한 개념을 잡기조차 어려웠습니다. 하지만, 요즘에는 모든 프로젝트에 형상관리 개념은 기본입니다. 개발자 분들은 익히 아시다시피 프로젝트라는 것이 뚝딱뚝딱 한번에 ‘짠~!’ 하고 만들어지는 것이 아니죠. 잘 돌면 잘 도는대로 ‘뭐지? 왜 버그가 없지?’ 라는 생각이 들고, 안 돌면 ‘그래 버그 하나쯤은 당연히 있겠지.’ 라는 생각이 듭니다. 이처럼 프로젝트를 완성하는 과정은 무수한 기능 구현과 기능 검증 및 버그 수정 과정을 거칩니다. 그 과정에 프로젝트 개발물에 관한 관리 체계가 절실히 필요합니다. 버그 수정에 대한 이력관리와 때로는 이전 버전으로의 회귀 등 다양한 중간 과정이 필요합니다. 형상관리는 프로젝트에 있어서 없어서는 안 될 존재죠. Git은 이런 형상관리를 돕는 Tool 입니다. 다양한 기능을 제공하기 때문에 선뜻 다가서기 힘들지만, 가볍게 쓸 수도 있습니다. 이 포스트에는 Git의 간단한 기능들을 정리해 보도록 하겠습니다.

형상관리의 시작, 파일의 상태

Git에서 관리하는 소스 파일들은 Modified, Staged, Commited의 세 가지 형태를 갖습니다.

Modified

수정만 하고 Stage나 커밋하지 않은 상태

Staged

현재 수정한 파일을 곧 커밋할 것이라고 표시

Commited

파일이 로컬에 저장된 상태

untracked 파일은 Git에서 관리하지 않는 등록되지 않은 파일들을 나타냅니다. tracked는 Git에서 관리가 되는 등록된 파일입니다.

사용법

저장소 만들기

새로운 프로젝트를 생성하기 위해서는 Git 초기화 작업이 필요합니다.

warnus@seedtale:~$ mkdir test_project
warnus@seedtale:~$ cd test_project/
warnus@seedtale:~/test_project$ git init
Initialized empty Git repository in /home/warnus/test_project/.git/
warnus@seedtale:~/test_project$ ls .git/
branches  config  description  HEAD  hooks  info  objects  refs
warnus@seedtale:~/test_project$

위에서와 같이 ‘git init’ 명령을 수행하면 프로젝트 디렉토리에 .git 디렉토리가 생기며, 해당 디렉토리 안에는 git에서 사용되는 다양한 디렉토리와 파일들이 생성됩니다.

소스 변경 상태 확인

hello 라는 새로운 파일을 생성해 봅시다.

warnus@seedtale:~/test_project$ echo "Hello Git World" > hello
warnus@seedtale:~/test_project$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hello

nothing added to commit but untracked files present (use "git add" to track)
warnus@seedtale:~/test_project$

‘git status’ 명령으로 변경 상태를 확인하면 위와 같이 Untracked files에 hello가 보입니다. 아직 Git 관리에 등록되지 않은 파일입니다.

파일 추가

위에서 생성한 파일을 Git에서 관리가 가능하도록 추가해 봅시다.

warnus@seedtale:~/test_project$ git add hello
warnus@seedtale:~/test_project$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   hello

warnus@seedtale:~/test_project$

‘git add hello’를 실행하면 위와 같이 hello가 new file로 등록되었음을 알 수 있습니다. 곧 commit 할 것이라는 staged 상태가 된 것입니다.

커밋

Git 관리에 hello가 포함되도록 commit 하도록 합니다. commit 할 때는 일반적으로 변경 사항에 대한 이력 관리를 위해 commit message라는 것을 적습니다. 어떤 변경 사항이 포함된 것인지 자세히 기술하는 것 입니다. 우리는 단순한 테스트 이므로 -m 옵션을 사용하여 짧막한 메시지를 적겠습니다.

warnus@seedtale:~/test_project$ git commit -m "Add hello file"
[master (root-commit) 3662dfe]
 Add hello file  1 file changed, 1 insertion(+)  create mode 100644 hello warnus@seedtale:~/test_project$ git status On branch master nothing to commit, working tree clean warnus@seedtale:~/test_project$ git log commit 3662dfe12018ba9411ac410c39838e2bf0a63214 Author: Wooseung Lee <email@email.com> Date:   Thu Feb 2 23:12:54 2017 +0900     Add hello file warnus@seedtale:~/test_project$ 

‘git commit’ 명령을 사용하여 커밋을 완료 하고 커밋 내역을 확인하면 위와 같은 결과를 확인할 수 있습니다. 이제 hello는 Git에서 관리하는 파일이 되었으며 버전 관리가 시작 된 것입니다.

리모트 저장소

소규모 개인 프로젝트로 로컬 환경에서만 형상관리를 할 때도 있지만, 일반적으로 협업을 위해 형상관리를 합니다. 내가 작업한 내역을 바로 올리고 다른 사람이 해당 작업 내역을 확인하여 전체 프로젝트가 항시 최신 변경 상태로 진행이 가능하도록 하는 것이죠. 이를 위해 Git은 리모트 저장소를 사용합니다. Git 서버가 있고 해당 서버로 로컬에 저장된 내용을 업데이트 하는 것입니다. 다른 개발자는 이 업데이트 내역을 끌어와 자기 로컬 소스와 합쳐서 계속적인 개발을 수행하는 것이죠.

저장소 등록

로컬 프로젝트에 Git 서버로 사용될 저장소를 등록해 봅시다.

warnus@seedtale:~/test_project$ git remote add origin http://vlee.kr/git/warnus/test_project.git
warnus@seedtale:~/test_project$ git remote -v
origin http://vlee.kr/git/warnus/test_project.git (fetch)
origin http://vlee.kr/git/warnus/test_project.git (push)
warnus@seedtale:~/test_project$ git push -u origin master
Username for 'http://vlee.kr': yourid
Password for 'http://warnus@vlee.kr': yourpassword 
To http://vlee.kr/git/warnus/test_project.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
warnus@seedtale:~/test_project$

위와 같이 로컬에 있는 프로젝트를 Git 서버로 올리는 것이 가능합니다. 다만, 주의해야할 점은. 서버 저장소는 Git 서버 관리자가 이미 등록해 놓은 저장소라는 것입니다. 아무 위치나 막 저장소로 등록하여 사용 가능한 것이 아닙니다. 본 테스트에는 안 나와있지만 test_project.git 이라는 저장소는 제가 미리 만들어 놓은 저장소입니다.

태그(tag) 사용법

태그 생성

$ git tag -a new_tag -m "Release new tag"

태그 푸시

$ git push origin --tags

태그 삭제

$ git tag -d new_tag

원격 저장소 태그 삭제

$ git push origin :new_tag

모든 branch pull / push

$ git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
$ git fetch --all
$ git pull --all

한방에 해보는 Git 튜토리얼 예제

아래 튜토리얼은 일련의 Git 활용 과정을 주욱 늘어놓은 것입니다.

$ mkdir newprj
$ cd newprj
$ git init                         // git 로컬 저장소 생성
$ touch file1, file2, file3        
$ git status                       // 변경 이력 확인
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# file1
# file2
# file3
nothing added to commit but untracked files present (use "git add" to track)
$ git add .
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
# new file:   file1
# new file:   file2
# new file:   file3
#
$ git commit -m "Added file1, file2, file3"
$ git remote add origin http://vlee.kr/git/warnus/newprj.git
$ git push origin master
$ touch file4
$ git add .
$ git commit -m "Added file4"
$ git push

위 과정에서는 아래 그림과 같이 file1, file2, file3을 한 commit으로 추가하고, 다음으로는 file4를 추가하였습니다. 별도의 branch는 없으며 모두 master branch에 올려져 있습니다.

$ git branch testdev
$ git branch
* master
  testdev
$ git checkout testdev
$ git branch
  master
* testdev
$ touch branchfile1
$ git add .
$ git commit -m "Added branchfile1"
$ git push origin testdev

이번에는 testdev라는 branch를 생성하였습니다. 그리고 testdev로 branch를 옮기고 branchfile1이라는 파일을 커밋하였습니다. 아래 그림과 같이 아직 branch가 생성된 후로 master에 변화가 없으므로 branch가 갈라지진 않았습니다.

$ git log
$ git checkout master
$ git log
$ touch masterfile1
$ git add .
$ git commit -m "Added masterfile1"
$ git push

이번엔 다시 master branch로 옮기고 masterfile1이라는 파일을 master branch에 커밋하였습니다. 아래 그림처럼 testdev와 갈라진 master branch를 확인 할 수 있습니다.

$ git merge master testdev
$ git push

마지막으로 testdev의 변경 내용(branchfile1)을 master branch와 merge 합니다.

참고

Leave a Reply