이번 시간부터는 본격적으로 Git을 사용해보도록 하겠습니다! 🥳🥳🥳 그 전에 git을 사용하기 위해 알아야 하는 기본 개념부터 정리해야겠죠?

🤡 repository & commit

git을 사용하기 위해 첫번째로 알아볼 개념은 레포지토리(repository)입니다. 레포지토리는 저장소라는 뜻을 가지고 있습니다.

새로운 프로젝트를 만들기 위해서는 해당 프로젝트를 담을 수 있는 폴더가 필요합니다. 이제 프로젝트와 관련된 파일과 폴더들은 프로젝트를 위해 새로 생성된 폴더 안에 담길 예정입니다. 앞으로 이러한 폴더를 프로젝트 폴더라고 부르겠습니다.

git을 사용해서 프로젝트 폴더를 버전으로 관리하면 필요한 순간에 해당 폴더 안에 어떤 것들이 담겨 있는지 또, 그 내용이 어떻게 변해가는지를 기록할 수 있습니다. git에서 이러한 정보를 기록하는 곳이 바로 레포지토리입니다.

레포지토리 안에는 프로젝트를 위해 만들어진 폴더의 초창기부터 최근까지의 모습이 버전별로 담기게 됩니다. git을 사용하면 프로젝트 폴더 안에 .git이라는 숨겨진 폴더가 만들어집니다. 이 숨겨진 폴더가 바로 레포지토리입니다.

개중에는 프로젝트 폴더 자체를 레포지토리로 부르는 사람들이 있습니다. 그러나 엄밀히 따지면 프로젝트의 변경 사항이 저장되어 있는 .git 폴더만이 레퍼지토리라고 할 수 있습니다.

두번째로 알아볼 개념은 커밋(commit)입니다.

프로젝트 폴더 안에서 여러 작업들을 하다보면 특정 모습을 하나의 버전으로 남기고 싶을 때가 생깁니다. 이러한 과정을 바로 커밋이라고 합니다.

커밋을 하면 커밋하는 당시의 프로젝트 폴더의 모습이 한 장의 사진처럼 레포지토리에 저장됩니다. 이때, 고정된 결과물 자체도 커밋이라고 부릅니다.

이후, 레포지토리에 저장된 커밋을 참조하면 과거의 프로젝트 폴더의 모습을 볼 수 있습니다. 이러한 커밋을 통해 버전 관리를 할 수 있게 되는 것이죠.

정리해봅시다. 프로젝트 폴더의 특정 모습을 하나의 버전으로 남기는 행위 및 그 결과물커밋이라고 합니다. 그리고 이 커밋이 저장되는 장소가 바로 레포지토리입니다.

이 두 개념이 바로 이해되지 않더라도 괜찮습니다. 실습을 하다보면 자연스레 이해가 되기 때문이죠.

🤡 repository 만들기

본격적으로 프로젝트 하나를 진행해봅시다. 프로젝트의 내용은 수학 계산기 프로그램을 만드는 것입니다. 전에 설치했던 Git Bash를 실행해주세요.

우선, 프로젝트를 위해 MathTool이라는 디렉토리를 만들어보겠습니다. 디렉토리 생성을 위한 커맨드는 mkdir이었죠?

mkdir MathTool

홈 디렉토리를 확인해보면 MathTool이 잘 생성된 것을 확인할 수 있습니다. 생성된 MathTool로 이동하겠습니다.

cd MathTool

이제 MathTool에 프로젝트를 위한 각종 파일과 자식 디렉토리를 추가함으로써 하나의 프로젝트 디렉토리로 만들겠습니다. 그리고 Git을 이용하여 MathTool 디렉토리의 버전 관리도 해보겠습니다. 이를 위해서는 간단한 설정이 필요한데요.

git init

위와 같이 커맨드를 입력해주시면 됩니다. gitGit으로 작업을 하기 위한 커맨드입니다. 그리고 git 뒤에 따라 나오는 커맨드는 git에서 진행할 작업을 의미합니다.

init을 입력하면 Initialized empty Git repository라는 문구가 뜨는데요. 이는 비어있는 레퍼지로리를 생산했다는 뜻입니다. 앞서 레포지토리는 프로젝트 디렉토리의 각 버전이 담기는 저장소라고 했죠? 저장소가 생겼기 때문에 앞으로 우리는 Git으로 버전 관리를 할 수 있습니다.

MathTool 내부를 살펴보면 .git이라는 디렉토리가 생긴 것을 확인할 수 있는데요. 이 디렉토리가 바로 레퍼지토리입니다. .git 디렉토리의 내부도 한번 볼까요?

여러 자식 디렉토리와 파일들이 담겨있네요. Git은 프로젝트 디렉토리에 버전 관리를 하기 위해서 자신만의 규칙을 가지고 복잡한 작업을 처리합니다. 현재 보고 있는 디렉토리와 파일들이 바로 그 작업을 하기 위해 사용되는 것들입니다.

그렇다고 각 디렉토리와 파일들의 역할을 알 필요는 없습니다. 지금은 Git이 어떤 복잡한 작업을 함으로써 버전 관리를 할 수 있다 정도로만 이해하시면 됩니다.

🤡 첫 commit 해보기

.git 디렉토리에서 다시 MathTool 디렉토리로 돌아옵니다. 부모 디렉토리로 돌아가려면 cd .. 커맨드를 입력하면 됩니다.

본격적으로 프로젝트를 시작해보겠습니다. 우선, MathTool 디렉토리에 파일 두 개를 추가하겠습니다.

첫번째 파일에는 덧셈과 뺄셈을 해주는 코드가 담겨있습니다. 앞서 설치한 Sublime Text를 실행하여 아래와 같이 코드를 작성해 주세요.

def add(x, y):
    return x+y
    
def subtract(x, y):
    return x-y

파일 이름은 calculator.py로 지정해주시고 홈 디렉토리의 MathTool에 저장해주세요.

Sublime Text의 텍스트 색이 변한 이유는 해당 코드를 python 코드로 인식했기 때문입니다.

다음으로 프로그램에 대한 라이센스 파일을 만들어 줄건데요. 이 파일이 필요한 이유는 우리가 만들 프로그램이 유료인지, 무료인지를 명시해주기 위해서입니다. 이 프로젝트는 누구나 사용할 수 있도록 무료로 제공할 예정입니다. 따라서, License라는 이름의 파일에 Free라는 내용을 간단히 적고 마찬가지로 MathTool 폴더에 저장해줍시다.

Git Bash로 돌아와 두 파일이 잘 저장되어 있는지 확인해봅시다.

그럼 위의 세 폴더를 제외하고는 아무 것도 없던 MathTool 폴더에 방금 생성한 두 파일이 잘 추가 된 것을 확인해 볼 수 있습니다. 이 상태를 MathTool 디렉토리의 첫번째 버전으로 남기겠습니다. 앞서 하나의 버전으로 저장하는 것을 커밋이라고 했죠?

그런데 첫 커밋을 하기 전에 꼭 해야 할 일이 하나 있습니다. 바로 Git에게 커밋한 사람이 누구인지를 알려주는 건데요. 다시 말해, 커밋을 할 때에는 그 커밋을 누가했는지도 반드시 함께 기록해야 합니다. 그렇지 않으면 혼자 프로젝트 할 때는 상관 없지만 협업을 할 때에는 누가 커밋을 했는지 구분할 수 없기 때문입니다. 따라서, Git은 이 작업을 강제하고 있습니다.

Git에게 커밋한 사람을 알려주는 방법은 그 사람의 이름과 이메일 주소를 설정하면 되는데요. 설정을 위해 config 커맨드를 입력합니다. 참고로 config는 configure의 줄임말로 우리말로는 '설정하다, 구성하다'라는 뜻을 가지고 있습니다.

git config user.name "tataki26"
git config user.email "tataki26@gmail.com"

위와 같이 커맨드를 입력하면 커밋 시에 이름과 이메일 주소를 함께 저장할 수 있습니다. 커밋을 하려면 commit 커맨드를 입력하면 되는데요. 이때, 이름과 이메일 주소 외에도 커밋에 대한 정보를 함께 입력해야 합니다. 이는 어떤 변동 사항이 생겨서 이런 커밋을 했는지 알려주기 위해 필요합니다. 이런 정보를 커밋 메시지라고 부릅니다. 그리고 커밋 메시지를 입력하기 위해서는 옵션 -m이 필요합니다.

git commit -m "Create calculatior.py and License"

위와 같이 커맨드를 입력하면 커밋 메시지가 설정됩니다. 그런데 위 커맨드를 실행하면 에러가 뜨는데요.

에러 메시지를 잘 읽어보니 커밋을 하기 위해서 add 된 것이 아무 것도 없고 untracked 상태의 파일들이 존재한다고 하네요. 여기서 untracked란, Git에 의해 아직 추적되지 않고 있는 상태를 말하는데요. 이는 아직 Git으로 뭔가를 해준 적이 없어서 파일이 버전 관리 대상이 아니라는 뜻입니다.

그럼 add는 무슨 뜻일까요? 커밋을 하기 전에는 커밋할 파일들을 미리 지정해줘야 합니다. 따라서, 파일을 새로 생성하거나 원래 있던 파일의 내용들을 수정하고 나면 그 파일들은 새로 바뀐 모습으로 커밋에 포함될 거라고 지정해야 하는데요. 이 작업이 끝나야 비로소 커밋을 할 수 있습니다. 그리고 이 작업이 바로 add인 것이죠.

add를 해보겠습니다. add 커맨드는 파일이름과 함께 입력합니다.

git add calculator.py
git add License

위와 같이 커맨드를 입력하면 두 파일이 add 됩니다. 이제 다시 커밋을 해보겠습니다.

git commit -m "Create calculatior.py and License"

그럼 아까와 다른 문구들이 출력되는데요. 여기서 root-commit이란 말은 이 커밋이 프로젝트의 첫번째 커밋이라는 뜻입니다. 그 옆에는 우리가 입력했던 커밋 메시지가 있습니다. 그 아래에는 변경된 파일의 개수를 보여줍니다. insertions는 calculator.py 파일의 코드 줄 개수와 License 파일의 줄 개수를 합친 수를 나타냅니다.

* 작성자는 calculator 파일을 한번 수정해서 다음과 같은 결과가 나왔습니다.

이렇게 첫번째 커밋이 완료되었습니다! 🥳🥳🥳

정리하자면, 커밋에 관한 주의사항에는 세 가지가 있습니다.

  1. 처음으로 커밋을 하기 전, 사용자 이름과 이메일 주소 설정하기
  2. 커밋 메시지 남기기(옵션 -m)
  3. 커밋할 파일을 git add로 지정해주기

🤡 Git의 세 가지 작업 영역

Git은 내부적으로 크게 세 가지 종류의 작업 영역을 두고 동작합니다. 각 작업 영역의 이름은,

  1. working directory
  2. staging area
  3. repository

입니다. 하나씩 설명해드리겠습니다.

첫번째 작업 영역인 working directory는 작업을 하는 프로젝트 디렉토리를 말합니다. 우리 프로젝트에서는 MathTool이 working directory입니다.

두번째 작업 영역인 staging areagit add를 한 파일들이 존재하는 곳입니다. 커밋을 하게 되면 staging area에 있는 파일들만 커밋에 반영됩니다.

세번째 작업 영역인 repository는 working directory의 변경 이력들이 저장되어 있는 곳입니다. 즉, 커밋들이 저장되는 영역을 말하는데요. working directory에서 작업을 한 후, git add하고 커밋을 하면 staging area에 있던 파일들의 모습이 마치 사진과 같이 repository에 저장되는 겁니다. 앞서 본 .git 디렉토리가 레퍼지토리에 해당합니다.

만약 수정된 두 파일 중 하나만 git add를 실행하고 다른 하나는 그대로 둔다면 git add가 된 파일만 staging area에 올라갑니다. 그럼 해당 파일은 수정한 이후의 모습이 커밋에 반영되는 반면에 git add를 하지 않은 파일은 수정하기 전의 모습이 커밋에 반영됩니다. 두 파일 모두 working directory에서 수정했지만 staging area에 올라갔는지 여부에 따라 그 최신 모습이 반영되는지 여부가 정해집니다. 이 부분은 Git을 활용할 때 꼭 알아야 하는 부분입니다.

그런데 staging area가 필요한 이유는 뭘까요? working directory에서 작업을 하고 git add 필요없이 바로 커밋하는 구조가 더 간단해보이는데 말이죠. 하지만 꼭 그렇지 않습니다. 방금과 같이 다음 커밋에 반영하고 싶지 않은 파일이 생길 수도 있기 때문이죠. 만약 staging area가 없다면 원하는 것들만 선별적으로 커밋에 반영할 수 없습니다. 다시 말해, 좀더 세밀한 버전 관리를 하기 위해 staging area가 필요한 것이죠.

Git의 세 가지 영역은 Git을 이해하는데 도움이 됩니다. 이 개념을 완벽히 이해해야 나머지 내용을 배우는 데에도 어려움이 없죠. 따라서, 꼭 기억해주셨으면 좋겠습니다.

참고로 working directory를 working tree로, staging area를 index라고도 합니다. 다른 이름도 알아두시길 바랍니다.


이번 시간에는 Git을 활용하기 위해 꼭 알아야 하는 개념인 레포지토리와 커밋, 그리고 레포지토리 생성 방법과 커밋하는 방법, Git의 세 가지 작업 영역에 대해 배웠습니다. 개념들이 생소해서 어려웠을 분들도 있을 것 같습니다. 복습을 통해서 차근히 개념을 익히셨으면 좋겠습니다.

다음 시간에는 git add를 좀 더 알아보고 특정 git 커맨드를 사용하는 방법도 알아보겠습니다.

* 이 자료는 CODEIT의 'Git으로 배우는 버전 관리' 강의를 기반으로 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글