[Git & GitHub] Git은 무엇일까?

Git은 무엇일까?

Git이란 컴퓨터 파일의 변경사항을 추적하고, 여러명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다.

조금 더 쉽게 풀어서 설명하자면,

Git을 통해서 사용자들은 서로의 코드를 공유하고 관리하면서 협업을 보다 간편하게 진행할 수 있게 된다. (협업을 하는 과정은 때로는 답답하고, 어지럽기 때문에 관리가 필요하다.)

이렇듯 Git의 기본 개념은 간단하다. 내 코드를 공유하고 그것을 통해 쉽게 프로젝트를 관리할 수 있게 도와주는 것이다.

Git을 따로 시간내서 공부까지 해야할까?

앞서 말했듯이 Git의 기본 개념은 매우 간단하고 직설적이다. 그래서 따로 시간을 내서 공부하는 것에 부담을 느낄 수 있다.

하지만 맞는 걸 맞다고 하는 것이 어렵듯이, 협업을 도와준다는 간단한 말에는 많은 섬세함이 필요하고 그래서 Git에는 꽤 많은 기능들이 구현되어 있다.

우리는 그 기능들을 이해하는 것을 넘어 능숙하게 사용해야하기 때문에 Git을 따로 시간을 내면서까지 공부해야한다. (개인적으로 개인 프로젝트, 팀 프로젝트 모두에서 Git과 같은 프로젝트 관리 툴은 필수적이라고 생각한다.)

Git의 용어와 기능

commit :

커밋이란 우리가 만드는 코드를 하나의 버전으로 만든 것을 뜻한다. 그 당시의 추억이라고 생각하면 이해하기 쉽다. 그 당시의 추억들이 쌓여서 지금의 내가 있는 것처럼 커밋이 쌓여서 최종버전의 코드가 존재하게 된다.

보통 ‘커밋을 만든다’, ‘커밋을 한다’라고 쓰이는데, 커밋을 할 때는 이전의 커밋(버전)과 비교해서 지금의 커밋(버전)이 무엇이 바뀌었는지를 커밋 메시지로 작성하게 된다. 다음 캡처본으로 확인해보자.

commit-img

위 캡처본을 보면 이전 commit과의 차이점을 Create User이라는 커밋 메시지와 그것에 대한 부연설명(User 기능 추가-21.07.01)을 통해 알 수 있다. 이때 Commit changes를 누르면 새로운 버전이 Commit 된다.

add :

add란 기존의 commit된 코드와 비교해서 변경된 내용을 stage에 올리는 기능을 한다.

add를 통해 stage에 올리게 되면 그 내용들은 commit을 할 수 있는 준비가 된 것이다.(실제로 staged 되지 않은 파일들은 commit을 하더라도 포함되지 않는다. )

또한 add는 untracked 즉, 추적되지 않은 파일을 tracked 하게 만들 수 있다.

예를 들어서, 중요한 정보가 들어있는 파일은 보안을 위해 untracked하게 만들어 놓는다. 이렇게 해놓으면 git에서 변화를 추적하지 않아서 변경사항으로 등록되지않고, 결과적으로 commit할때 추가되지 않는다.

하지만 그런 untracked 파일에 add 파일명 을 사용하면 그 파일은 tracked 하게 변해서 추적할 수 있게되고, stage에도 올라가게 된다.

따라서 add 파일명 으로 사용하는 명령은 조심해야한다.

보통 git add . 으로 디렉토리의 모든 변경내용을 stage에 올린다.

push :

push는 로컬저장소에 저장되어 있는 파일을 원격저장소로 보내는 기능을 한다.

쉽게 말해서 컴퓨터(노트북)에 저장되어 있는 파일들을 github 등의 원격저장소로 보내는 것이다.

add -> commit -> push의 순서로 진행되며 push까지 완료되면 로컬저장소(컴퓨터) 와 원격저장소(github)는 동기화 되었다고 할 수 있다.

pull :

push 가 로컬저장소에서 원격저장소로 보내는 기능이었다면, pull은 반대로 원격저장소에서 로컬저장소로 보내는 기능이다.

이는 협업을 할 때 유용하게 쓰이는데 다른 사람이 push를 통해 함께 공유하고 있는 원격저장소 파일을 변경한 후 내가 그것을 적용하지 않은 채 나도 push를 한다면 원격저장소에 에러가 생길 확률이 매우 높다.

따라서 이것을 방지하고자 pull을 통해 원격저장소의 변화를 로컬저장소로 가져온 후에 변경된 환경에서 코드를 작성하는 것이 바람직하다.

pull이 완료되면 로컬저장소(컴퓨터)와 원격저장소(github)는 동기화 되었다고 할 수 있다.

branch :

개발자로서 협업을 진행한다면 branch라는 단어를 보게 될 것이다.

영어로 직역하자면 가지(분기)를 나타내는 이 단어는 말 그대로 뻗어나가는 나뭇가지와 같다. branch라는 가지를 생성해서 각각 서로 다른 목적의 일을 진행하는 것이다.

예를들어서 웹사이트를 만드는 프로젝트를 A,B,C 라는 사람들과 함께 한다고 했을 때, 세 사람이 같은 일을 한다면 효율이 떨어지게 된다.

따라서 A는 로그인서비스, B는 결제서비스, C는 추천서비스를 만들기로 했다.

하지만 이때 서로 같은 branch에서 한다면 한 사람이 commit을 할때마다 다른사람은 pull을 이용해서 그 내용을 가져온 후 다시 진행해야하며, 그 때마다 코드를 수정해야하는 일이 발생할 수 있다.

그래서 서로의 공간을 분리하는 것이다. branch를 3개 만들어서 각자에게 한개씩 할당하면, 서로 다른 구역에서 자신이 할 일을 다른 사람 신경안쓰고 끝까지 진행할 수 있다.

이후 각자의 일이 다 끝나면 최종본을 담당하는 branch(보통 master branch)에 서로의 branch를 합치게 되고(merge) 이때 발생하는 문제들을 한번에 보면서 수정하면 된다.

결국 branch는 각자의 목적으로 구분된 작업공간인 것이다.

merge :

branch부분에서 잠깐 언급된 merge는 단어 뜻 그대로 병합을 뜻한다.

각자의 작업공간(branch)에서 목표로 했던 기능이 완성되면, 각각의 기능이 하나의 프로젝트 파일에서 제대로 돌아갈 수 있는지 확인하기 위해 merge(병합)를 진행한다.

이때 conflit(충돌)이 생긴다면 병합과정에 문제가 있다는 소리고, 오류 메시지를 따라 차근차근 해결해나가면 된다.

merge(병합)는 무작정 진행할 수도 있지만, conflit(충돌) 때문에 몇 가지의 방법론이 존재한다. 이에 대해서는 이후 포스팅을 작성할 예정이다.

마무리

현재 Git은 국내에서도 대부분의 개발자들이 사용하는 협업도구가 되었다.

프로그래밍 언어가 그렇듯, Git 역시 시작할 때는 어려워보이지만 익숙해지면 다방면으로 생산성을 높일 수 있다.

따라서 개발을 시작한다면, 빠르지 않더라도 천천히 기능을 이해하고 익숙해져서 협업과정에 도움을 받으면 좋겠다.

감사합니다.

댓글남기기