본격적인 내용에 들어가기 앞서, vim의 사용법을 익히고자 한다.
빔(Vim)은 리눅스의 기본 편집기로, 터미널에서 사용할 수 있으며 마우스 조작 없이 키보드로만 편집이 가능하다.
vim
명령어 뒤에 오는 파일이 존재한다면 그것을 열고, 그렇지 않다면 새로 생성한다.
$ vim vim_test.txt
:
)으로 시작한다.
:w
또는 :write
: 편집 중이던 문서를 저장한다.:q
또는 :quit
: 편집기를 종료한다.:wq
: 저장하고 편집기를 종료한다. 뒤에 파일 이름을 함께 붙이면 그 이름으로 저장된다.:q!
: 저장하지 않고 종료한다. 확장자 .swp
의 임시 파일이 생성된다.I
(Insert) 또는 A
(Add)Esc
🎈 깃 기본 편집기 변경 아래 명령에서 편집기 이름 대신 실행파일 경로를 입력해도 유효하다.
$ git config --global core.editor "편집기 이름"
필자의 실습 환경은 Ubuntu 18.04 LTS 이며, 언어 설정이 한국어로 되어 있어 Windows의 git bash와는 보이는 화면이 다를 수 있다. 하지만 내용은 동일하니 혼란이 없길 바란다.
[1] 디렉터리를 만든다.
$ mkdir git_test
$ cd git_test
[2] 깃을 사용할 수 있도록 디렉터리 초기화한다. 이 디렉터리에 저장소를 만들기 위함이다.
$ git init
[3] 디렉터리 내용을 출력해보면 .git
디렉터리가 생성되어 있음을 확인할 수 있다. 이곳이 깃의 버전이 저장될 repository(저장소, 레포지토리)이다. .git
리렉토리는 숨긴 폴더이다.
$ ls -la
버전(version)이 무엇인지는 모두 알 것이다. 문서가 수정되며 서로 구별되는 것을 말한다. 깃으로 버전을 관리한다면, 일일히 다른 이름으로 파일을 따로 저장하는 것이 아닌, 무엇을 어떻게 변경했는지 변경 시점마다 저장할 수 있고, 특정 버전으로 돌아갈 수도 있다.
작업트리(working tree) 또는 작업 디렉터리(working directory)란 파일을 수정하거나 저장하는 등 작업을 직접 수행하는 공간이다. 우리 눈에 보이는 공간이며, .git
을 담고 있는, 사용자가 만든 저장소를 말한다.
스테이지(stage) 혹은 스테이징 영역(staging area)란 버전으로 만들어질 파일이 잠시 대기하는 공간이다. 수정하거나 만든 파일 모두를 버전으로 만들 필요는 없기에 스테이지에도 모든 파일을 올릴 필요는 없다. 사용자의 눈에 보이지 않는 숨긴 파일(폴더)로, 스테이지 내용은 .git/index
파일에 저장된다.
저장소(repository, 레포지토리)란 스테이지에서 대기하던 파일을 버전으로 만들어 저장하는 공간이다. 스테이지와 마찬가지로 사용자의 눈에 보이지 않는 숨긴 파일(폴더)로, 저장소의 내용은 .git/HEAD
파일에 저장된다.
‘스테이지에 올리기’, ‘커밋’ 등의 용어는 차차 익숙해질 것이다.
[1] 작업 트리에서 문서를 생성/수정한다. [2] 수정 파일 중 버전으로 만들 것을 스테이지에 올린다. [3] 스테이지에 있던 파일을 저장소로 커밋한다.
각 용어는 이어질 실습을 하며 뜻을 알 수 있다.
[1] 만들어둔 디렉토리에서 깃 상태를 확인한다.
$ git status
[2] 새로운 파일을 만들고 문서를 입력, 저장한다. [2-1] 빔 편집기를 연다.
$ vim hello.txt
[2-2] vim으로 들어가서는 I
나 A
를 눌러 입력 모드로 들어간 뒤, A
를 입력한다
[2-3] Esc
로 다시 ex 모드로 돌아가며, :wq
로 종료한다.
[3] 파일 목록과 깃 상태를 조회해본다. untracked files라 뜬다. 아직 깃에 의해 파일의 이력이 추적되지 않는다는 뜻이다.
$ ls -la
$ git status
[4] 스테이징(스테이지에 올리기)한다. 깃에게 버전을 만들 준비를 하라며 알려주는 과정이다. .git/index
파일에 저장되므로 ‘인덱스에 등록한다’고도 표현한다.
$ git add hello.txt
[5] 깃 상태를 확인한다. new file
이라 하여 해당 새 파일이 앞으로 커밋될 예정임을 나타낸다.
$ git status
[6] 파일을 커밋(Commit)한다. 저장소로 파일을 올리는 것을 커밋이라 한다. -m
옵션으로 일종의 메모인 커밋 메시지를 저장할 수 있어, 해당 커밋의 내용을 메모할 수 있다.
$ git commit -m "first msg"
[7] 깃 상태와 저장소에 저장된 버전을 확인한다. 커밋될 것도 없고 작업트리도 깨끗함을 확인할 수 있으며, 커밋한 버전의 제작자와 시간, 커밋 메시지를 볼 수 있다.
$ git status
$ git log
[8] 한 번 더 과정을 반복해보자. 파일을 열어 B
라고 입력한 뒤 저장한다.
$ vim hello.txt
[9] 이미 커밋이 한 번 진행된 파일이므로 아래와 같이 -am
옵션으로 스테이징과 커밋을 한 번에 수행할 수 있다.
$ git commit -am "second msg"
[10] 버전을 확인한다.
명령어 git log
는 지금까지의 만든 버전과 그 기록을 자세히 나타낸다.
위 사진은 커밋 로그(commit log)라 부르는 커밋의 기록이다.
commit
옆에 긴 문자열을 커밋 해시(commit hash) 혹은 깃 해시(git hash)라 하며, 커밋을 구별하는 아이디이다. 각 커밋마다 다른 해시가 부여된다.
커밋 해시 옆의 (HEAD -> master)
은 이 버전이 가장 최신임을 나타낸다.
Author
과 Date
는 작성자와 버전 제작 날짜를, 그 밑에는 커밋 메시지를 볼 수 있다.
명령어 git diff
는 작업트리-스테이지 파일, 혹은 스테이지-저장소 파일의 최신 커밋을 비교해 수정 전후의 내용을 비교할 수 있다. 해당 명령으로 커밋 전에 파일을 검토할 수 있다.
[1] 기존 파일을 열어 B
를 지우고 C
를 입력한 뒤 저장한다.
[2] 깃 상태를 확인한다.
[3] 수정한 파일과 저장소의 최신 버전 파일을 비교한다.
$ git diff
위에서도 볼 수 있듯, -
는 삭제되었다, +
는 추가되었다는 의미이다.
한 번에 여러 파일을 커밋할 수도 있으며, 해당 커밋에 연관된 파일을 확인할 수도 있다. 실습해보고 결과를 확인하자.
[1] 새 파일을 만들고 내용을 입력한다. 내용은 1
이라고 일단 입력한다.
$ vim hello2.txt
[2] 새 파일을 하나 더 만들고 내용을 입력한다. 내용은 1
이라고 일단 입력한다.
$ vim hello3.txt
[3] 스테이징과 커밋을 진행한다.
$ git add hello2.txt
$ git add hello3.txt
$ git commit -m "third msg"
[2] git log --stat
명령으로 커밋에 관련된 파일을 모두 볼 수 있다. 최근 커밋부터 순서대로 커밋 메시지 및 관련 파일이 나열된다.
git log --stat
로그 메시지가 너무 많으면 한 화면씩 나누어 보여지고, Enter
을 누르면 다음 화면으로 넘어간다. Q
를 입력하면 로그 화면에서 나와 깃 명령 입력으로 돌아간다.
🎈 버전 관리에서 제외할 파일/디렉터리 지정하기
.gitignore
파일을 만들어 버전관리 중인 디렉터리 안에서 버전관리를 하지 않을 파일 혹은 디렉터리를 지정할 수 있다..gitignore
내에 파일/디렉터리 이름 혹은 확장자를 입력해 목록으로 저장한다. 주로 개인적 메모, 백업파일, 프로그램 사용 중 생성된 파일 등이 그 대상이 된다.my_memo.txt temp/ .swp
🎈 방금 커밋한 메시지 수정하기 커밋 메시지를 수정하기 위해 아래 명령을 입력한다.
git commit --amend
빔 편집기가 연리며 원래 커밋 메시지가 보인다. 필자는 기본 편집기가 VS Code로 되어 있어 VS Code로 열렸다. 입력 모드로 바꾸어 메시지를 수정한 뒤, ex 모드로 돌아가 내용을 저장하고 종료한다. 이렇게 메시지를 수정할 수 있으며 이전 커밋에 더해진다.
[1] 빔을 열어 hello.txt
파일을 수정한다. ‘C’를 ‘D’로 바꾼다.
[2] 파일의 수정 내용을 되돌린다.
$ git checkout -- hello.txt
[3] 파일 내용을 확인한다. 다시 ‘C’가 됨을 확인할 수 있다.
$ cat hello.txt
[1] 빔을 열어 hello.txt
파일을 수정한다. 기존 내용을 모두 지우고 ‘ABCD’라고 저장한다.
[2] 파일을 스테이징하고 상태를 살펴본다.
$ git add hello.txt
$ git status
[3] 스테이지에서 해당 파일을 내린다. HEAD 뒤에 파일 이름 지정하지 않으면 스테이지의 모든 파일을 되돌린다.
$ git reset HEAD hello.txt
[4] 깃 상태를 확인하고, 파일도 확인한다. 파일이 아직 스테이지에 올라가기 전으로 갔음(not staged)을 알 수 있다.
$ git status
$ cat hello.txt
[1] 빔을 열어 hello.txt
파일의 마지막에 ‘E’를 추가한다.
[2] 스테이징과 커밋을 수행한다.
$ git commit -am "forth msg"
[3] 깃 로그를 확인한다. 방금 한 커밋을 확인할 수 있다.
[4] 최신 커밋을 되돌린다. 스테이지에서도 내려져 취소한 파일은 작업트리에만 남는다. 만약 최근 n개의 커밋을 취소하려면 git reset HEAD~n
로 한다.
$ git reset HEAD^
[5] 깃 로그를 확인한다. 최신 커밋이 사라진 것을 볼 수 있다.
HEAD^
는 현재 HEAD 가 가리키는 브랜치의 최신 커밋을 말한다.git log
시 커밋 해시 뒤에(HEAD -> master)
표시가 되어 있었는데 이를 말한다.
여러 개의 커밋을 만들어어 실습을 진행해보겠다.
[1] 빔을 열어 rev.txt
파일을 만들고 1
을 입력한 뒤 저장한 후, R1
메시지로 커밋한다.
$ vim rev.txt
$ git add rev.txt
$ git commit -m "R1"
[2] 다시 문서을 열어 2
를 추가한 뒤 R2
메시지로 커밋한다.
$ vim rev.txt
$ git commit -am "R2"
[3] 같은 방법으로 3
을 추가하고 R3
메시지로, 4
를 추가하고 R4
메시지로 각각 커밋한다.
[4] git log
로 커밋을 확인한다. R2 커밋으로 되돌리기 위해, R2 커밋의 커밋 해시를 복사한다. 최근 커밋이 R2가 되고 이후의 버전은 모두 삭제되도록 할 것이다.
$ git log
[5] R2 커밋으로 되돌린다. HEAD가 해당 커밋으로 바뀌었음을 확인할 수 있다.
$ git reset --hard 커밋 해시
[6] 깃 로그 명령을 확인한다. R2가 최신 커밋 메시지가 되었음을 알 수 있다.
$ git log
[7] 또한 파일 내용을 확인해 해당 버전으로 돌아간 것도 알 수 있다.
$ git log
$ cat rev.txt
🎈 git reset 명령어의 옵션
--soft HEAD^
: 최근 커밋을 하기 전 상태로 작업트리를 되돌린다.--mixed HEAD^
: 최근 커밋과 스테이징 하기 전 상태로 작업 트리를 되돌린다. 옵션이 없을 때 이것이 기본이다.--hard HEAD^
: 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌린다. 되돌릴 시 복구 불가하다.
만약을 대비해, 커밋을 되돌리되 취소한 커밋은 남겨둘 수 있다.
[1] 빔을 열어 rev.txt
파일을 수정한다. 2
까지 남아있는 상황에서 5
를 추가로 입력한 뒤, R5
메시지와 함께 커밋한다.
$ vim rev.txt
$ git commit -am "R5"
[2] 깃 로그로 버전을 확인한다. R5 커밋을 취소하고 R2로 되돌아가기 위해 R5의 커밋 해시를 복사한다. 만약 로그 화면이 너무 길다면 Q
를 누른다.
$ git log
[3] R5 커밋을 되돌린다. reset
명령어는 ‘가장 최신으로 할 커밋 해시’를 입력하고 revert
명령어는 ‘취소하려는 버전의 커밋 해시’를 입력한다.
$ git revert 커밋 해시
[4] 위 명령어를 수행하면 기본 편집기가 나타난다. 맨 위에 ‘어떤 버전을 revert 했는가’가 보인다. 문서의 맨 위에 revert 하며 추가로 남겨둘 내용을 입력하고 저장한다.
[5] 깃 로그를 확인한다. 새 커밋이 생기고, R5에서 변경한 이력이 남아있다.
[6] 파일 내용을 확인한다. revert된 것을 알 수 있다.