개발

버전 관리 도구로써 Git

박붕어 2022. 4. 20. 10:12

컴퓨터 관련 학과에 재학 중이거나 프로그래밍에 관심 있어하는 사람, 개발자라면 한 번쯤은 들어봤을 Git. 

프로그래밍을 업으로 삼고자 하는 사람이라면 필수적으로 다룰 줄 알아야하는 도구입니다. 

 

하지만 어떤 도구이던지, "어떻게" 사용하는지 보다는 "왜" 사용하는지를 깨닫는 게 숙련도를 빠르게 높일 수 있는 방법이죠. 그리고 "왜"에 대한 이해가 없다면, 도구를 잘못 사용하게 될 수도 있습니다. 전기톱을 왜 사용하는지에 대한 이해가 부족하다면 전기톱을 사용해 나무가 아닌 종이를 자르고 있을 수도 있다는 말입니다.

 

저도 대학교 2학년 때, 동료들과 프로젝트를 진행하면서 Git을 써보기로 하여 무작정 프로젝트에 GIT을 도입했고

왜, 어떻게 사용하는지에 대한 이해 없이 Git을 사용하면서 "불편한 점이 이렇게나 많은데 사람들이 왜 사용하는거지?"

라는 생각을 한 적이 많았습니다. Branch와 같은 기능을 전혀 사용하지 않은 채 협업을 진행하니 많은 코드에서 충돌이 났고 충돌을 해결하는 시간을 낭비한 적이 많았죠.  

 

인터넷에는 Git이라는 도구를 "어떻게" 사용하는지에 대한 정보는 정말 많지만

"왜" 사용하는지에 대한 정보는 많이 없다고 느꼈습니다. 

그래서 GIT을 처음 접하는 사람들을 위해 시나리오를 기반으로 GIT을 왜? 어떻게? 사용하는지를 풀어보려고 합니다. 

그렇다고 제가 GIT이라는 도구를 완벽하게 다룰 줄 아는 것도 아니므로 감안하고 봐주시면 감사하겠습니다 :)

 

1. Git이 왜 필요한데? 

많은 사람들이 같이 하나의 프로그램 또는 문서(또는 코드)를 작성하다 보면 다음과 같은 두 가지 문제점이 생깁니다. 

1. 한 문서가 어떻게 계속 변경되어 왔는지 모르겠어!!!

예를 들어서 어제 수정한 내용이 오늘 보니 잘못된 내용일 때, 어제 수정을 하기 전 버전의 문서가 필요해집니다.

 

2. 내가 문서를 수정했는데 누군가 그 부분을 지워버렸어!!!

여러 명이 하나의 문서를 수정하다가 보면 이와 같은 문제점이 많이 발생하죠. 그것뿐만 아니라 누군가 자신이 작성한 부분을 수정하더라도 자신은 그 사실을 까맣게 모를 수도 있습니다. 작성한 문서의 내용을 일일이 전부 외우고 있는 것도 아니고 매일같이 확인하는 것도 아니기 때문이죠. 

 

이런 문제점들을 해결하기 위해 생긴 도구가 GIT입니다. 

GIT의 핵심 요지는 많은 사람들이 함께 작업하는 문서수정 내용들을 좀 더 잘 관리하자는 것입니다. 

즉 GIT은 문서 또는 코드의 버전 관리 툴 이자 협업도구인 것입니다. 

물론 협업하기 위해서는 GIT 뿐만 아니라 Github이라던지,,, Gitlab이라던지,,, 다른 도구들이 필요하지만요. 

 

 

2. GIT 다루기 - 버전 관리

Git Repository 생성하기 - git init

그럼 Git은 문서(코드)의 버전을 어떻게 관리할까요?

Git은 디렉토리를 기준으로 디렉토리 안의 파일들을 추적(Tracking)하고 있습니다.

 

디렉토리 내부의 파일들의 변경사항들을 관리하고 싶다! 즉 버전관리를 하고 싶다 라고 하면 

Git init 명령어를 사용해 지금부터 디렉토리 내부 파일의 버전을 관리할 수 있습니다.

windows OS를 기반으로 cmd를 켜 git-test라는 디렉토리를 생성하고 내부로 이동해 git init 명령어를 사용하면 다음과 같은 메시지가 나옵니다.   

C:\Users\intern\workspace\git-test>git init
Initialized empty Git repository in C:/Users/intern/workspace/git-test/.git/

git-test라는 디렉토리가 초기화 되었다는 메세지입니다. 

이제 git-test라는 디렉토리 내부는 추적되고 있다고 할 수 있습니다. 

 

변경사항 확인하기 - git status

Git이 정말 git-test 디렉토리 내부를 추적하고 있는지 확인해볼까요? 

git-test 디렉토리 내부에 다음과 같은 index.js 파일을 생성해보겠습니다.

console.log("나는 새로운 파일이야!");
console.log("새로 만들어 졌다구");

그리고 git status라는 명령어를 입력해보면

C:\Users\intern\workspace\git-test>git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        index.js

nothing added to commit but untracked files present (use "git add" to track)

쨔쟌~하고 새로 만든 index.js가 들어가 있는 것을 볼 수 있습니다. 

git에서 index.js 파일이 생성된 것을 인지하고 새로 생겼다고 알려주는 것입니다. 

지금 현재 버전을 남겨보자 - git add와 git commit 

GIT에서는 git-test 디렉토리 내부에 대한 변경사항들에 대해서 추적하고 있기만 할 뿐 변경된 내역들을 저장하고 있지는 않습니다. 사용자가 디렉토리 내부의 파일을 변경할 때마다 버전을 만들어서 자동으로 관리해준다면? 버전이 엄청나게 많아지면서 관리도 힘들어지고, 공간도 엄청 많이 차지할 것입니다. 

 

그래서 사용자가 원하는 특정 버전을 남기는 방식으로 동작합니다. 

사용자가 파일을 수정하고 나서 git add와 git commit 명령어를 사용해서 이 버전을 기록하는 것입니다. 

 

왜 git add와 git commit 명령어 두 번이나 쳐야 될까요? 

 

여러분이 A라는 파일과 B라는 파일을 전부 수정하여 GIT이 A와 B의 변경사항 전부를 추적하고 있는 상태라고 칩시다. 여러분이 A라는 파일은 수정이 끝나서 먼저 이 버전을 기록하고 싶어요. 근데 저장을 하려면 전부 해야 한다? 그러면 B에 대한 수정이 아직 끝나지 않은 채로 버전이 기록되어 버리겠죠? 그럼 B의 버전은 관리가 제대로 되지 않습니다.

 

즉, 개별 파일에 대한 추적과 버전 기록, 관리를 하기 위해 add 명령어가 있다고 생각할 수 있습니다. 

 

그럼 다음 명령어를 사용해 index.js의 버전을 기록해보겠습니다.

C:\Users\intern\workspace\git-test>git add index.js

나는 index.js 파일을 버전에 추가할 거야!라는 명령어입니다. 

 

이 상태에서 git status를 확인해보면 

C:\Users\intern\workspace\git-test>git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   index.js

다음과 같이 index.js의 상태가 변경된 것을 볼 수 있습니다. 

 

add 명령어를 사용하면 파일을 unstage상태에서 stage상태로 변경을 하게 되는데요. 

버전에 추가할 파일들을 기록하는 것이라고 생각하시면 됩니다. 

 

그럼 바로 다음 명령어를 입력해줍시다. 

C:\Users\intern\workspace\git-test>git commit -m "버전을 기록할거야"
[master (root-commit) 0a0341d] 버전을 기록할거야
 1 file changed, 2 insertions(+)
 create mode 100644 index.js

git commit 명령어를 사용해 버전을 추가해줍니다. 

commit을 할 때에는 지금 기록하고 있는 특정 버전에 대한 간단한 코멘트를 달 수 있습니다. 이때, 코멘트에는 버전별로 어떤 이유로 버전을 기록했는지, 어떤 수정사항이 있는지 한눈에 파악할 수 있도록 작성을 하는 게 좋습니다. 

변경 사항에 대해 한 눈에 볼 수 있는 정보를 적어주는게 좋습니다.
똥같이 적으면 안됩니다.

commit을 할 때 버전에 대한 메시지를 기록해 놓으면 문서에 대한 관리가 수월해집니다. 

 

기록을 확인해볼까? - git log

이렇게 commit을 사용해 하나씩 버전을 기록하다 보면 그 기록 내용들을 한눈에 보고 싶을 때가 있을 수 있습니다. 

이럴 때 사용할 수 있는 게 git log 명령어입니다. 

C:\Users\intern\workspace\git-test>git log
commit 0a0341df3febf39a1efc2c7e9b48e531ae832aca (HEAD -> master)
Author: boong_u <boong_u@incross.com>
Date:   Tue Apr 19 09:40:13 2022 +0900

    버전을 기록할거야

앞서 작성했던 커밋 기록이 보이는 것을 볼 수가 있습니다. 

 

여러 가지 명령어들 - git diff, git reset, git stash ...

GIT에서는 이외에도 여러 가지 기능들을 제공을 합니다. 

git diff 명령어를 사용해 unstage(add하지 않은) 상태의 파일의 변경사항을 할 수도 있고

git reset 명령어를 사용하면 그 변경 내역들을 전부 날려버릴 수 도 있습니다. 

뿐만 아니라 문서의 특정 버전 ( 특정 commit )으로 자유롭게 이동이 가능하고 예전의 내역에서 시작해 새로운 버전을 작성할 수 도 있습니다.

Branch 기능 ( 출처 : https://git-scm.com/book/en/v2/Git-Branching-Rebasing )

Git에서는 정말 다양한 기능을 제공을 하는데 그 기능을 전부 외우기는 어렵습니다. 하지만 구글에 "GIT 명령어 모음" 이라고만 작성해도 누군가 명령어를 정리한 자료를 쉽게 찾아볼 수 있을 것입니다. 

2022년을 살아가는 사람들에게 가장 중요한 덕목 중 하나는 "구글링"이니까요. 

 

3. 그래서 요점이 뭐야? - 결국은 버전 관리

처음부터 말씀드렸다시피 중요한 건 "어떻게"가 아니라 "왜"입니다.

왜 Git을 사용하냐고 물어보시면 결국은 "버전 관리"라고 이야기를 할 수밖에 없죠.

git add, git commit을 통해서 특정 파일의 버전을 기록하고 그런 기록을 남겨놓아 나중에 다시 돌아갈 수 있는 backup을 수정사항 별로 만들어놓을 수 있다는 것이죠. 

 

Git 없이 프로그램을 작성한다고 생각하면 끔찍합니다.

프로그램을 수정했는데 예상치 못한 에러가 발생했어요.

근데 잘 동작하던 코드가 어떻게 짜여 있었는지 기억이 안 납니다.

돌아갈 곳이 없어진 거죠. 게임으로 따지면 세이브를 하지 않고 보스전에 도전하는 것과 마찬가지라고 생각합니다. 

 

지금까지 Git을 버전 관리 도구로써 왜 사용을 하는지 풀어봤습니다. 

Git은 버전관리도구로써 뿐만 아니라 협업도구로써도 많이 사용이 되고 있는데요. 다음에는 "왜?" Git이라는 협업도구를 사용하게 되었는지 그 배경과 Git과 Github을 사용해 어떻게 협업할 수 있는지를 풀어보려고 합니다.

 

긴 글 읽어주셔 감사합니다.