본문 바로가기
Computer Science

[Github] Managing Data with Git (fork, git clone, git checkout, git push)

by Henry Cho 2024. 9. 8.
728x90

포스트 난이도: HOO_Junior


# Git과 Github란?

컴퓨터 관련 전공인 브로들에게는 너무나도 익숙하면서 사실 막상 써보지 않으면 이름만 알고 할 줄 모르는 경우가 있는 Git(깃)과 Github(깃허브)에 대해서 이야기를 나눠볼까 한다. 산업뿐만 아니라 많은 연구 기관에서 인공지능 기반으로 한 데이터를 학습 모델링뿐만 아니라 간단한 데이터 분석에 있어서도 다양한 툴을 사용해서 결과를 산출해 낸다. 한마디로 더 이상 데이터 분석 및 시각화는 개발자가 할 수 있는 전문성 있는 일이 아니라 어느 전공이든 특히 의학 관련 전공은 데이터 분석 및 시각화 작업을 할 줄 알아야 한다. (사실 요새는 툴이나 프로그램이 많아서 쉽게 배울 수 있으니 겁을 먹지 말도록 하자.)

 

깃과 깃허브에 대한 설명은 인터넷에 검색해보면 정말 수두룩하게 찾아볼 수 있다. 그래서 간단히 요약하자면 깃은 깃은 명령어로 구성된 소프트웨어이고 깃허브는 깃을 사용하기 편하도록 제공되는 웹 기반의 인터페이스이자 클라우드 저장 공간이다. 가끔 컴퓨터 전공 학생 브로들도 깃이 프로그래밍 언어 아닌가요?라고 오해하는 경우가 있는데 그럴만할 정도로 깃에 대한 활용도가 이제는 보다 편리하고 다양한 기능들을 제공해주고 있다. 하지만 깃은 파이썬과 같이 하나의 언어가 아닌 시스템 또는 프로그램이라고 쉽게 생각하면 된다.

 

깃을 통해서 깃허브에 데이터를 공유하고 공유한 데이터를 다른 사람과 작업을 수행할 수 있다. 이때 가장 중요한 특징이자 기능이 바로 Version control이 가능하다는 것이다. 마치 우리가 파일에서 "버전"과 "일자" 또는 "수정한 사람"등을 파일명으로 입력해서 공유하듯이 이러한 부분을 시스템적으로 해결하여 프로젝트를 수행하거나 데이터에 대한 업데이트를 자동으로 입력되고 저장되게끔 만들어주는 것이다. 여기서 조금 더 나아가서 설명하자면 깃과 깃허브의 Traceability가 가능한 이유는 바로 Merkle tree 방식을 사용하고 있는 것이고 이것이 바로 블록체인의 기능 중 하나가 해당되는 셈이다.

 

아무튼 깃과 깃허브는 개발자들이 코딩에 대한 부분을 공유하고 문제점을 보완하는 목적으로 사용이 되다가 데이터 기반의 인공지능 활용이 커지면서 이제는 텍스트 기반의 데이터까지 공유하고 프로젝트를 같이 수행하는 목적으로 사용이 되고 있다. 더 나아가 개발자만의 깃과 깃허브를 개발자가 아닌 다양한 데이터 분석이 필요로한 전공 분야에서 활용되고 있기에 Medical 관련 전공 박사 브로도 이 부분에 대해서 배우고 있었다.


# VScode 추천

깃허브 계정 생성과 깃 설치는 아래 링크를 통해서 할 수 있다.

https://git-scm.com/

 

Git

 

git-scm.com

https://github.com/

 

GitHub: Let’s build from here

GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...

github.com

 

혹시나 깃과 깃허브 수업을 듣거나 처음 배우기 시작한다면 아마 명령프롬프트라고 불리는 CMD나 깃에서 명령어를 작성하고 깃허브에서 결과를 살펴보는 연습을 할 것이다. 기초를 다진다는 의미해서 가장 기초 툴을 가지고 연습하는 건데 개인적으로 VScode에서 바로 연습해도 상관없다고 본다. VScode에서 extension으로 깃과 관련된 다양한 툴들을 제공하고 있고 무엇보다 원하는 터미널을 선택해서 작업할 수 있다는 것도 편리한 이유 중에 하나이다.


# 깃허브에서 fork

앞서서 깃과 깃허브가 머클트리 방식을 가지고 있다고 했는데 쉽게 생각해서 나뭇가지가 뻗어나가는 걸 상상해보면 이해가 쉽다. 나무 몸통에서 시작해서 주요 가지들이 나오고 그 뒤에 수많은 작은 가지들이 나오듯이 깃허브를 통해서 기존 코드에 업데이트된 새로운 버전을 만들어내고 그 뒤에 또 다른 개발자가 추가로 변경된 사항을 넣어 새로운 버전의 코드를 작성해 나갈 수 있다. 이때 사용하는 가장 중요하면서 기본적인 기능이 바로 "fork"이다.  어렵게 생각하지 말고 그냥 음식 먹을 때 사용하는 포크를 생각하고 포크를 찔러서 나한테 가져온다고 생각하면 된다 (실제로는 나누다는 의미를 가지고 있다). 개인적으로 깃은 하나의 툴이기 때문에 굳이 하나하나 정확히 알아가며 공부해 나갈 필요 없이 기능만 쉽게 이해하고 잘 쓰면 된다.

 

fork 기능을 눌러서 본인의 repository에 저장하여 새로운 작은 나뭇가지를 만들어낼 수 있다. 앞선 버전과도 연결이 되어 있으며 추후에 코드나 데이터셋 업데이트 요청도 가능하다 (pull request). 원하는 repository를 검색해서 fork를 직접 해보는 것이 좋다.


# VScode에서 clone 과 checkout

깃허브에서 포크로 repository를 새로 생성했다면 주소에 본인 계정과 해당 repository 이름이 포함되어 있는 도메인이 생성되어 있는 것을 확인할 수 있다. 해당 주소가 바로 VScode에 연결해서 로컬 환경에서 작업을 하고 다시 깃허브로 업데이트된 부분을 보내서 공유하는 중요한 연결고리이다.

 

이제 VScode로 돌아와서 원하는 폴더를 설정하고 터미널에서 깃허브 repository를 연결해서 작업을 해보도록 하자.

git clone https://github.com/<YourUserName>/<repositoryName>.git
cd <repositoryName>

 

git clone을 통해서 도메인 주소를 입력해주고 나면 설정된 폴더 안에 repository 폴더가 새로 생성이 된다. 해당 폴더는 깃허브의 repository와 연결이 되어 있는 폴더이고 로컬 환경에서 작업 후에 깃허브로 전송이 가능하다. 그렇다면 cd를 통해서 해당 폴더로 접근해 보자. 참고로 깃도 명령어 기반이기 때문에 CMD에서 사용하는 명령어와 동일하다. 한마디로 어떤 터미널로 쓰든 간에 git clone, cd 등의 명령어를 사용하면 된다 (질문해 준 메디컬 박사 전공 학생분께 감사합니다).

git checkout -b <NewBranchName>

 

자 여기서 우리는 chekcout을 통해서 새로운 나뭇가지를 하나 더 만들어 줄 것이다. 그 이유는 현재 메인 가지밖에 없기 때문이다. 이게 무슨 소리냐면 repository를 들어가면 main이라고 되어 있으며 branch가 없다고 나와 있다. 작업을 할때 branch를 만드는 가장 중요한 이유는 우리가 테스트를 하는 데 있어서 main가지가 아니라 테스트용 작은 가지를 하나 더 만들어두는 셈이다. main 가지에서 코딩을 하거나 데이터를 새로 추가하는데 실수로 잘못한다면 되돌리기가 여간 귀찮고 때로는 어려울 수 있다. 특히 지금은 간단한 기능들을 배우는 단계이지만 다양한 사람들과 복잡한 빅데이터 분석 및 데이터 관리가 이뤄진다고 했을 때 작은 실수가 큰 문제를 만들 수 있어 또 다른 우리들만의 작은 가지를 만들어 작업을 하는 것이다. 또한 여러 가지들을 만들어서 각 파트별로 작업을 수행한 뒤의 하나의 main 가지고 합칠 수 있기에 checkout 기능을 잘 활용하는 것이 좋다.

git push -u origin <NewBranchName>

 

checkout을 했다면 git push를 통해서 github에도 업데이트를 해주면 된다. 지금까지 로컬 환경에서 가지를 만들었을 뿐 github에 보내진 않았기에 git push를 통해서 "새로운 가지 만들어줘!"를 깃허브에 보낼 수 있다. push가 밀다는 의미를 가졌들이 깃허브한테 밀어서 보낸다고 생각하면 이해하기 쉽다. 이 외에도 깃의 주요 기능들로 아래 명령어들을 사용해보면 좋다.

git status
git add <FileName>
git remote -v
git diff
git tag -a <version> -m
git merge <BranchName>

 

728x90

댓글