ㅡ 목표 ㅡ
깃의 사용법을 익히고, 깃으로 버전관리하는 것을 이해한다.
ㅡ 들어가는 말 ㅡ
처음 깃에 대해 설명할 때, 중요 기능은 3가지가 있었습니다.
바로 버전관리, 백업, 협업인데요.
이번 글에서는 버전관리에 대해서 알아보도록 하겠습니다.
.git 디렉토리 생성하기
앞에서 배운 명령어를 통해서 실습할 디렉토리를 만들어줍니다. 그리고 Git bash에서 다음과 같은 명령어를 실행합니다.
$ git init
이것은 깃을 사용하기 위해서 디렉토리를 초기화해주는 과정입니다.
"Initialized empty Git repository ···"라고 뜬다면 해당 디렉토리에서 깃을 사용 할 준비가 되었습니다.
$git init 파일명 처럼 사용하면 파일을 생성함과 동시에 초기화됩니다.
ls -la 명령어를 통해 파일을 확인해보면 .git이라는 디렉토리가 생성되어있습니다.
스테이지와 커밋 이해하기
버전을 관리하기 위해서는 스테이지와 커밋을 이해해야하고,
스테이지와 커밋을 이해하기 위해서는 깃에서 버전을 만드는 단계를 알고 있어야합니다.
깃은 작업 트리, 스테이지, 저장소로 총 3가지로 구분됩니다.
위에서 생성한 .git 디렉토리 안에는 스테이지와 저장소가 포함됩니다.
이 중 스테이지와 저장소는 눈에 안보이기 때문에 버전을 만드는 과정을 잘 알고 있어야합니다.
작업 트리
작업트리는 파일 수정, 저장등의 작업을 하는 디렉토리입니다.
우리가 눈으로 보면서 작업을 하고 있는 디렉토리가 바로 작업트리입니다.
스테이지
스테이지는 버전으로 만들 파일이 대기하는 곳입니다. 다른 말로는 스테이징 영역(staging area)라고도 부릅니다.
우리가 작업트리에서 5개의 파일을 만들었다고 가정하겠습니다.
이 중 3개의 파일만 버전으로 만들어서 관리하려면 3개의 파일만 스테이지로 넘겨주면 됩니다.
저장소
저장소(repository)는 스테이지에 있는 파일들을 버전으로 만들어 저장하는 곳입니다.
보통 레포지토리라고도 많이 부르는 것 같습니다.
스테이지에서 저장소로 넘기는 것을 커밋(commit)이라고 합니다.
수정한 파일을 스테이징하기
버전 관리를 위한 파일을 생성하고 다음과 같은 명령어를 실행합니다.
$ git status
위 명령어는 깃의 상태를 확인 할 수 있는 명령어입니다.
"untracked files"라고 나타나는 것을 확인 할 수 있습니다. 깃에서는 한 번도 버전관리를 안한 파일을 이렇게 표시합니다
우리는 작업 트리에서 수정한 파일을 스테이지에 추가할 것입니다.
이 과정을 스테이징 혹은 스테이지에 올린다고 표현합니다.
$ git add 파일명
위와 같은 명령어를 실행하면 파일이 스테이지에 추가됩니다.
다시 한 번, $ git status 명령어를 실행해보겠습니다.
"changes to be committed:" 라고 나오는 것을 볼 수 있습니다. 앞으로 이 파일을 커밋 할 것이라는 뜻입니다.
추가로, $ git add . 과 같이 add 옆에 "."을 찍어주면 모든 파일을 스테이징합니다.
스테이지에 올라온 파일 커밋하기
스테이지에 있는 파일을 저장소로 커밋해보겠습니다.
$ git commit -m "커밋 메세지"
-m 옵션을 통해 커밋 메세지를 남길 수 있습니다. 커밋 메세지를 통해 어떤 변경 사항이 있는지 기록하는게 중요합니다.
메세지를 잘못 남기면 어떻게 할까요?
$ git commit --amend
위 명령어를 실행하면 기본 편집기(Vim)가 열립니다. 여기서 커밋 메세지를 수정할 수 있습니다.
이렇게 커밋을 통해 버전이 생성되었습니다. 잘 생성 되었는지 확인해볼까요?
$ git log
위 명령어를 통해 커밋한 버전에 대한 설명들이 나옵니다. 이를 "커밋 로그" 라고합니다.
--oneline 옵션을 뒤에 붙이면 한 줄로 간략하게 표시합니다.
--stat 옵션을 붙이면 최근의 커밋부터 순서대로 커밋 메세지와 관련된 파일이 나열됩니다.
. branches, graph와 같은 옵션도 있는데 추후에 적겠습니다.
위와 같은 과정을 한 번 거치면, 앞으로 나오는 버전들은 한 번에 스테이징과 커밋을 할 수 있습니다.
$ git commit -am "커밋 메세지"
한 번이라도 커밋한 적이 있어야 사용 할 수 있습니다.
이렇게 여러 개의 버전이 생기면 어떤 변화가 있는지 어떻게 알 수 있을까요?
프로젝트의 규모가 커질수록, 어떤 파일에 변화가 생겼는지 인지하기 힘듭니다.
$ git diff
위와 같은 명령어를 통해 어떤 변화가 있는지 확인 할 수있습니다.
작업 되돌리기
파일을 수정한 뒤 실행이 제대로 되지 않는 등의 이유로 수정한 내용을 취소하고 싶을 때가 있습니다.
수정한 소스를 직접 찾아서 바꿀 수도 있겠지만, 코드의 양이 많다면 상당한 곤욕을 치룰 수도 있습니다.
작업 트리에서 작업 되돌리기
아직 스테이징을 하기 전입니다.
$ git checkout --파일명
checkout 명령어를 통해 파일의 내용을 되돌릴 수 있습니다. 화면에는 아무것도 나타나지 않지만,
cat 명령어를 통해 확인하면 수정 전으로 파일의 내용이 변경된 것을 확인 할 수 있습니다.
스테이징 되돌리기
$ git add 명령어를 통해 스테이징이 완료된 상태라면 다음과 같은 명령어를 사용해야합니다.
$ git reset HEAD 파일명
스테이징이 된 상태라면 reset 명령어를 사용해야합니다.
커밋 되돌리기
$ git log 명령어를 실행해보면 HEAD -> master 를 확인 할 수 있습니다.
HEAD는 현재 작업중인(최신 커밋)을 가리키고 있는 특수한 포인터입니다.
그래서 이미 커밋까지 완료된 상태라면 다음과 같은 명령어를 사용해야합니다.
$ git reset HEAD^
HEAD^는 현재 HEAD가 가르치는 브랜치의 최신 커밋을 가리킵니다.
위에서 확인할 때 HEAD가 가리키고 있던 커밋을 취소하는 것입니다.
$ git reset HEAD~3
특정 버전으로 돌아가고 이후 버전을 삭제할 순 없을까요?
$ git log 명령어를 통해 돌아가고자 하는 커밋의 해시를 복사합니다.
$ git reset --hard 복사한 커밋 해시
그리고 위와 같이 사용하면 복사한 커밋으로 버전이 돌아가고 이후 버전은 삭제됩니다.
※다시 복구할 수없으니 신중해서 써야합니다.
그렇다면 삭제하지 않고 버전을 이동할 수는 없을까요?
위에서 사용한 reset 명령어는 커밋을 삭제하고 버전을 이동하는 방법이었습니다.
위와 마찬가지로 돌아갈 버전의 커밋 해시를 복사합니다.
$ git revert 복사한 커밋 해시
그리고 위와 같이 사용하면 버전이 삭제되지 않고 취소된 커밋이 남은 채 버전이 변경되는 것을 확인할 수 있습니다.
수정 중인 파일 감추기
브런치에서 파일을 수정하고 커밋하지 않은 상태로 급하게 다른 파일을 커밋해야 할 경우가 있습니다.
다른 파일과 수정 중인 파일이 같이 커밋 될 수도 있으니, 수정 중인 파일을 잠시 감출 수 있습니다.
$ git stash
위 명령을 사용하려면 파일이 tracked 상태여야합니다. (한 번은 커밋이 되어야 한다는겁니다.)
이 명령어를 사용해서 감추면 stash 스택에 담깁니다.
'스택'이란, 선입후출(FILO)방식의 저장공간을 가리킵니다. 마치, 접시를 쌓아놓고 위에부터 가져가는 것과 같습니다.
$ git stash pop
위 처럼 pop을 하면 가장 최근에 숨겨놓은 파일을 가져옵니다.
stash 목록에 저장된 수정 내용을 나중에 사용할지도 모른다면, $git stash apply 를 사용하면 저장내용이 보관됩니다.
그렇지 않다면 $git stash drop을 하면됩니다.
버전관리에서 제외하기
이렇게 디렉토리에 여러가지 파일들이 생성되고 있습니다.
많은 파일 중에 버전관리를 안하고 싶은 파일들은 어떻게 할까요?
.gitignore 파일을 생성해서 관리하지 않을 파일이나 디렉토리 이름, 파일 확장자를 입력하면 됩니다.
예를 들어,
mynote.txt
temp/
.swp
등등 이런 식으로 입력하면 됩니다.
ㅡ 정리하는 글 ㅡ
여기까지 깃을 이용해서 버전관리하는 방법을 알아봤습니다.
하지만, 실제로 이용하다보면 비슷한 틀을 가지고 여러가지 종류로 나눠지는 경우가 있습니다.
이런 상황마다 여러 개의 디렉토리를 만들면 상당히 비효율적입니다.
이와 같은 상황을 대비해서 깃에는 브런치라는 기능을 제공합니다.
다음은 브런치에 대해서 공부하도록 하겠습니다.
'DevOps > GIT & GITHUB' 카테고리의 다른 글
[GIT] git bash 관리자 권한으로 실행하기 (0) | 2021.09.06 |
---|---|
GIT 제대로 활용하기! - branch (0) | 2021.02.13 |
본격적으로 GITHUB 사용하기! - remote, push, pull, fetch (0) | 2021.02.10 |
GIT을 위한 간단한 리눅스 명령어 모음 (0) | 2021.02.08 |
GIT & GITHUB란? (0) | 2021.02.07 |