Git이란?

Byeongho Jeon·2024년 8월 22일

Git

목록 보기
1/13

깃(Git)은 버전을 관리하기 위한 도구이다.


깃과 같은 도구 없이 프로젝트를 진행한다고 가정해보자. 어떤 불편함이 있을까?

1. 변경 내역을 확인하기가 어렵다.
프로젝트를 진행하면서 코드를 추가, 수정, 삭제하고 파일을 단순히 저장하면 이전의 내용에서 현재 내용으로 덮어쓰게 된다. 즉, 저장된 파일은 항상 최신 상태만 갖게 된다. 단순 저장 방식으로는 이전의 내용에서 어떤 부분이 변경되었는지 확인할 방법이 없다.
매번 다른 이름으로 따로 파일을 저장해서 관리하는 방법도 있지만, 이것 또한 좋은 방법은 아니다. 저장 공간을 많이 차지할 뿐만 아니라, 변경 내역을 확인하려면 파일을 여러개 열고 한 줄씩 비교해야 하기 때문이다.

2. 버전을 되돌리기 어렵다.
코드를 작성하다 보면, 마음에 들지 않아서 다시 이전으로 되돌리고 싶을 때가 있다.
그런데 단순히 저장하거나 다른 이름으로 저장하는 방식으로 파일을 관리했다면, 파일의 어느 부분이 추가, 수정, 삭제 됐는지 파악하기 어려울 것이다. 즉, 이전으로 되돌리기가 쉽지 않다.

3. 협력하기 어렵다.
소프트웨어는 보통 여러 개발자가 협업하여 개발한다. 누군가는 로그인 기능을 만들고 누군가는 결제 기능을 만드는 식으로 각자 개발할 업무를 맡고, 나중에 각자 만든 내용들을 합치게 된다.
그런데 모두가 단순히 저장하거나 다른 이름으로 저장하는 방식으로 파일을 관리했다면, 서로의 작업 내역을 합칠 때 매우 어려울 것이다. 코드를 합치는 과정에서 서로가 작업한 내용을 일일이 비교해야 한다면, 시간도 많이 걸릴뿐더러 실수도 자주 발생할 수 있기 때문이다.

깃을 사용하면 위의 불편함을 모두 해결할 수 있다.
즉, 어떤 부분이 변경되었는지 쉽게 확인이 가능하며, 버전을 되돌리기 쉽고, 협업하기 쉬워진다.


깃이 버전을 관리하는 도구라는데, 버전은 정확히 무엇일까?

버전이라는 말은 게임이나 애플리케이션 등 우리 생활 주변에서 쉽게 접할 수 있는 말이다.
경험상 알 수 있듯이, 새로운 버전은 주로 새로운 기능이 추가되거나 버그가 수정되는 등 기존과는 다른 유의미한 변화가 생겼을 때 만들어진다. 즉, 버전이란 '유의미한 변화가 결과물로 나온 것, 유의미한 변화가 결과물로 저장된 것'을 의미한다.


그렇다면, 버전 관리는 무엇일까?

우리가 코드로 무언가를 만드는 일은 유의미한 변화(버전)들을 쌓아 올리는 것과 같다. 벽돌이 모이고 모여 거대한 건물이 완성되듯, 버전이 모이고 모여 거대한 소프트웨어 결과물이 만들어진다.
버전관리는 위의 3가지 불편함 없이 유의미한 변화를 쌓아 올리며 소프트웨어를 만들어 나가는 과정이라고 할 수 있다. 다시말해, 개발에서 버전 관리는 다음과 같이 정리할 수 있다.

  1. 누가, 어떻게 변경했는지 변경 내역들을 기억하며
  2. 필요하다면 특정 시점의 버전으로 되돌리며
  3. 여러 명이 협업하는 과정에서 코드를 쉽게 나누고 합치며
  4. 개발하는 것

깃 설치 : https://git-scm.com/

홈페이지에 들어가서 Downloads를 클릭하고 운영체제에 맞는 설치 파일을 내려받은 후 설치를 하면 된다. 대부분 기본값 그대로 설치하면 된다.

몇 가지 설명하자면,

Choosing the default editor used by Git이라는 깃에서 사용할 기본 문서 편집기(에디터)를 선택하는 창이 나오는데, 일반적으로 Vim이라는 에디터를 사용하는 걸로 알고 있다. 그러므로 Use Vim (the ubiquitous text editor) ~ 을 선택하자. 다른 것을 선택해도 상관없다.

Adjusting the name of the initial branch in new repositories라는 initial branch(브랜치)의 이름을 정하는 창이 나오는데, 기본값인 Let Git decide를 선택하면 브랜치명이 master가 된다.
깃을 처음 공부한 책에서 본 내용인데, master는 과거 노예제도를 연상시킨다고 해서 요즘은 main을 쓴다고 한다. 그러므로 Override ~ 를 선택 후 기본값으로 쓰여 있는 main을 그대로 두고 넘어가자. 물론 기본값을 선택해도 아무런 문제없다.


깃 초기 설정

깃을 설치한 이후에는 본인 컴퓨터에 사용자 이름과 이메일을 등록하는 간단한 초기 설정이 필요하다. 앞으로 깃을 이용해 만드는 모든 버전에는 '저자', '만든 사람'과 같은 개념으로 지금부터 설정할 이름과 이메일이 함께 명시된다. 이름은 영어를 사용하는 것을 권장한다고 한다.

먼저, 아무 폴더나 만든 이후에 마우스 우클릭을 하면 Open Git Bash here가 있을 것이다. 클릭해서 깃 배쉬를 실행한다. 우클릭 후에 바로 안나오면 추가 옵션 표시를 클릭하면 나온다. 깃 배쉬를 실행했다면 git이라는 명령어를 입력해서 설치가 잘 됐는지 확인하자. 다음과 같이 git 명령어 목록이 뜬다면 설치가 잘 된 것이다.

다음과 같이 명령어를 입력하자.

설정한 이름과 이메일은 다음의 명령어로 확인할 수 있다.

이처럼 git config 명령어로 깃과 관련한 내용을 설정하거나 설정한 값을 확인할 수 있다.
git config --list 명령어를 입력하면 설정한 값을 모두 확인할 수 있다.

깃 사이트 <- git에 대해서 자세히 알고 싶다면 참고하기!!


깃이 관리하는 세 개의 공간

깃을 통해 버전이 만들어지는 과정을 이해하기 위해서는 깃이 관리하는 세 개의 공간인 작업 디렉터리(working directory), 스테이지(stage), 저장소(repository)를 먼저 이해해야 한다.

작업 디렉터리란?

먼저, 아무 폴더(디렉터리)를 만들고 깃 배쉬를 실행한다. 그리고 git init이라는 명령어를 입력한다.
그러면 폴더 안에 .git이라는 숨김 폴더가 생성이 된다.

.git 숨김 폴더가 놓여 있는 곳프로젝트가 위치할 공간이다. 이 공간, 즉 프로젝트가 위치할 공간을 작업 디렉터리(working directory) 또는 작업 트리(working tree)라고 한다. 그리고 깃을 이용해 작업 디렉터리 내에 위치한 파일 및 폴더의 현재 상태를 버전으로 만들고, 만들어진 버전을 관리할 수 있다.
즉, 작업 디렉터리는 버전 관리의 대상이 위치하는 공간이다.

스테이지란?

작업 디렉터리에 있는 프로젝트가 다음과 같이 여러 파일과 폴더로 이루어져 있다고 해보자.

프로젝트를 진행하면서 작업 디렉터리에 새로운 파일 또는 폴더를 생성할 수도 있고, 작업 디렉터리에 있는 기존의 파일 또는 폴더를 수정하거나 삭제할 수도 있다. (한마디로, 작업 디렉터리에 변경 사항을 만들 수 있다.)
위에서 말했듯이 버전이란 '유의미한 변화가 결과물로 나온 것, 유의미한 변화가 결과물로 저장된 것'이다. 그러므로, '버전을 만든다'는 말은 '특정 순간의 변경 사항(유의미한 변화)을 기억(저장)하겠다'는 말과 같다.
즉, 작업 디렉터리에 있는 프로젝트에 변경 사항이 생기는 순간 새로운 버전을 만들 수 있게 된다.

그런데 작업 디렉터리의 모든 변경 사항을 모조리 새로운 버전으로 만들어야만 할까? 반드시 그럴 필요는 없다. 변경 사항 중에서 새로운 버전에 포함하고 싶지 않은 내용도 있을 수 있기 때문이다. (예를 들어, 오늘 프로젝트에서 무엇을 할지 적어 놓은 텍스트 파일은 새로운 버전에 포함시킬 필요가 없다.)

그러므로, 새로운 버전을 만들기 전에 작업 디렉터리 내에서 변경 사항이 생긴 파일들 중에서 새로운 버전이 될 후보를 선별하는 작업이 필요하다.

그래서 깃으로 새로운 버전을 만들 때는 작업 디렉터리 내에서 변경 사항이 생긴 파일들 중에서 새로운 버전으로 만들 파일들만 선별해서 특별한 공간으로 옮기는 작업을 거치게 된다. 이 특별한 공간이 바로 스테이지이다.
즉, 스테이지는 변경 사항이 생긴 파일들 중에서 새로운 버전이 될 후보가 올라가는 공간이다.

참고로 스테이지는 스테이징 영역(Staging Area) 또는 인덱스(Index)라고도 부르며, 작업 디렉터리는 프로젝트가 위치한 공간이라 눈으로 직접 볼 수 있지만, 스테이지는 명시적으로 보이지 않는다.

저장소란?

다음 버전이 될 후보(파일)들을 모두 스테이지로 옮겼다면 이제 새로운 버전을 만들 수 있다. 스테이지에 있는 파일들을 바탕으로 새로운 버전을 만들면 새 버전이 저장소에 추가된다. 작업 디렉터리에서 만들어진 모든 버전들의 내역이 저장소에 있다.
즉, 저장소는 버전이 만들어지고 관리되는(이름 그대로 만들어진 버전이 저장되는) 공간이다.
저장소 또한 스테이지처럼 명시적으로 보이지 않는다.
그리고 새로운 버전을 만들면 스테이지는 깨끗하게 비워진다.

지금까지의 과정을 반복하며 저장소에는 새로운 버전들이 차곡차곡 쌓이게 된다.

이때 작업 디렉터리에서 버전이 될 후보 파일을 스테이지로 옮기는 것을 '스테이지에 추가(add)한다.' 또는 '해당 파일을 스테이지(staged)시킨다.'라고 표현한다. 그리고 스테이지에 추가된 파일을 '추가(add)된 파일' 또는 '스테이지(staged)된 파일'이라고 표현한다.
또한, 저장소에 새로운 버전을 만드는 것을 '커밋(commit)한다.'라고 표현한다. 그래서 저장소에 저장된 각각의 버전들을 커밋(commit)이라 부르기도 한다.

profile
안녕하세요. 개발자 지망생 전병호입니다!

0개의 댓글