GIT 이란 무엇인가

김태성·2024년 7월 30일

개인 프로젝트-1

목록 보기
13/53
post-thumbnail

Intellij 하단에 있는 Git Gui이다.
저게 무엇을 의미하는지 한번 알아보자.

Git 정의

  • 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 스냅샷 스트림 기반의 분산 버전 관리 시스템 - wiki

위는 스냅샷 스트림의 설명이다.
변경될 경우 변경된 파일 전체를 저장하고, 변경되지 않은 경우 이전 버전의 파일을 링크한다. 이러한 저장 방식은 이전 버전 파일을 불러올때 엄청나게 빠르다.

만약, 파일 변경점만을 저장한다고 하자.

  • Version 1 -> Version 2 : File A에 변경점이 있다.

위의 경우 이 변경점만을 저장하는 방식을 썼을때
만약 commit이 10만개쯤 되면 그 모든 과정들을 역산하며 성능이 엄청나게 느려질 것이다.

하지만 스냅샷을 사용한다면 원하는 지점에서 참조하는 스냅샷을 찾기만 하면 바로 파일을 불러올 수 있게 되는 것이다.


레퍼런스 : https://en.wikipedia.org/wiki/Distributed_version_control

분산버전관리는 각 개발자가 중앙 서버에 접속하지 않은 상태에서도 코드 작업을 할 수 있다.

이 말만 본다면 무슨말인가 할 수도 있지만 다음을 한번 잘 읽어보자.

  • 개발자들은 기본적으로 로컬에서 작업한다.
  • 작업이 완료되었을때 중앙 브랜치에 Pull Request를 생성 한다.
  • 여러 개발자들이 이 Pull Request를 보며 토론을 한다.
  • Pull Request가 승인된다면 저장소에 병합된다.

이러한 구조는 Git을 활용한 작업을 할때

  • code review
  • Local/Origin branch
  • merge

등으로 나타나게 된다.
현업에서 코드 리뷰를 하며 실력이 늘었다! 라고 할때
보통 이런 Pull Requst를 할때 코드리뷰를 해준다고 들은 바가 있다.
또한 이러한 작업들은 코드의 실수를 사전에 방지하는 기능도 할 수 있고,
Local로 작업을 하기에 항상 인터넷을 사용하지 않는다.

스테이징

인터넷에 검색을 하면 쉽게 볼 수 있는 그림이다.
굵은 세로선 좌측은 Local영역, 오른쪽은 Origin 영역이라고 생각하면 되겠다.

위 2개를 같이 봐야 이해하기 편할 것이다.

첫번째 그림에서 알려주는것은
Untracked(변화를 주지 않은 파일)도 같이 Staged 된다는 것이다.
스냅샷 스트림에서 설명하였듯, 변화하지 않은 파일도 이전 파일에 링크를 걸어놓는다 하였다.
당연히 변화한 파일들은 Modified가 되어서 자연스럽게 Staging이 될 것이다.

이로써 Untracked , Modified 파일들이 Staged 된 이후, Commit을 하면
Local Repository에 파일들이 저장되고, 파일들이 Untracked,Unmodified 상태가 된다.

레퍼런스 : https://stackoverflow.com/questions/9663507/what-are-tracked-files-and-untracked-files-in-the-context-of-git
이때, Untracked 파일은 스냅샷에서 참조하지 않는 파일들이다.
git ignore로 무시를 할 수 있다.

두번째 그림에서 알려주는 것은
Local에서 Remote 영역으로 Push를 통해 데이터를 업로드 할 수 있고,
Fetch를 통해 다운로드 할 수 있다는 것이다.

여기서 중요하게 다뤄야 할 부분이 있다.
그것은 Fetch와 Pull이다.

  • Fetch는 Remote 저장소에서 최신 메타데이터 정보를 확인하는 것이다.
  • Pull은 Remote 저장소에서 최신 메타데이터를 확인 후, 최신 데이터를 복사하여 로컬 Git으로 가져온다.

여기서 우리는 하나 더 알수 있다.

  • 우리의 WorkSpace는 Local Repository와 코드를 비교하여 차이점을 찾아낸다.
  • 따라서 Fetch만 했을때는 Local Repository만을 변경하여 WorkSpace에는 영향이 없다.
  • 하지만 Pull을 사용했을때는 Local Repository, WorkSpace 모두 변경된다.

그렇기 때문에 우리는 commit만을 했을때 Origin 데이터를 바꿀 수 없고,
Fetch를 했다고 해서 내가 지금 쓰고있는 데이터가 변경되지 않는다.

Git을 처음 사용할때 commit과 push의 개념을 혼동하였는데, 이제와서 생각해보니 참 아찔한 경험이다. 잘못된 코드를 그대로 push했다가 프로젝트를 갈아엎은적도 있었다...

마치며

Git 명령어를 하나하나 알아본다거나, Git Branch를 어떻게 사용한다거나 하는것은 적지 않는다. 1인 프로젝트이기 때문에 Branch를 따와서 기능별로 합치는것을 제외한다면 기능을 별로 사용하진 않기 때문이다.

하지만 나중에 다른 사람들과 협업하게 된다면, 그때는 좀 더 자세하게 공부해볼 필요가 있을 것이다.

애매모호하게 알았던 Local/Remote , commit/pull/push/fetch의 개념을 정확하게 알게 되었다.

profile
닭이 되고싶은 병아리

0개의 댓글