이번 주에는 Git에 대해 배워보도록 하겠습니다. Git은 프로젝트의 버전 관리 시스템으로, 그 어떤 프로젝트를 하더라도 꼭 쓰게 되는 없어서는 안 될 시스템입니다.

Git의 존재 이유: 버전 관리 (Version Control)

우선, Git을 왜 써야 하는지 알아보겠습니다. 프로젝트를 개발하다 보면, 반드시 수정 전 상태로 코드를 되돌리고 싶을 때가 있을 텝니다. 예를 들어, 수정한 코드가 예상했던 만큼이 성능을 내지 못하거나, 심각한 버그가 존재하는데 어디서 버그가 발생했는지 알기 위해 버그가 없던 코드와 비교를 해 볼때가 있습니다.

이런 문제를 해결하는 가장 쉬운 방법은 코드를 변경할 때마다 코드를 복사해 놓는 것입니다. 하지만, 프로젝트의 사이즈가 커질수록 복사해 놓은 프로젝트들이 차지하는 용량은 엄청나게 커집니다. 또한, 프로젝트를 여러 번 복사하다 보면, 어느 복사본이 어떤 상태의 프로젝트를 가지고 있는지도 헷갈릴 수 있습니다.

또 다른 문제는 프로젝트를 여럿이서 개발 할 때입니다. 프로젝트를 같이 개발하다 보면, 한 파일을 여러 사람이 수정해야 하는 경우가 생깁니다. 여러 사람이 동시에 수정할 경우, 편집들이 지워져 버릴 가능성도 있습니다.

이러한 문제들을 해결하기 위해서, Git은 프로젝트의 코드가 바뀔 때마다 프로젝트 전체를 저장하지 않고, 바뀐 파일들만을 저장합니다. 그렇게 하므로써, 몇 개의 파일들만 바뀌었을 때 프로젝트 전체를 새로 저장하지 않고 수정된 파일들만 새롭게 저장합니다.

참고: Pro Git: 시작하기

Git의 기본 요소들

Git 저장소 (Repository)

그렇다면 이 정보는 어디에 저장될까요? 바로, 저장소 (Repository)라고 불리는 곳입니다. 저장소는 두 가지 종류가 있는데, 컴퓨터 안에 위치한 로컬 저장소와 원격 서버에 위치한 원격 저장소입니다.

프로젝트를 개발, 수정하는 동안, 개발자는 로컬 저장소에 편집 이력을 저장합니다. 그 후, 원하던 기능이 완성되었을 때, 하루가 마무리 되었을 때, 또는 남의 피드백을 구할 때 이 편집 이력들을 원격 서버에 밀어 보냅니다 (Push). 만약 개발자가 여럿이거나 작업 컴퓨터가 여러 개인 경우, 다른 장치에서 밀어 올려보낸 편집 이력들이 로컬 저장소에 없습니다. 그러므로, 그러한 수정 이력들을 당겨와서 (Pull) 프로젝트를 최신 상태로 유지합니다.

Git 커밋 (Commit)

Git은 이 파일들의 정보들을 커밋 (Commit)으로 저장합니다. 커밋은 변경된 파일들의 스냅샷을 모은 집합입니다. 추가로, 커밋을 판별하고 찾기 쉽게 하기 위해, 각 커밋마다 해쉬 ID가 존재합니다. 또, 커밋이 무엇을 바꾸었는지 알고 싶을 때, 수정 내역을 전부 읽어볼 필요가 없게끔 짧은 제목과 글 또한 커밋에 포함됩니다.

Git 커밋 예시

Git 스테이징 (Staging)

커밋에 꼭 수정한 모든 파일들을 넣을 필요는 없습니다. 어떤 파일들의 수정 내역은 다음 커밋에 넣으면 더 깔끔하거나, 아니면 잠시 실험해보는 코드를 추가한 거라서 아예 저장하고 싶지 않는 수정 내역들은 커밋에 넣고 싶지 않을 것입니다.

그래서 컴퓨터 안에는 워킹 디렉토리 (working directory), 스테이징 공간 (staging area), 그리고 저장소 (repository)가 존재합니다. 워킹 디렉토리는 우리가 현재 개발 중인 작업 환경입니다. 이제, 수정 내역들 중 저장하고 싶은 것들을 스테이징 공간에 넣고 (add), 커밋으로 저장합니다 (commit). 이 커밋은 저장소에 저장되며, 스테이징 공간은 다시 비어있게 됩니다.

실습 없이 Git의 기본 요소들을 살펴봤기 때문에, 이해가 가지 않는 점들이 있을 수 있습니다. 우선 Git을 사용해 보고, 여전히 이해가 가지 않는다면 위의 글을 다시 읽어보는 것을 추천합니다.

Git 설치하기

Git을 설치하는 방법은 간단합니다.

리눅스

Ubuntu처럼 Debian 베이스 OS일 경우

sudo apt install git-all

Fedora처럼 RPM 베이스 OS일 경우

sudo dnf install git-all

로 설치할 수 있습니다.

윈도우

이 웹페이지에 들어가면 자동으로 설치 파일이 다운로드됩니다. 실행시켜서 설치할 수 있습니다.

https://git-scm.com/download/win

이 웹페이지에 들어가면 자동으로 설치 파일이 다운로드됩니다. 실행시켜서 설치할 수 있습니다.

http://git-scm.com/download/mac

Git 사용하기

노트: 동적 명령어들과 정적 명령어들은 따로 구분을 잘 하지는 않지만, 이해를 돕기 위해 나누었습니다.

노트2: Git은 설치한 후 컴퓨터에서 따라해보거나 GitHub의 튜토리얼로 따라해 보는 것을 추천합니다.

Git 환경 설정

처음에 Git을 만들었을 경우, 로컬 저장소를 만들어야 합니다. 프로젝트 폴더로 들어가서, 다음 명령어를 실행하면 로컬 저장소가 만들어집니다.

git init

로컬 저장소는 .git 이라는 폴더 안에 존재합니다.

Git 동적 명령어들

Git 명령어들

우리는 위의 글에서 Git을 쓸 때는 네 가지 공간으로 나누어진다는 것을 배웠습니다. 그 중 세 가지 공간은 로컬 PC안의 워킹 디렉토리, 스테이징 공간, 그리고 저장소이고, 나머지 하나는 원격 서버의 저장소입니다. 수정 내역을 한 공간에서 다른 공간으로 옮기기 위해서는 여러 가지 명령어들이 필요합니다.

git add

몇 개의 파일들을 수정한 후, 이것을 커밋으로 저장하려면 우선 스테이징 공간에 파일들을 넣어야 합니다. 이것은 git add 라는 명령어를 써서 할 수 있습니다. 예를 들어, README.md 라는 파일을 스테이징 공간에 넣으려면, 다음과 같은 명령어를 씁니다.

git add README.md

git reset

만약 실수로 넣고 싶지 않은 파일을 스테이징 공간에 넣어버린 경우, git reset 명령어로 다시 파일을 스테이징 공간에서 뺄 수 있습니다.

git reset README.md

만약 뒤에 어떤 파일 이름도 붙이지 않는다면, 스테이징 공간을 완전히 비웁니다.

git commit

이제 스테이징 공간에 있는 변경점들을 커밋으로 저장하려면 git commit 이라는 명령어를 써야 합니다. git commit을 쓸 경우, 터미널에 vim, emacs, nano 등의 텍스트 에디터가 떠서 다음과 같은 화면이 나타날 것입니다. 에디터로 첫 줄에 커밋 제목을 쓰시고, 한 줄을 띄운 후 세번째 줄부터 커밋을 설명하는 짧은 글을 쓰실 수 있습니다.

git commit

Git 커밋에 Vim이 뜬 화면

만약 vim 에 익숙하지 않는데 vim 화면이 뜬 경우, Esc 버튼을 누르고 : q을 누르시면 커밋을 하지 않고 나오실 수 있습니다.

git push

로컬 저장소에 커밋이 몇 개 있지만, 이것은 개인 PC에만 있어서 다른 사람들이 볼 수 없습니다. git push 로 이것을 원격 저장소에 올릴 수 있습니다.

git push

git pull

간혹 git push 명령어를 Git 이 무시하고 경고 메시지를 출력하는 경우가 있습니다. 경고 메시지는 원격 저장소에 새로운 수정 내역이 있어서, 우선 그것을 내려받은 후에 git push 를 하라는 뜻입니다. 그럴 경우, git pull 명령어로 원격 저장소의 수정 내역들을 로컬 저장소로 가져올 수 있습니다.

git pull

git pull은 코드 수정을 하기 전에 항상 하는 것을 추천합니다.

위의 그림에 나와있는 git checkoutgit merge명령어는 다음 주에 설명하도록 하겠습니다.

Git 정적 명령어들

Git의 명령어들 중 아무것도 바꾸지 않지만, 현재 상태를 출력해주는 유용한 명령어가 몇 가지 있습니다.

git status

git status 출력

정말 유용한 git status 명령어는, 워킹 디렉토리와 스테이징 공간의 현재 상태를 출력합니다. 첫 번째로 출력되는 초록색 텍스트는 수정 내역들 중 스테이징 공간에 넣어진 파일들입니다. 두 번째로 출력되는 빨간색 텍스트는 수정 내역들 중 스테이징 공간에 넣어지지 않은 파일들입니다. 마지막으로 출력되는 빨간색 텍스트는 새롭게 만들어진 파일들 중 스테이징 공간에 넣어지지 않은 파일들입니다.

git diff

git diff 출력

열심히 개발을 하고 난 후, 커밋을 저장하기 전에 수정한 부분들을 확인하는 것은 좋은 습관입니다. 수정한 부분은 git diff 명령어로 쉽게 확인할 수 있습니다.

git diff

위의 명령어는 스테이징 공간에 있지 않은 파일들 중 수정된 파일들의 수정 내역을 출력합니다. 초록색 줄들은 추가된 줄을 나타내며, 빨간색 줄들은 지워진 줄을 나타냅니다.

git diff --staged

명령어에 --staged를 붙일 경우, 스테이징 공간에 있는 파일들 중 수정된 파일들의 수정 내역을 출력합니다.

git log

저장소 안에 커밋들을 보고 싶다면, git log로 제일 마지막 커밋부터 확인해 볼 수 있습니다.

git log

git log 출력

다음 자료

다음 자료는 GitHub에 대한 자료입니다 ^^

참고 자료

영어

한글