GIT

<22.04.18> 내가 보려고 만든 GIT 사용하기 기초 ㅡ GIT이란? / GIT 개념 / 명령어

mayberry 2022. 4. 18. 21:16

한 달 가까이 공부를 소홀히했다. 이유는 이사를 하고 컴퓨터를 괜찮은 걸 뽑았는데 성능이 좋아서 한동안 게임에 빠졌다.. 이러면 안된다는걸 깨닫고 정신차리고 다시 공부를 하려고 한다. ㅠ 

 

오늘은 개발자의 필수템이라고 하는 GIT에 대해 포스팅을 하려고 한다. 사실 전에도 GIT을 사용한 적이 있었는데 GIT에서 사용하는 용어들을 제대로 이해하지 못하고 단순무식하게 구글링을 통해서 따라하기만 해서 정작 GIT에 대해서 아는게 없었는데, 오늘은 처음 GIT을 배운다는 생각으로 포스팅을 하려고 한다.

 

1. GIT이란?

 

 

GIT은 분산 버전 관리 시스템이다. 어떤 파일을 여러번 수정하여야 할 일이 있을 때, 예전에 만들어 두었던 것을 삭제하진 않는다. 나중에 가서도 쓸 일이 있으니까. 예를 들면 나중에 수정하고 나서도 예전에 썼던 것을 다시 사용해야 할 경우와 같이 말이다. 그래서 파일 이름을 '월간보고서_최종본.hwp', '월간보고서_220302_마지막.hwp', '월간보고서_220302_저녁_진짜 마지막.hwp' ... 뭐 이런 식으로 사용했던 경험이 있었다면 GIT을 사용하면 이러한 문제가 완벽히 해결된다.

 

GIT은 예시로 들었던 상황처럼, 여러 시기에 만들어졌던 파일을 체계적으로 관리하여 최신의 소스에 쉽게 접근할 수 있을 뿐만 아니라, 사용자가 원하는 시점의 소스에 자유자재로 접근할 수 있다. 또한 이와 같은 시스템을 개인만이 아닌, 여러명이 속한 그룹에서 함께 사용하여 프로젝트를 진행할 때 버전 관리를 용이하게 해준다. 프로그램을 만들고 나서도 꾸준히 업데이트를 해주어야 하는 개발자라는 직업의 특성 상 아주아주아주 유용한 툴이다.

 

2. GIT의 기초적인 개념

 

GIT을 다운로드하고 이용하기 위해서는 GIT이 어떤 메커니즘으로 동작하고, GIT에서 자주 사용하는 용어들에 대한 이해가 필요하다. 여기서는 깊게까지 공부하지는 않을 것이며, 일단 '내가 보려고 만들었기' 때문에 초간단하게 작성하도록 하겠다.

 

GIT은 로컬 저장소, 원격 저장소, 그리고 스테이지라고 하는 세 개의 공간이 있다. 물리적인 위치를 따지자면, 로컬 저장소 ㅡ 스테이지 ㅡ 원격 저장소 와 같은 순서가 될 것이다. 

 

로컬 저장소는 쉽게 말해 사용자, 나를 포함한 어떤 프로젝트를 진행하는 누군가가 만든 저장소이다. 이들은 자신의 컴퓨터(로컬 환경)에서 폴더(로컬 저장소)를 만드는데, 이를 GIT 원격 저장소에 연결하면 GIT을 통해 어떤 파일이든 버전 관리가 가능하다.

 

원격 저장소는 사용자의 컴퓨터가 아닌, GIT에 존재하는 서버 저장소이다. 간단히 말하면 내가 갖고 있지 않고 멀리 떨어진 곳에 존재하는 저장소니까 원격 저장소라고 이해하면 된다. 구글 드라이브나 네이버 클라우드를 생각하면 이해가 빠를 것이다. 구글 드라이브나 네이버 클라우드가 사용자의 컴퓨터의 기억장치를 사용하는 것이 아닌 것처럼 GIT도 그러하다.

 

GIT bash와 같은 프로그램을 통해 로컬 저장소와 원격 저장소를 연결하여 다른 사람들이 수정한 코드를 조금의 명령어만으로 쉽게 가져올 수 있는 것이다.

 

스테이지는 로컬 저장소와 원격 저장소 사이에 위치하는 공간으로써, 로컬 저장소에 저장된 파일이 원격 저장소에 전송되기 이전에 잠깐 거쳐가는 공간이다. 나중에 명령어 소개 때 조금 더 자세히 이야기 하겠다.

 

2-1. GIT에서 자주 사용하는 용어

 

내가 GIT을 사용하려고 가장 처음에 배운 명령어는 git init이었다. 그리고 git remote add origin이니 master니 repository니 뭔가 하는 것들을 접하고 이게 뭔지 싶었다. 이번에는 이러한 용어들의 개념에 대해 조금 설명하고자 한다.

 

2-1-1. origin

 

GITHUB 사이트에서 원격 저장소를 만들고, 컴퓨터에서 로컬 저장소를 만든 뒤 GITBASH를 통해 원격 저장소와 연결할 수 있다. 이 때 원격 저장소를 remote 서버라고도 하는데, 로컬 저장소는 GITHUB에 등록된 어떤 remote 서버와도 연결이 가능하며, 여러 개의 remote 서버와도 연결이 가능한데, 이 중 자신이 사용하는 remote 서버의 이름을 관습적으로 origin이라고 하는 것이다. 즉 git remote add origin은 자기가 사용할 원격 저장소(origin)와 연결한다는 것이다.

 

2-1-2. repository

 

repository는 저장소란 뜻인데, 여기서 설명할 때는 remote 서버만을 의미하는것으로 의미를 한정하겠다. repository는 remote 서버 내에서 구분되는 프로젝트 단위인데, 대개 하나의 repository는 하나의 프로젝트를 의미하지만, 경우에 따라서는 한 repository에 여러 개의 프로젝트를 구성하기도 한다.

 

GITBASH를 통해 특정 repository를 클론할 수 있는데, 이 때 repository에 대한 url이 필요하다. 이 url의 형식은 일반적인 url 뒤에 .git을 붙인 것으로 표현할 수 있다. 예를 들면, https://github.com/user/example_repository.git 과 같은 형식으로 말이다.

 

2-1-3. branch

 

branch는 가지란 뜻이다. 이 의미만 알고 있으면 GIT에서 사용하는 branch가 무엇을 의미하고 어떤 역할을 하는지 금방 알 수 있다. branch는 어떤 지점에서 뻗어나간 가지와 같은데, 사용자는 가장 처음으로 remote 서버를 개설하고 난 뒤에 어떤 목적에 따라 최초로 생성한 remote 서버는 최종 파일만을 저장하는 곳으로 사용하고, 테스트를 위한 파일은 test라는 공간에 따로 모아두고 싶을 때가 있다. 이 때, test라는 공간이 branch이다. 최초로 개설한 remote 서버에서 뻗어나간, 최초의 remote 서버와는 독립된 작업 공간인 것이다.

 

사실 우리가 최초로 개설하는 remote 서버 또한 branch다. master라는 이름을 가진 branch가 되는 것이다. 사용자는 최초로 생성한 master를 최신 코드만을 담아놓는 branch로 지정하고, 별도의 branch를 개설하여 그곳에서 테스트 작업을 진행한 후 master로 일부 코드를 전송할 수 있는 것이다.

 

3. GIT에서 사용하는 명령어

 

3-1. remote 서버 -> 로컬 저장소

 

remote 서버(GIT repository)에 있는 코드를 로컬 저장소(내 컴퓨터)에 가져오기 위한 명령어를 소개하고자 한다. 여기서 remote 서버와 repository 용어는 원격 저장소라는 의미로 혼용하여 사용하겠다.

 

3-1-1. clone

 

clone은 말 그대로 remote 서버의 repository에서 클라이언트로 파일을 복사-붙여넣기 하는 것이다. repository에 있는 코드들을 토씨 하나 틀리지 않고 그대로 복제하여 로컬 환경에서 열람 및 수정할 수 있다.

 

git clone https://github.com/user/example_repo.git

 

위와 같이 작성하면 repository의 코드들을 clone할 수 있다. clone된 파일들은 repository에 업로드만 하지 않는다면 얼마든지 삭제/수정 할 수 있다.

 

3-1-2. pull

 

pull은 remote 서버의 최신 소스를 가져와 로컬 저장소에 병합해주는 명령어이다. 

 

git pull origin master

 

위 스크립트의 의미는 자신이 사용하는 원격 저장소(origin)의 master라는 branch에 있는 코드들을 로컬 저장소에 pull, 즉 가져오겠다는 의미이다.

 

결과적으로 보면 remote 서버에 있는 코드를 내 컴퓨터에 가져오는 것으로 clone 명령어와 동일한 역할을 하는 것으로 보이지만, pull은 병합의 기능이 있기 때문에 remote 서버에 반영된 수정 사항을 로컬 저장소에 만들었던 파일에 반영하는 의미가 크다. 

 

그리고 위는 예시를 위해 git pull origin master라는 스크립트만 작성하였지만, 저 스크립트를 작성하기 위해 미리 입력해야 하는 스크립트들이 별도로 존재한다. 이는 나중에 언급하도록 하겠다.

 

3-1-3. fetch

 

fetch는 remote 서버의 최신 이력을 로컬 저장소로 가져오되 병합은 하지 않는 명령어이다.

 

git fetch https://github.com/user/example-repo.git

 

여기서 pull과의 가장 큰 차이점이 두드러진다. 병합을 하지 않는 것으로 fetch와 pull의 사용 용도가 철저히 달라지게 된다. 소스 코드의 최신 버전을 바로 pull하기에는 어느 정도의 리스크가 있다. 업데이트한 코드에 치명적인 버그가 있다면? 그래서 pull을 하기 전에 fetch를 통해 변경 사항을 확인하고 병합을 진행할지 하지 않을지 사용자가 선택할 여지가 생긴다. 

 

여기까지는 remote 서버에서 로컬 저장소로 데이터를 가져오는 명령어에 대해 알아보았다. clone / pull / fetch를 알아보았는데, 세 개의 명령어 모두 원격 저장소의 코드를 내 컴퓨터로 가져오지만, 사용자의 의도에 따라 적절한 명령어를 사용하여 버전 관리를 진행할 수 있다.

 

3-2. 로컬 저장소 -> remote 저장소

 

로컬 저장소에 있는 파일을 remote 저장소에 업로드하기 위한 명령어이다. 명령어들을 알아보기 전에 로컬 저장소에 있는 파일을 remote 저장소로 업로드되는 과정에 대해 간략히 설명하겠다.

 

먼저 사용자는 remote 저장소에 보낼 파일들을 선별(add)해야 한다. 그렇게 선별된 파일들은 스테이지(stage)라는 임의의 공간에 저장된다. 그리고 이 때 remote 저장소에 보내기로 약속한 파일들을 패키징(commit)하게 된다. 이후 변경 사항들을 직접적으로 remote 서버에 전송(push)하게 된다.

 

위 과정들을 설명하면서 업로드에 필요한 명령어들을 괄호로 표기해놓았다. 즉, 로컬 저장소를 remote 저장소에 업로드 하기 위해서는 add, commit, push 이 세 개의 명령어들을 작성해야 한다. 

 

3-2-1. add

 

add는 로컬 저장소에 있는 파일들 중 remote 서버에 업로드하고자 하는 파일들을 지정하는 명령어이다. 단일 파일을 추가할 수도 있으며, 특정 디렉토리를 추가할 수도 있다. 

 

git add ./test
git add ./test2/main.cpp
git add .

 

위와 같은 형태로 add 명령어를 사용할 수 있다. 그런데 맨 아래에 있는 git add . 은 무엇일까? add . 은 로컬 저장소에 있는 모든 파일을 remote 서버에 업로드하겠다는 의미이다. 

 

3-2-2. commit

 

add를 통해 추가된 파일들은, 스테이지라는 공간에 저장된다. 즉, 아직까진 remote 서버에 업로드 되지 않았다는 의미이다. remote 서버에 업로드하기 위해 add 다음으로 이루어져야 하는 과정이 바로 commit이다. commit은 add로 선별된 파일들을 패키징하는 역할을 한다. 

 

git commit -m "헤더 파일 추가"

 

commit 명령어를 통해 remote 서버에 업로드하고자 하는 파일을 패키징하고, 본격적으로 remote 서버에 업로드하기 위한 마지막 준비가 이루어진다. 하지만 이 때 사용자는 remote 서버에 업로드함과 동시에 메세지를 남길 수가 있다. 이 메세지는 GITHUB repository에서 확인할 수 있다. 주로 이 메세지에는 변경 사항에 대해 간단히 입력한다.

 

commit을 한다는 것은, commit이 이루어지는 시점에서 새로운 버전으로 취급받게 된다는 의미이다.  

 

commit 단계까지 완료하더라도 파일들은 아직 remote 서버에 업로드되지 않은 상태이다. 즉 아직까지 스테이지에 파일들이 잔류하고 있다. 

 

3-2-3. push

 

push는 add-commit 까지 완료한 후에 사용할 수 있는 명령어이다. push는 스테이지에 잔류하고 있는 파일들을 본격적으로 remote 서버에 업로드시켜준다.

 

git push origin master

 

pull 사용법과 동일하다. origin remote 서버의 master 브랜치로 push하라는 의미이다. 이 단계까지 완료한다면 로컬 저장소에 있는 파일들은 성공적으로 외부 저장소에 업로드된 것이다.

 

4. push까지의 과정

 

이 때까지 설명했던 부분들을 조합하여 로컬 저장소 생성에서 외부 저장소 push까지의 과정을 명령어로 정리하자면 아래와 같다.

 

git init
git remote add origin https://github.com/user/example_repo.git
git add .
git commit -m "first upload"
git push origin master

 

user/example_repo라는 저장소와 로컬 저장소를 연결하고 로컬 저장소의 모든 파일을 remote 서버에 push하는 내용이다.

 

 

오늘은 git의 기초적인 개념과 사용법에 대해 알아보았다. 다음에도 git을 사용하면서 생긴 오류나 다른 사용 방법에 대해 익히게 된다면 포스팅하도록 하겠다.

 

P. S 조잡한 글 읽어주셔서 감사합니다! 혹시나 틀린 정보가 있다면 과감한 지적(하지만 욕은 삼가해주시면 감사하겠습니다 ㅎㅎ) 부탁드립니다.