[TIL]Git

김형주·2021년 4월 7일
0
post-thumbnail

GIT

여태까지 내가 Git을 사용하는 방식은 단순히 필요한 코드뭉치를 내 리모트 레파지토리로 포크해오고, 내 로컬로 클론해서 과제를 풀고 그걸 local에 저장하고 다시 add, commit, push라는 일련의 과정을 통해 기록을 남긴 뒤, 해당 레파지토리에 Pull request를 통해 완료를 알리는 방식으로 사용해왔다. 중간중간 내가 해보고 싶은 토이프로젝트들을 만들어서 git에 업로드할때도, 단순히 그 방식만을 기억하고 사용했을뿐이었다. 덕분에 어떤 부분을 수정했을때도 같은 파일 전체를 커밋하는 방식으로 이루어졌다. 오늘 공부를 통해서 이러한 과정들이 어떤 목적에서 이루어진 것인지 이해할 수 있었다.

git 이란?

Git은 어떤 것의 변경사항을 추적하고 기록해 그것의 변화과정을 히스토리로 남길 수 있도록 한다. 이는 사용자뿐만 아니라 협업하는 사람들이 해당하는 것에 접근하고 작업을 조율할 수 있도록 하는 일종의 분산 관리 시스템이다.

나는 일부러 컴퓨터나 프로그램, 혹은 소스와 같은 단어들을 사용하지 않았다. 그 이유는 Git이라는 것은 개발자에게는 소프트웨어 개발을 위한 분산 버전 관리시스템이기도 하지만, 사용 용도에 따라서는 다양한 목적으로 쓰일 수 있다고 생각했기 때문이다. 그래서 어떤 것 이라는 조금은 어중띤 단어를 사용했다. 만약 Git을 법률가가 사용한다면, 법 개정 관리 시스템이 될 수도 있고 디자이너가 사용한다면 작품 진행과정 관리 시스템이 될 수도 있다.

결국은 가장 중요한 개념은 "Git은 기록을 남기고, 관리할 수 있도록 하는 것"이다.

내가 굳이 굳이 이렇게 기록을 하는 이유는 내가 개발자로서만 성장할 수도 있지만 차후 다양한 목적에 따라서 이 툴을 활용할 수 있기 때문이다. 더불어, Git이라는 것을 처음 접하는 이들이 추상적인 개념을 이해하는 것에 있어서 좀 더 쉽게 이해할 수 있었으면 하는 바람에서다.

git이 하는 것이 정확히 무엇이냐?


어렸을 때 곧잘하던 게임인 슈퍼마리오 월드라는 게임의 이미지다. 이 이미지를 가져온 이유는 git의 가장 중점적인 개념인 commit과 branch를 보다 쉽게 이해하기 위함이다. 아까, git은 분산버전관리 시스템이라는 이야기를 했는데, 이 이야기인즉 특정 프로젝트의 히스토리 자체를 관리하는 어플리케이션이라는 말이다.

슈퍼마리오 월드라는 게임의 지도를 보면 Commit의 개념이 조금은 이해간다.


위의 line을 통해서 특정 포인트마다, 숫자가 적혀있고 이것들은 쭈욱 이어져있다.특정 포인트가 해결되어야 다음 포인트로 진행할 수 있고, 특정 포인트에서 부족했던 결과물들은 저장되어있어 차후에 그 스테이지를 다시 도전할 수 있는 방식으로 구성되어있다. 이것은 결국 피치를 구하기 위해 배관공이 진행하고 있는 게임의 스토리를 개발 과정에 빗대어 표현하면, 개별 스테이지는 commit이라고 이해할 수 있다. 그리고 마리오는 작업중인 branch를 표시해주는 것이라고 알 수 있다. 마리오를 통해서 완전히 이해하기는 어렵겠지만 게임의 세이브포인트에 비유해서 생각하면 Git의 workflow라는 것이 어느정도는 이해가 쉽게 된다.

branch와 merge

branch라는 것은 기본적으로 indicator라고 이해하는 것이 편하다고 생각했다. 처음에는 분기해서 나온 시점 자체가 branch인 것으로 이해했으나, branch를 이동시켜서 과거 시점의 것을 수정하거나 보완할 수 있다. 이를 통해서 지금은 되지만 전에 안됐던 곳으로 돌아가서 충돌하는 부분을 찾고 수정하거나 할 수 있다. 여러 개의 branch는 여러 개의 부서, 혹은 여러 사람들이라고 볼 수 있다. 다른 branch를 만든다는건 다른 이용자 혹은 개발자를 추가하는 것에 가깝다. 추상적으로 이해했으나 팀프로젝트를 통해 추가적으로 이해할 필요성을 느꼈다.

branch를 잘 사용해야 어떤 부분에 문제가 생겼을 때 세부적으로 파고들어가 문제를 해결하기 쉽겠다는 사실을 알았다. branch는 움직이지 않는 것이 아니라 움직이는 것, 그리고 어떤 시점을 가르키는 것. 이정도 개념만 가지고 있어도 잘 사용할 수 있다.

  • $ git branch : 현재 생성되어있는 branch 목록을 load한다.
  • $ git checkout -b {branch name} : 해당 이름의 브랜치를 생성하고, 그 브랜치로 이동한다.
  • $ git checkout {branch name} : 해당 이름의 브랜치로 이동한다.
    === git switch {branch name} : 동일한 기능이다.
  • $ git merge {branch name] : 현재 브랜치를 해당 이름의 브랜치로 병합한다.

merge라는 것은 branch의 병합이다. commit이 병합되는 것이 아니라, 사용자 혹은 시점이 병합되는 것이다. indicator가 병합된다고 이해하는 것이 쉽겠다.

Git에는 다양한 명령어와 기능이 존재한다.

어떤 것을 관리하기 위해서는 다양한 명령어들이 필요하다. 명령어들은 현재 진행중인 히스토리와 프로세스를 관리하는 방식들로 이루어져있다. 몇 가지 주요 명령어들을 체크해보자.

  • fork, clone
    : fork는 어떠한 프로세스 자체를 찍어서 끌고 오기위한 기능이다. 이를 통해 오픈소스나 오픈API를 찍어서 내 리모트 레파지토리에 두고 연구를 하거나 두고두고 읽을 수 있다. 쉽게 이야기하자면, 싸이월드의 퍼가요~같은 개념이지 않을까 싶다.
    : clone은 git주소를 이용해서, 내 로컬 레파지토리에 복사하는 기능이다. 두고두고 연구하고 읽기만 하는게 아니라 실질적으로 내 로컬로 가져와서 내부 내용을 수정하거나 변경하고 발전시킬 수 있다.

  • $ git remote -v
    : 레파지토리에 추가된 내용을 확인할 수 있다.

  • $ git add, commit, push
    : add는 변경사항을 staging area에 올리는 역할을 한다. 이것은 내 로컬에서 리모트 레파지토리로 올리기전에 미리 변경사항을 기록해두는 공간이다.
    : commit은 변경사항이 기록된 staging area에서 git remote로 변경사항들을 올리는 과정이다. 이 과정에서 commit에 붙는 message를 붙여둘 수 있다.
    : push를 통해서 git에 commit 사항을 반영한다. 이때부터 git의 히스토리에서 commit history를 확인할 수 있다.

  • $ git pull
    : 내 로컬에서 리모트 레파지토리(원격 리모트 포함)에서 변경사항을 가져올 때 사용하는 명령어다. git pull (저장소 이름) (가져올 branch name) 방식으로 사용할 수 있다. 만약 중복되는 변경사항 (동일한 부분을 수정했을 때)는 일종의 충돌오류가 발생한다. 파일이 추가되었을때 혹은, 코드가 추가되었을 때 모두 동일하다. 이 경우 수정사항을 내 것과 가져온 것 중에 선택할지 아니면 둘다 변경을 적용할지 선택할 수 있다.

    git pull origin master 라고 하면, origin(git의 내 remote repo)에서 master(내 repo의 branch, 초기에는 branch가 master 하나다.)로 변경사항을 가져오는 것으로 이해할 수 있다.

마치며

개인적으로 글을 정리해보면서 어느정도 개념이 정리되었지만, 아직 commit tree와 branch 그리고 merge에 대한 개념이 약하다는 것으로 파악되었다. 차후에 branch와 merge에 대한 내용을 좀 더 상세하게 다룰 수 있는 글을 적어봐야겠다.

profile
만물에 관심이 많은 잡학지식사전이자, 새로운 도전을 꿈꾸는 주니어 개발자 / 잡학지식에서 벗어나서 전문성을 가진 엔지니어로 거듭나자!

0개의 댓글