'깃(Git)'이란 컴퓨터의 많은 문서(특히, 많은 버전으로 작성되는 문서)를 보다 편리하고 직관적으로 관리할 수 있게 해주는 프로그램입니다. 깃의 핵심 기능은 크게 3가지 기능을 제공하며, '버전 관리', '백업', '협업'으로 정리할 수 있습니다.
이 글에서 말하는 '깃'은 흔히 아는 웹 서비스로 제공되는 '깃 허브'가 아닌, '커맨드 라인 인터페이스(Command Line Interface, CLI)'라는 터미널 창에 직접 명령어 입력을 통해 사용하는 방식으로 이용이 가능한 '깃 배시(Git Bash)'를 의미합니다. 이 깃 배시는 기본적인 리눅스 명령과 깃 명령을 알아야 하기 때문에 비교적 어렵지만, 익숙해지면 훨씬 빠르게 깃을 다룰 수 있습니다. 그리고 주로 사용하는 리눅스와 깃의 명령어를 필요할 때마다 검색 혹은 책을 뒤지는 수고를 덜기 위해 이 글을 통해 정리하고 익히고자 작성합니다.
추가로 운영체제가 윈도우일 때 깃 배시이며, 맥이라면 터미널 창을 통해 아래 명령어를 입력합니다.
1. 리눅스 명령어
우선, 깃을 사용하면서 필수적으로 알고, 사용해야 하는 일부 리눅스 명령어만 정리했습니다.
명령어 | 설명 | 줄임말 또는 옵션 |
$ pwd | 현재 위치의 경로를 표시합니다. ~(물결 표시)는 홈 디렉터리를 의미합니다. |
'print working directory'의 줄임말. |
$ ls | 현재 디렉터리에 있는 파일, 디렉터리 목록을 표시합니다. | 'list'의 줄임말. 옵션은 아래와 같습니다.(함께 표기도 가능 ex) -la, -al) -l: 파일과 디렉터리의 상세 정보 표시 -a: 숨긴 파일과 디렉터리 표시 -r: 파일의 정렬 순서를 거꾸로 표시 -t: 파일 작성 시간 순(내림차순)으로 표시 |
$ cd 디렉터리명 | 터미널 창에서 디렉터리 사이를 이동합니다. 추가로 아래 기호는 약속된 기호이므로, 꼭 기억해야 합니다. ./: 현재 사용자가 작업 중인 디렉토리 ../: 현재 디렉터리의 상위 디렉터리 |
'change directory'의 줄임말. ..(마침표 2개): 상위 디렉터리로 이동. ~: 홈 디렉터리로 이동. |
$ mkdir 디렉터리명 | 현재 디렉터리 안에 하위 디렉터리를 만듭니다. | 'make directory'의 줄임말. |
$ rm 디렉터리명 | 디렉터리를 삭제합니다. 단, 하위 디렉터리가 있을 경우엔 '-r' 옵션을 함께 작성해야 삭제가 가능합니다. | 'remove'의 줄임말. 옵션 -r: 하위 디렉터리와 파일까지 함께 삭제 |
$ cat 텍스트파일명.txt | 터미널 창에서 간단히 텍스트 문서의 내용을 표시합니다. | 'concatemate'의 줄임말. |
$ vim 텍스트파일명.txt | 현재 디렉터리에서 해당 텍스트 파일을 열거나, 없을 경우엔 새로 생성합니다. | vim이란 편집기 종류 중 하나. |
2. 깃(Git) 명령어
1) 깃 환경 설정 & 저장소 만들기
명령어 | 설명 | 비고 |
$ git | 깃 명령에서 사용할 수 있는 여러 옵션 표시합니다. | |
$ git config --global user.name "사용자 이름" | 깃을 사용하는 사용자 이름을 설정합니다. | |
$ git config --global user.email "사용자 이메일" | 깃을 사용하는 사용자 이메일을 설정합니다. | |
$ git config --global core.editor "편집기 이름" | 깃의 기본 편집기를 설정합니다. 기본 편집기에는 vim, notepad++ 등이 있습니다. | |
$ git init (디렉터리명) | 디렉터리명에 해당하는 디렉터리를 깃 저장소로 지정하고, 없을 경우 새로운 깃 저장소로 디렉터리를 생성합니다. 디렉터리명 없이 명령어만 입력하는 경우에는 현재 위치하는 디렉터리를 깃 저장소로 지정 및 초기화합니다. 깃 저장소로 지정할 디렉터리를 생성 및 들어간 후, 지정할 디렉터리 내에서 명령을 해야 합니다. 초기화 명령을 실행하면 디렉터리 내에 숨겨진 폴더로 '.git' 디렉터리가 생성됩니다. |
2) 버전 생성 관련
깃은 <작업 트리(working tree)> - <스테이지(stage)> - <저장소(repository)>라는 3가지 영역, 단계를 통해 한 파일에 대해 여러 번 수정하며 생성된 버전들을 생성합니다. 작업 트리(혹은 작업 디렉터리, working directory)란 파일 수정, 저장 등의 작업을 하는 디렉터리, 스테이지(혹은 스테이징 영역, staging area)는 버전으로 만들 파일이 대기하는 영역, 저장소는 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳입니다. 여기서 스테이지와 저장소는 눈에 보이지 않고, .git 디렉터리 안에 숨은 파일 형태로 존재하는 영역입니다.
명령어 | 설명 | 비고 |
$ git status | 깃 상태를 표시합니다. branch master와 같은 현재 디렉터리, 스테이징이 안 된 파일 혹은 여부, 커밋이 안 된 파일 혹은 여부 등을 표시합니다. | 파일은 아래와 같이 4가지 상태가 있습니다. 1. untracked: 브랜치가 지정되지 않고, 스테이지에 추가(add)가 한 번도 되지 않은 상태(git을 적용할 파일 명단에 아직 기재되지 않은 상태라고 보면 됩니다.) 2. unmodified: 아직 수정이 안 된 상태(버전을 만들 필요가 없는 상태) 3. modified: 수정이 완료된 상태 4. staged: 수정 후, 스테이징(add)까지 완료된 상태(commit만 남은 상태) |
$ git add 파일명.확장자 | 작업 트리에서 수정한 파일을 스테이지에 추가합니다. '스테이징' 또는 '스테이지에 올린다'라고 표현합니다. 파일명 대신 .(마침표)를 작성하면 해당 저장소에서 수정된 파일을 한꺼번에 스테이지에 올릴 수 있습니다. |
CRLF 관련 경고 메시지가 뜨지만, 따로 조치할 필요는 없습니다. |
$ git commit -m "커밋 메시지" | 버전을 만듭니다. 스테이지에서 저장소로 저장하는 역할을 하며, 수정 사항 또는 버전에 대한 정보를 메시지로 함께 저장합니다. | 'git commit'만 입력한다면, 다시 메시지까지 입력하라는 다른 화면이 띄워집니다. |
$ git commit -am "커밋 메시지" | git add와 git commit 명령을 한 번에 처리합니다. 단, 한 번이라도 커밋한 적이 있는 파일인 경우에만 가능합니다. | 옵션 --amend: 가장 최근의 커밋 메시지를 수정합니다. |
$ git log | 지금까지 만든 버전, 각 버전에 대한 설명(커밋 메시지)을 표시합니다. 커밋 해시(각 버전에 대한 일종의 식별 번호), 작성자, 버전 생성 시각, 커밋 메시지, 최신 버전 여부 등을 알 수 있습니다. | 옵션 --stat: 커밋에 관련된 파일까지 함께 표시합니다. --oneline: 한 줄에 한 커밋씩 간략하게 표시합니다.(각 브랜치와 브랜치별 최신 커밋 등) --branches: 각 브랜치의 커밋을 표시합니다. 주로 oneline 옵션과 함께 쓰입니다. --graph: 직관적으로 보이도록 그래프 형태로 표시합니다. branches 옵션과 함께 쓰면 유용합니다. |
$ git diff | 변경 사항, 수정 사항을 표시합니다. 어떤 부분이 지워지고, 어떤 부분이 새로 쓰였는지 등을 알 수 있습니다. |
3) 작업 되돌리기
명령어 | 설명 | 비고 |
$ git checkout -- 파일명.확장자 | 파일 수정 후, 수정한 내용을 취소하고 가장 최신 버전 상태로 되돌립니다. 단, 이 때 되돌린 내용은 다시 복구할 수 없습니다. | 작업 트리에서 수정한 내용을 되돌리고 싶을 때 |
$ git reset HEAD 파일명 | 수정된 파일을 스테이징했을 때, 스테이징을 취소합니다. | 작업 트리 -> 스테이지로 갔을 경우, 다시 작업 트리로 되돌리고 싶을 때 |
$ git reset HEAD^ | 가장 마지막에 한 커밋을 취소합니다. 최근 n개의 커밋을 취소하려면 '^' 대신 '~n'을 입력하면 됩니다. ex) 최근 2개의 커밋을 취소할 경우: $ git reset HEAD~2 |
스테이지 -> 저장소로 갔을 경우, 다시 작업 트리로 되돌리고 싶을 때 $ git reset 자체에 대한 옵션은 다음과 같습니다. 1. --soft HEAD^: 최근 커밋을 하기 전 상태로 작업 트리로 되돌립니다. 2. --mixed HEAD^: 최근 커밋과 스테이징을 하기 전 상태로 작업 트리로 되돌립니다. 옵션 없이 reset 명령을 사용할 경우의 기본값입니다. 3. --hard HEAD^: 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리로 되돌리고, 되돌린 내용은 복구할 수 없습니다. |
$ git reset --hard 복사한 커밋 해시 | '복사한 커밋 해시'로 되돌리고, 그 이후의 버전(커밋)들은 삭제합니다. | 둘의 차이는 '복사한 커밋 해시로 되돌리느냐, 복사한 커밋 해시를 취소하느냐'입니다. 그리고 reset 명령어는 아예 삭제하지만, revert 명령어는 삭제하지 않고 남겨두면서 되돌립니다. |
$ git revert 복사한 커밋 해시 | '복사한 커밋 해시'에 해당하는 버전(커밋)을 취소하고, 그 이전의 버전으로 되돌립니다. 단, 가장 최신 버전만 취소할 수 있습니다. |
4) 브랜치 생성 및 정보 확인
브랜치란 말 그대로 일종의 나뭇가지를 뜻하며, 상황에 알맞게 가지를 치면서도 종합적으로도 관리가 가능하도록 하는 개념입니다. 문서를 다양한 버전, 다양한 상황 등에 알맞게 수정하고, 버전을 생성하면서도, 나중에 다시 통합을 하거나 한 번에 여러 버전의 문서들을 수정하는 등 버전 관리의 핵심적인 기능을 합니다. 단, 커밋까지 수행한 문서에 한해서 해당 브랜치에 가리켜집니다.
명령어 | 설명 | 비고 |
$ git branch | 브랜치를 만들거나 존재하는 브랜치를 확인합니다. 명령어에 이어서 원하는 브랜치 이름을 적으면 해당 이름의 브랜치를 생성할 수 있습니다. ex) $ git branch abc |
브랜치를 확인할 때, 브랜치 이름 앞에 있는 '*' 표시는 현재 해당 브랜치에서 작업하고 있음을 의미합니다. |
$ git checkout 브랜치명 | 현재 브랜치에서 브랜치명에 해당하는 브랜치로 이동합니다. | 옵션 -b: '$ git checkout -b 브랜치명'으로 명령하면 브랜치명에 해당하는 브랜치를 생성 및 이동을 동시에 진행합니다. |
$ git log --oneline --branches --graph | 현재 브랜치별로 커밋에 대한 정보 요약, 브랜치 사이의 관계를 그래프로 표시하면서 직관적인 파악이 가능하게 합니다. | |
$ git log 브랜치1..브랜치2 | 브랜치 이름 사이에 마침표 2개를 공백없이 넣으면 왼쪽(브랜치1) 기준으로 오른쪽(브랜치2)과의 비교를 표시합니다. | 즉, 왼쪽엔 없지만 오른쪽엔 있는 것을 알려줍니다. 왼쪽에 있는 것을 알고 싶다면 위치를 바꿔야 합니다. |
5) 브랜치 병합
만들어진 브랜치는 각각 작업을 하다가 어느 시점에선 기존 중심 브랜치 혹은 다른 브랜치와 합해야 하기도 합니다. 이 때 합치는 과정을 브랜치 병합(merge)이라고 합니다. 아래 표는 병합 시 사용하는 명령어와 설명이고, (1)~(3)은 병합할 때 발생하는 경우와 상황 설명입니다.
명령어 | 설명 | 비고 |
$ git branch 브랜치명 | 브랜치명에 해당하는 브랜치를 생성합니다. | |
$ git merge 브랜치명 | 현재 위치한 브랜치에 명령어의 브랜치명에 해당하는 브랜치를 병합합니다. 브랜치명에 해당하는 브랜치에서 병합을 수행할 수는 없습니다. | 옵션(브랜치명 뒤에 작성) --edit: 브랜치를 병합할 때 편집기가 실행되며 커밋 메시지를 추가 작성 또는 수정할 수 있게 합니다. --no-edit: 브랜치를 병합할 때 편집기를 실행하지 않고 깃에서 지정하는 커밋 메시지를 그대로 사용합니다. |
$ git branch -d 브랜치명 | 브랜치명에 해당하는 브랜치를 삭제합니다. 병합이 끝난 후, 필요가 없는 브랜치를 삭제할 때 사용합니다. | 옵션 -D: -d는 병합을 완료한 후에 병합된 브랜치를 삭제할 때 사용하고, 병합이 안 된 브랜치를 삭제할 경우엔 오류가 발생하는데, 대문자 D를 입력하면 병합되지 않은 브랜치라도 삭제합니다. |
$ git reset 커밋 해시 | 현재 HEAD가 가리키고 있는 브랜치의 최신 커밋을 커밋 해시에 해당하는 커밋으로 지정합니다. 이때 어떤 브랜치에 있는 커밋이든 지정이 가능하며, 명령 수행 후 브랜치와 연결이 끊긴 '커밋'은 삭제됩니다.(파일이 삭제되는 것은 아닙니다.) |
(1) 서로 다른(파일명이 다른) 파일을 병합: 개별 파일로 브랜치가 병합됩니다. 즉 브랜치1에 브랜치2를 병합했다고 가정할 때, 브랜치2에 존재하는 파일이 브랜치1에도 연결되는 것이라고 보면 됩니다.(복사가 되지만, 브랜치2에 존재하던 파일은 브랜치1에 복사된 파일과도 연결되어있는 느낌)
(2) 파일명이 같은 문서를 브랜치에서 각각 다른 위치를 수정한 후 병합: 같은 1개의 파일로 합쳐지면서, 각각의 위치에 수정된 내용이 반영됩니다.
(3) 파일명이 같은 문서를 각 브랜치에서 같은 위치를 수정한 후 병합: 충돌이 발생합니다. vim과 같은 편집기를 통해 문서에서 충돌한 부분을 다시 수정한 후, 커밋을 해야 비로소 병합이 완료됩니다. 이 때, 편집기를 통해 문서를 열면 각각의 브랜치에는 충돌된 위치에서 어떻게 작성되어있었는지 표시되어 있습니다. 이렇게 충돌이 발생할 경우 깃의 브랜치 병합을 자동으로 처리해주고 충돌을 해결해주는 프로그램이 존재합니다. 병합 알고리즘에는 2 way merge와 3 way merge가 존재하며 3 way merge가 훨씬 효율적입니다. 다음은 자주 사용되는 병합 자동화 프로그램 목록입니다.
프로그램 이름 | 설명 |
P4Merge | 무료, 직관적이며 사용이 편리, 병합 기능이 뛰어나지만, 단축키가 지원이 되지 않습니다. |
Meld | 무료, 오픈소스이며, 파일을 비교하는 것뿐만 아니라 직접 편집할 수 있습니다. |
Kdiff3 | 무료, 사용이 편리, 병합 기능이 뛰어나지만, 한글이 깨져 보일 수 있습니다. |
Araxis Merge | 유료지만, 용량이 큰 파일에서도 잘 동작합니다. |
6) 파일 감추기 및 되돌리기
브랜치에서 파일을 수정 또는 커밋하지 않은 상태에서 급하게 다른 파일을 수정 또는 커밋해야 할 경우, 기존에 작업하던 파일을 숨기는 명령어입니다.
명령어 | 설명 | 비고 |
$ git stash | 기존에 작업 중이던 파일을 stash 스택(선입후출 방식의 저장공간)에 저장합니다. 저장해서 숨긴 경우엔 git status에 보이지 않게 됩니다. | 옵션 save: 기존 작업 중이던 파일을 stash 스택에 저장해서 감춥니다.(생략 가능) list: stash 스택의 목록을 표시합니다.(0부터 시작하며, 가장 최근 파일은 0번으로 표시 예시: stash@{N}) pop: 가장 최근(0번) 파일을 stash 스택에서 삭제하고, 원래 위치로 되돌립니다. apply: stash 스택에는 그대로 남겨둔채로 파일을 원래 위치에 되돌립니다. 파일을 수정한 후 커밋이든 임시 저장이든 할 경우, stash 스택에 남아있던 파일은 drop을 통해 삭제하는 것이 오류를 예방하기 좋습니다. drop: stash 스택에서 가장 최근 파일(0번)을 삭제합니다. |
'지극히 개인적인 공부 노트 > 깃(Git)' 카테고리의 다른 글
[Git] 깃허브로 협업하기 (0) | 2021.06.26 |
---|---|
[Git] 깃허브 이용하기 (0) | 2021.06.24 |