본문 바로가기

Software

Git 사용법 및 다양한 옵션 설명

1 Introduction

본 포스트에서는 Git의 사용법 및 다양한 옵션들에 대해 설명한다. Git은 코드의 추가/변경/삭제 내역을 추적을 위해 널리 사용되는 버전관리 프로그램이다. 본 포스트에서 설명하는 모든 내용은 우분투 18.04 LTS 버전에서 정상적으로 작동하였다.

 


2 Environment setup

Ubuntu 18.04 LTS 환경에서 git는 다음 명령어를 통해 간단하게 설치할 수 있다.

$ sudo apt install git

처음 git을 설치하였다면 commit을 수행했을 때 입력할 작성자의 이름 및 이메일 주소를 설정해야한다. 아래 명령을 터미널에 입력한다.

$ git config --global user.email "your email"
$ git config --global user.name "your name"

위에서 입력한 내용은 ~/.gitconfig 파일에 저장된다.

 

 

 


2.1 Create a new local git project

로컬 컴퓨터에서 특정 프로젝트를 git으로 버전관리하고 싶은 경우 프로젝트의 최상단 디렉토리로 이동한 다음 아래의 명령을 입력한다.

# Go to the root of the project.
$ cd /path/to/project/root

# Make a new git project
$ git init

 

위 명령이 정상적으로 적용되었다면 프로젝트 최상단경로에 .git 폴더가 생성되었을 것이다. 해당 폴더가 생긴 순간부터 파일의 추가/삭제/변경 기록을 자동으로 추적한다.

2.2 Display git branch in terminal

해당 섹션에서는 터미널에서 작업할 때 프롬프트(PS1)에 git branch가 같이 출력되도록 하는 방법에 대해 설명한다. ~/.bashrc 파일을 열고 맨 마지막 라인에 아래 코드를 추가한다.

# In ~/.bashrc
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/'
}

# define colors
C_DEFAULT="\[\033[m\]"
C_YELLOW_NOBOLD="\[\033[0;33m\]"
C_LIGHTRED="\[\033[1;31m\]"
C_LIGHTCYAN="\[\033[1;36m\]"

# w/ username
PS1="${C_LIGHTRED}(user)${C_LIGHTCYAN}\w${C_YELLOW_NOBOLD}\$(parse_git_branch)${C_DEFAULT}\$ "

~/.bashrc 파일을 저장하고 다음 명령을 적용하면 정상적으로 git 프로젝트에 위치했을 때 branch가 표시된다.

$ source ~/.bashrc

2.3 Quick push and pull

git push, pull 명령어를 자주 사용하는 경우 매 순간마다 아이디/비밀번호를 입력해야 한다. 해당 섹션에서는 git credential 기능을 통해 한 번 아이디/비밀번호를 입력하면 특정 시간동안 캐시를 생성하여 빠르게 push, pull을 사용하는 방법에 대해 설명한다.

Credential 기능을 원하는 git 프로젝트의 최상단 경로로 이동한 후 다음 명령어를 입력한다.

# Move to git project.
$ cd /path/to/git/project

# Add credential
$ git config credential.helper "cache --timeout=864000000"

정상적으로 코드가 적용된 경우 git 프로젝트의 .git/config 파일을 열어보면 다음과 같은 구문이 추가되었다.

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/.../...
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[credential]
        helper = cache --timeout=864000000   # <== This part is added.

해당 구문이 정상적으로 추가되었다면 해당 git 프로젝트는 864000000 [s] (= 10000 [days]) 동안 아이디/비밀번호를 추가적으로 입력하지 않아도 빠르게 push, pull 명령을 사용할 수 있다.

2.4 .gitignore 

git 프로젝트들 관리하다보면 특정 폴더나 파일은 git으로 버전관리하고 싶지 않은 경우가 발생한다. 예를 들어, cmake 프로젝트에서 일반적으로 사용하는 build 폴더나 ROS에서 사용하는 build, devel 폴더는 컴퓨터마다 빌드 결과물이 제각각 다르므로 버전 관리를 하지 않아도 된다. 따라서 버전 관리를 원하지 않은 파일/폴더는 .gitignore 라는 파일에 경로를 입력하고 git 프로젝트의 최상단에 위치시키면 자동으로 git에서 .gitignore 파일에 작성된 파일/폴더는 버전 관리 대상에서 제외한다.

아래는 필자가 사용중인 .gitignore 파일의 예시이다. 와일드카드(*)를 사용하면 정규표현식을 사용하여 편하게 원하지 않는 파일들을 목록에서 제외할 수 있다.

build/
devel/
logs/
data/
summaries/
.clangd/

*.pyc
*.zip
*.npy
*.bag
*.tar.gz

.DS_Store
.ycm_extra_conf.py

run*.sh
compile_commands.json

3 Useful features

git에는 많은 명령어들이 존재하지만 해당 섹션에서는 필자가 자주 사용하는 git 명령어들을 위주로 정리하였다.

3.1 command

3.1.1 status

코드의 변경사항을 출력한다.

3.1.2 add

코드의 변경사항을 stage한다

$ git add .                      # 현재 디렉토리 아래에 있는 모든 변경된 파일들을 일괄적으로 stage한다.
$ git add /path/to/specific/file # 특정 파일만 stage한다.

3.1.3 rm

git으로 버전관리 중인 특정 파일을 삭제한다. 터미널의 rm 명령과 유사하다.

$ git rm /path/to/specific/file

3.1.4 diff

코드의 변경사항을 자세히 출력한다. 추가된 코드는 초록색, 제거된 코드는 빨간색으로 나타낸다. 일반적으로 가장 최근의 commit 내역과 비교하여 현재 변경사항을 출력한다

3.1.5 commit

stage 상태의 변경사항들을 저장(commit)한다. Unstage 상태의 변경사항들은 저장하지 않는다. 메세지를 추가하여 해당 저장 내용이 어떤 내용인지 같이 기록할 수 있다. 이 때, 로컬저장소에만 저장하기 때문에 원격저장소는 변경되지 않는다.

$ git commit -m "message here" 

3.1.6 log

commit 기록을 출력한다. 작성자, 이메일, commit 날짜, 메세지 등을 볼 수 있다.

3.1.7 branch

branch 목록을 출력한다. -d, -D 옵션을 사용하는 경우 branch를 제거할 수 있다.

$ git branch  # Show branch list.
$ git branch -d {branch name}   # Delete a branch.
$ git branch -D {branch name}   # Force deletion of branch.

3.1.8 checkout

특정 commit 내역을 불러오거나 특정 branch로 이동한다. checkout만 사용하는 경우 현재 branch를 최신 commit 내역으로 새로고침한다. 일반적으로 다음과 같은 3가지 사용 예시들이 존재한다.

$ git checkout   # Refresh current branch's latest commit.
$ git checkout {commit hash}  # Go to specific commit history.
$ git checkout {branch name}  # Go to specific branch.

또한 위와 같이 -b 옵션을 사용하여 새로운 branch를 생성할 수 있다. 이 때, 새로 생성된 branch는 현재 사용중인 branch로부터 생성된다. 즉, 현재 branch의 모든 코드가 새로운 branch로 복사된다.

3.1.9 reset

stage 또는 commit 내역을 복원 또는 실행취소한다.

3.1.9.1 Revert recent commit

commit된 변경사항을 취소한다. 즉, 이전 commit 내역으로 되돌아간다. 이 때 가장 최신 commit 내역을 HEAD 라고하며 HEAD 에서 n번째 이전의 commit 내역은 HEAD

# 과 같이 표현한다. 현재 commit 내역을 취소하고 바로 직전의 commit으로 돌아가고 싶은 경우 HEAD

1 을 입력하면 된다.

3.1.9.2 Revert recent stage

위와 같이 stage된 변경사항을 unstage로 변경할 수도 있다. 가장 최근 commit 내역 (HEAD) 의 모든 내용을 복원하므로 이전의 모든 stage된 내역들이 취소된다.

3.1.10 merge

특정 branch를 현재 branch에 병합한다. 특정 branch의 commit 내역들이 현재 branch에 덮어쓰기된다.

3.1.11 mergetool

3.1.11.1 merge conflict 해결법

만약 두 branch 모두 동일한 파일을 변경한 commit 내역이 있는 경우 Merge Conflict가 발생한다. Merge conflic가 발생했을 경우 meld 와 같은 병합툴을 사용하여 해결할 수 있다. 우선 meld 를 설치한 후 아래 명령어를 입력한다.

# Install meld
$ sudo apt install meld

# Dealing with merge conflict
$ git mergetool meld /path/to/specific/file
$ git mergetool meld .  # All merge conflicts.

3.1.12 clone

원격저장소를 로컬 컴퓨터에 다운로드한다. Private 저장소를 clone하는 경우 아이디와 비밀번호를 입력해야 한다. Github 뿐만 아니라 Bitbucket, Gitlab 등 다양한 저장소의 url을 입력하면 다운로드받을 수 있다.

$ git clone {repository url}

3.1.13 push

로컬저장소의 commit 내역을 원격저장소로 업로드한다. 일반적으로 원격저장소로 push할 때는 원격을 의미하는 origin 키워드를 붙인다.

$ git push origin {branch name}

3.1.14 pull

원격저장소의 commit 내역을 로컬저장소로 다운로드한다.

$ git pull origin {branch name}

4 References

  1. 자주 사용하는 기초 Git 명령어 정리하기 - pks2974 blog