상세 컨텐츠

본문 제목

[10차시/16기 박민규] Git&Github

심화 스터디/데이터 엔지니어링 스터디

by 민규라면 2023. 5. 21. 13:34

본문

GIT이 필요한 이유

  1. 변경 내역을 확인하기 어렵다.매번 파일을 다른 이름으로 새롭게 저장하여 변경 내역을 관리하는 것은 저장 공간을 낭비하는 일일 뿐 아니라, 관리하기 어렵다.
  2. 대개 파일을 단순히 저장하면 이전에 저장된 내용에서 현재 내용을 덮어쓴다. 즉, 저장된 파일은 항상 최신 상태만 갖게 된다. 이런 방시으로는 현재 저장된 내용이 이전에 비해 무엇이 달라졌는지 알기 어렵다.
  3. 버전을 되돌리기 어렵다.파일의 어느 부분이 삭제돼고, 어느 부분을 어떻게 되돌려야 할지 파악하기 어렵다.
  4. 파일을 단순히 덮어쓰거나 다른 이름으로 저장하는 방식으로는 과거 특정 시점으로 파일을 되돌리기도 쉽지 않다.
  5. 협력하기 어렵다.만일 모두가 작업한 파일을 덮어쓰는 방식으로 저장했거나 다른 이름으로 파일을 저장하는 방식으로 파일을 관리했다면 서로의 작업 내역을 합칠 때 매우 어려워진다.
  6. 대규모 소프트웨어는 대부분 여러 개발자가 협업하여 개발한다.

GIT

깃은 버전 관리를 도와주는 소프트웨어로 Version Control System이다.

SourceTree

깃을 더 직관적이고 편리하게 사용할 수 있는 프로그램

버전

버전이란 유의미한 변화가 결과물로 나온 것, 유의미한 변화가 결과물로 저장된 것을 의미한다.

벽돌이 모이고 모여 거대한 건물이 완성되듯, 버전이 모이고 모여 거대한 소프트웨어 결과물이 만들어진다.

개발에서 버전 관리는 다음과 같이 정리할 수 있다.

  • 누가 어떻게 변경했는지 변경 내역들을 기억하며,
  • 필요하다면 특정 시점의 버전으로 되돌리며,
  • 여러 명이 협업하는 과정에서 코드를 쉽게 나누고 합치며,
  • 개발하는 것

버전 관리의 큰 그림

작업디렉터리

로컬 저장소를 만들면 .git이라는 숨김 폴더가 생성된다.

.git 숨김 폴더가 놓여 있는 곳이 우리의 프로젝트가 위치할 공간이고, 이를 작업디렉터리(작업트리)라고 한다.

깃을 활용하여 작업 디렉터리 내에 위치한 파일 및 폴더의 현재 상태를 버전으로 만들고, 만들어진 버전을 관리할 수 있다.

즉, 작업디렉터리는 비전 관리의 대상이 위치하는 공간이다.

스테이지

버전을 만든다는 말은 특정 순간의 변경 사항을 기억한다는 말과 같다. 그렇기에 작업디렉터리에 있는 프로젝트에 변경 사항이 생기는 순간 새로운 버전을 만들 수 있다.

모든 변경 사항이 꼭 새로운 버전이 되어야할 필요는 없다. 변경 사항 중에서 새로운 버전에 포함하고 싶지 않은 경우도 있다.

그렇기에 새로운 버전을 만들기 전에 작업디렉터리 내에서 변경 사항이 생긴 파일 중 ‘다음 버전이 될 후보를 선별하는 작업’이 필요하고, 해당 작업을 하는 공간이 스테이지이다.

즉, 스테이지는 변경 사항이 있는 파일 중 다음 버전이 될 후보가 올라가는 공간이다.

저장소

다음 버전이 될 후보들을 모두 스테이지에 옮겼다면 이제 이 파일을 새로운 버전으로 만들어야 한다.

스테이지에 있는 파일을 바탕으로 새로운 버전을 만들면 새 버전이 저장소에 추가된다.

스테이지에 올라온 파일을 토대로 새로운 버전을 만들면, 새로운 버전이 될 후보가 더 존재하지 않으니 스테이지는 비워진다.

즉, 저장소는 버전이 만들어지고 관리되는 공간이다.

작업디렉터리에서 버전이 될 후보 파일을 스테이지로 옮기는 것을 스테이지에 추가한다add 또는 해당 파일을 스테이지시킨다staged라고 표현한다.

그리고 스테이지에 추가된 파일을 추가된add 파일이라고 표현한다.

저장소에 새로운 버전을 만드는 것을 커밋한다commit라고 표현한다. 저장소에 저장된 각각의 버전들을 커밋이라 부르기도 한다.

버전 관리

git init

로컬 저장소 만들기

.git 파일이 만들어지고 버전 관리를 할 수 있는 상태가 된다.

git status

작업디렉터리 상태 확인하기

git add .

모든 변경 사항을 스테이지에 올리기

git commit -m <commit message>

자세한 커밋 메시지와 함께 커밋하기

git commit -am <commit message>

add와 commit 한번에 실행하기, 새로 추가된 git에서 한번도 관리되지 못하였던 파일은 add와 commit을 따로 진행해야 한다.

.gitignore

버전 관리 대상에서 제외하고 싶은 파일이나 폴더, 즉 변경 사항이 생기더라도 앞으로도 쭉 버전에 포함하고 싶지 않은 파일이나 폴더를 지정하기 위해선 .gitignore 파일에 적어준다.

.gitignore 파일은 쉽게 말해 ‘무시할 파일/폴더 목록’을 적은 파일이다.

git revert

버전을 되돌리되, 되돌아간 상태에 대한 새로운 버전(커밋)을 만드는 방식이다.

기존의 커밋들은 삭제되지 않고 새로운 커밋이 추가된다.

이전 버전으로 되돌리기 위해서 현재 버전을 revert하는 커밋을 만든다.

git reset

되돌아갈 버전의 시점으로 완전히 되돌아가는 방식이다. 즉, 되돌아갈 버전 이후의 버전을 삭제된다.

이전 버전으로 되돌리기 위해서 현재 버전을 삭제한다.

git reset —soft : 커밋만 되돌리기

git reset —mixed : 스테이지까지 되돌리기

git reset —hard : 작업디렉터리까지 되돌리기

브랜치

브랜치는 마치 줄기에서 뻗어나오는 나뭇가지와 같이 버전을 여러 흐름으로 나누어 관리하는 방법이다. ‘버전을 여러 흐름으로 나누어 관리한다.’

브랜치는 버전의 분기이다. 작업을 분기하고 싶을 때 브랜치를 나누면 된다.

브랜치를 나눈다. > 각자의 브랜치에서 작업한다. > 필요한 경우 나눈 브랜치를 합친다.

충돌 해결하기

충돌이란 병합하려는 두 브랜치가 서로 같은 내용을 다르게 수정한 상황을 의미한다.

충돌이 발생하면 브랜치가 한 번에 병합되지 못한다. 같은 내용을 다르게 수정한 두 브랜치를 병합하는 과정에서, 깃은 어떤 브랜치의 내용을 반영해야 할지 판단할 수 없다.

충돌이 발생하면 충돌이 발생한 두 브랜치 중 어떤 브랜치의 내용을 병합 결과에 반영할 것인지를 직접 선택해야 한다.

이렇게 같은 내용을 다르게 수정한 브랜치 중 어떤 브랜치 내용을 최종적으로 반영할지를 직접 선택하는 것을 충돌을 해결한다라고 한다.

브랜치 관리

git branch <branch name>

브랜치 만들기

git branch

브랜치 목록 만들기

git switch <branch name>

해당 브랜치로 main 옮기기(작업하기)

git branch -d <branch name>

해당 브랜치 삭제

git merge <branch name>

브랜치 병합

git rebase <branch name>

브랜치 재배치

Github

원격 저장소 호스팅 서비스

깃으로 버전을 관리하는 프로젝트들이 모여있는 웹 사이트

깃으로 버전 관리하는 프로젝트를 깃허브에 업로드할 수 있고, 깃허브에 업로드한 여러분의 프로젝트에 새로운 버전을 추가할 수도 있다.

깃허브에 업로드된 전 세계 개발자들의 프로젝트를 컴퓨터로 다운로드 할 수도 있다.

원격 저장소

사용자의 컴퓨터 속에만 있는 저장소가 아닌, 인터넷 세상 어딘가에 있는 다른 컴퓨터 속의 저장소를 의미한다.

가령 깃허브의 원격 저장소는 깃허브가 관리하는 컴퓨터 속의 저장소를 의미한다.

로컬 저장소의 프로젝트를 원격 저장소에 백업해두고, 언제든 원격 저장소에서 프로젝트를 내려받아 사용할 수 있다.

모든 개발자가 이해하는 공통 코드를 원격 저장소에 업로드하고, 이를 내려받아 새로운 커밋들을 추가한 뒤 이를 다시 원격 저장소에 추가하는 방식으로 작업한다면 로컬 저장소에서만 작업하는 것보다 훨씬 효율적으로 협업할 수 있게 된다.

원격 저장소와 상호작용

git clone

깃허브상에 존재하는 원격 저장소를 로컬로 복사하여 가져오는 방법이다.

git remote

원격 저장소를 관리하는 명령어

git push

원격 저장소에 로컬 저장소의 변경 사항을 밀어넣는 것을 의미한다.

git fetch

다른 개발자가 푸시한 내용을 로컬로 가져오고 싶을 때 패치를 사용한다. 다시 말해, 원격 저장소의 변경 사항을 로컬로 가져오고 싶을 때 패치를 사용한다.

패치해도 원격 저장소의 내용이 로컬 저장소에 병합되지 않는다.

git pull

패치가 원격 저장소를 일단 가져오는 방법이라면 풀은 원격 저장소를 가져와서 합치는 방법이다.

Fetch와 Merge를 동시에 하는 방법이다.

관련글 더보기

댓글 영역