기타/기타

Git 제대로 알고 사용하기

Jinn 2024. 2. 28. 01:15

 

 
 

시작하며

월요일에 취업 특강을 듣고 난 뒤, 잠시 미루던 블로그 활동을 다시 시작하기로 다짐했다.
 
이번 글은 git에 대한 내용이다. 그동안 git을 사용하면서 add, commit, push 등 이런 명령어가 무엇을 의미하는지 막연하게 알고 사용했었다. 그저 '내 로컬 저장소의 내용을 원격 저장소에 반영하려면 add -> commit -> push를 해야 해'라고만 알고 사용했다. 그래서 조금만 잘못되거나 에러가 발생하면 구글링을 해서 무슨 의미인지도 모르고 또다시 웹상에 떠돌아다니는 명령어를 '복붙' 해왔다. 앞으로는 git을 더 이해하고 다루고자 아침마다 지하철에서 전자책을 보며 git을 공부했다. 그 내용을 정리하는 글이다.
 
 

원격 저장소에 커밋 올리기

내 컴퓨터에 있는 폴더를 github에 있는 원격 저장소에 반영하려면 첫 단계로 git init을 한다. git init을 하게 되면 해당 폴더에 버전 정보, 원격 저장소 주소 등이 들어있는 .git 파일이 생성된다. 로컬 저장소의 정체는 바로 이 .git 파일, 즉 로컬 저장소는 git을 통해 버전 관리가 이루어질 내 컴퓨터에 존재하는 .git을 포함하는 폴더를 말한다.
 
다음으로 할 일은 내 정보를 등록하기위해 다음 코드를 작성하여 이메일과 이름을 등록하는 것이다.

git config --global user.email "myemail@gmail.com"
git config --global user.name "myName"

 
이제 버전으로 만들 파일을 지정한다. 이렇게 생성된 버전을 커밋(commit)이라고 한다.

git add hello.txt
git commit -m "first commit"

 
로컬 저장소의 파일을 원격 저장소에 반영하려면 로컬 저장소와 원격 저장소를 연결해야 한다.

git remote add origin 원격 저장소 주소
git branch -M main
git push origin main

저장소 연결이 되면 git branch 명령어를 통해 main 브랜치를 생성하고, git push 명령어로 로컬 저장소에 있는 커밋을 원격 저장소의 main 브랜치에 올린다.
 
※ Github에서 저장소를 생성하면 기본 브랜치로 main이 생성된다. 하지만 git bash나 소스트리를 사용해서 저장소를 생성하면 기본 브랜치가 master로 생성된다. 따라서 master -> main으로 변경하는 작업이 필요하다.
 
 

원격 저장소의 커밋을 내려받기

원격 저장소의 버전 전체를 내 컴퓨터로 내려받으려면 다음 명령어를 사용한다.

git clone 원격 저장소 주소

clone을 하면 내 컴퓨터에 원격 저장소의 내용과 똑같은 로컬 저장소가 생긴다.
 
원격 저장소의 내용을 내려받으면서 새로운 로컬 저장소를 만드는 것이 아니라 기존 로컬 저장소에 원격 저장소의 내용을 갱신하고 싶을 때는 pull 명령어를 사용한다.

git pull origin main

위 코드는 원격 저장소의 main 브랜치 내용을 로컬 저장소로 내려받아 로컬 저장소를 갱신한다.
 
 

Git의 커밋 방식

git은 코드를 저장할 때 변경된 파일 전체를 저장하는 스냅샷 방식을 사용한다. git 이전의 버전 관리 시스템인 SVN은 변경된 부분만 저장하는 델타 방식을 사용한다. 스냅샷과 델타 방식의 차이는 아래와 같다.

 
델타 방식은 마지막 버전을 보여주기 위해서 처음 버전까지 거슬러 올라가며 계산을 해야 한다. 그러나 스냅샷 방식은 바로 전의 커밋과 비교하는 한 번의 계산만 필요하다. 깃은 스냅샷 방식을 사용해서 연산을 더 빠르게 처리한다.
 
 

Git의 파일 상태

git에서 파일은 4가지 상태로 구분한다.

 

  • untracked: 커밋되지 않은 상태
  • staged: add 명령어를 실행한 상태
  • unmodified: commit 명령어를 실행한 상태
  • modified: 파일이 수정된 상태

 
READMD.md 파일과 app.js 파일을 원격 저장소에 push 한다고 할 때 그 과정은 다음과 같다.

 
1️⃣: README.md파일과 app.js파일은 커밋되지 않은 상태. 즉 untracked 상태.
2️⃣: add 명령어를 실행하면 로컬 저장소의 스테이지에 올라가게 된다. 이것을 staged 상태라고 한다.
3️⃣: commit을 하면 스테이지에 올라온 파일들이 하나의 스냅샷으로 만들어진다. 이제 unmodified 상태가 된다.
4️⃣: push 명령어로 로컬 저장소에 있는 파일(커밋)을 원격 저장소에 올린다.
 
다음 그림은 app.js 파일을 수정하고 style.css라는 새로운 파일을 만들어서 push를 하는 과정이다.

 
1️⃣: app.js 파일은 수정되었으므로 modified 상태가 된다. style.css 파일은 untracked 상태이다. README.md 파일은 그대로 unmodified 상태이다.
2️⃣: app.js와 style.css 파일이 스테이지에 올라온다. README.md 파일은 이전에 이미 올라온 상태.
3️⃣: commit 명령어로 이전 스냅샷과 비교하여 새로운 스냅샷을 만든다.
4️⃣:  push 명령어로 원격 저장소에 새로운 커밋이 올라간다.
 
git은 이렇게 파일을 4가지의 상태로 버전 관리를 한다.
 
 

마치며

git을 사용해서 작업 공간(내 pc)에 있는 파일을 로컬 저장소 그리고 원격 저장소에 올려서 버전 관리 하는 기본적인 방법과 git이 파일을 다루는 상태에 대해서 알아봤다. 그동안 무작정 사용했던 add, commit, push 명령어를 이제 어떤 의미인지 알고 사용할 수 있게 되었다.