Git과 Github와의 만남
Git과 Github를 1-2 오픈소스SW기초 강의에서 처음 배웠던 것 같다. 그때는 그냥 Git은 버전 관리 시스템이고 Github는 코드를 저장하는 곳이라고만 생각했다. 강의 자료를 보니까 나름 branch도 배우고 pull request도 배웠는데 왜 기억이 안 날까...? ㅋㅋㅋㅜㅜ
그래도 기말 프로젝트를 진행할 때 Git과 Github를 쓴 기억은 있어서 레포지토리를 찾아봤다.
쓰긴 썼는데... 기껏 Git 기초 명령어(add, commit, push, pull, ...)를 다 배워놓고 그냥 파일만 냅다 올렸나 보다. 프로젝트를 하면서 힘들긴 했던 것 같다. 팀원들이 올린 zip 파일을 다운받고 압축을 풀고 내 코드에 복사하고... 지금 생각하면 너무 아찔하다. 🥲
기초 지식 정리하기
UMC 스터디를 진행하면서 서버와 클라이언트 지식이나 ERD 설계 말고도 Git과 Github를 프로젝트에서 어떤 방식으로 쓰는지도 배울 수 있었는데, 아직도 부족한 느낌이 들어서 아래 강의를 들으면서 가볍게 정리해보려고 한다.
1. Git과 Github란?
Git
컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다. 쉽게 말하면 게임에서 세이브 포인트를 설정하는 거랑 비슷하다. 원하는 지점에서 저장하면 언제든지 그 지점으로 돌아갈 수 있고, 게임이 꺼지더라도 세이브 포인트를 통해 어느 정도는 복구가 가능한 것처럼 내 컴퓨터에 있는 소스 코드를 버전을 통해 효율적으로 관리할 수 있게 해 준다.
버전 관리는 이런 것과 비슷하다. 소스 코드의 버전을 관리하면 과제를 수정했다가 오류를 발견해서 다시 고쳐야 하는데 예전 코드가 기억나지 않아 아찔해지는 그런 상황을 막을 수 있다. 운영체제론도 Github 좀 써볼걸...
Github
Git 저장소 호스팅을 지원하는 웹 서비스이다. Git만 사용하면 로컬 저장소까지만 소스 코드를 저장해 둘 수 있기 때문에 내 컴퓨터가 죽으면 안에 있는 소스 코드도 다 같이 죽는다. Github를 사용해야 원격 저장소에 소스 코드를 저장해 둘 수 있고, 다른 사람들과 쉽게 협업할 수 있게 된다. (main에서 branch를 파서 각자 기능을 구현하고 버그를 수정하는 작업들이 가능해진다.)
2. Git 기초 명령어
git config --global init.defaultBranch main
Git에서 기본 branch 명이 master에서 main으로 바뀌었다고 들었는데 내 Git에선 이게 바로 반영되지 않아 계속 master로 설정됐고, git push origin main 명령어를 실행할 때 오류를 계속 접했던 기억이 있다. 그땐 branch 명을 변경해서 오류를 해결했었다.(git branch -m master main)
그런데 Git을 설치한 뒤 cmd를 실행하고 git config --global init.defaultBranch main를 치면 기본 branch를 main으로 설정할 수 있다고 한다.
git config --global user.name "EUNJI"
git config --global user.email "kej431003@gmail.com"
git config --list
git config로 유저에 대한 기본 설정을 할 수 있고, --global option은 앞으로 이 컴퓨터에서 Git으로 관리하는 모든 프로젝트에 설정을 적용시키겠다는 뜻이다. --local option은 현재 작업 중인 프로젝트에만 적용하겠다는 뜻이다.
git config --list로 모든 설정을 확인할 수 있다.
dir
mkdir git
cd git
cd ..
Git을 GUI로 접한 사람들은 CLI로 접근하게 되면 어려움을 겪을 수 있다. 버튼만 누르면 commit이 되는데 왜 명령어로만 해야 하는지 궁금해했던 적도 있었는데, GUI로는 Git의 일부 기능만 구현해 둔 경우가 많고 Intellij나 VSCode에서 Git과 연동할 경우 결국 CLI로 해야 하기 때문에 Git CLI를 알아두면 좋다고 한다. (dir, cd, ., .., mkdir 등 필요할 때마다 검색하기!)
git init
git status
git add .
git commit -m "first commit"
git log
버전 관리를 하고 싶은 폴더에서 cmd에 git init을 입력하면 버전 관리를 시작할 수 있다. 그럼 .git(.으로 시작 = 숨김 파일/디렉토리)이라는 폴더가 생성된다. (로컬 저장소)
git status를 치면 폴더에 있는 파일들이 어떤 상태인지를 알 수 있다. untracked files는 workspace(현재 작업 중인 디렉터리)에 존재하는 파일들을 말한다.
이후 git add .을 치면 untracked files가 changes to be committed로 바뀌게 된다. 추적되지 않는 파일에서 commit 할 준비가 된 상태라고 보면 된다. commit할 준비가 된 파일들은 staging area에 올라가게 되고 이 상태에선 아직 버전으로 관리되지 않는다.
git commit -m "initial commit"을 치면 staging area에 있던 파일들이 로컬 저장소(.git)로 전달되고 저장소에 있는 파일들은 버전을 관리할 수 있다. -m "" option으로 내가 commit 한 내용에 대한 정보를 기록할 수 있다. 아무 말이나 적는 것보단 추가, 수정, 삭제 등 변경 사항을 적어야 한다. 메시지만 보고도 어떤 내용이 변한 건지 알 수 있어야 버전 관리가 쉬워진다.
git log 명령어를 통해 변경사항을 확인할 수 있다. commit 뒤에 적힌 건 세이브 포인트라고 보면 된다. 나중에 reset을 할 때 이 지점으로 돌아올 수 있다.
파일을 하나 수정하고 다시 commit까지 해보자. 처음 commit 한 상태로 돌아가고 싶다면 git reset --hard 뒤에 위에 말한 commit 해시코드를 복사해 붙이면 된다. 해시코드를 입력하지 않으면 마지막으로 commit한 상태로 돌아간다. (두 번째 commit한 상태는 로컬에선 없어지기 때문에 돌아가고 싶다면 Github를 이용해야 함)
--hard option은 돌아가려는 commit 이후의 모든 내용을 지우고, staging area와 workspace도 돌아가려는 commit과 같아진다.
--soft option은 돌아가려는 commit으로 되돌아가고, HEAD가 돌아가려는 commit을 새롭게 가리키게 되며 staging area와 workspace는 변화가 생기지 않는다.
--mixed option은 soft와 동일하지만 staging area가 돌아가려는 commit과 같아지는 것만 다르다.
option들은 직접 써야 할 상황을 만나게 될 때 찾아보면서 배우는 게 나을 것 같다.
3. Git과 Github 연동하기
대충 큰 그림은 아래와 같다. local repository까지가 로컬 저장소고 remote repository가 Github의 원격 저장소다.
Git과 Github를 연동하기 위해선 내 컴퓨터에 버전 관리를 하고 있는 디렉터리가 있어야 하고, git config에 Github에 설정한 이름, 이메일과 동일하게 기본 설정을 해야 한다. 이후 작업 중이던 디렉터리의 cmd에 git remote add origin <연동할 Github repository 주소>를 치면 Github에 만든 repository를 로컬과 연동할 수 있다. 여기서 origin은 연동한 repository의 별명이라고 보면 된다.
git push origin main를 치면 내 로컬 저장소에 있는 걸 원격 저장소(origin의 main branch)에 올릴 수 있다. 이제 원격 저장소에서 내가 올린 파일이나 commit으로 반영된 정보, 메시지 등을 확인할 수 있다.
로컬에서 작업 중이던 디렉터리가 지워졌더라도 원격 저장소에 올려둔 것을 로컬로 가져올 수 있다. 디렉터리를 가져오고 싶은 폴더에서 git clone <Github repository 주소>를 치면 원격 저장소의 주소에 있는 디렉터리가 통째로 복사(clone)된다.
서버에서 생긴 변경사항을 로컬로 가져오고 싶을 땐 git pull origin main을 치면 된다. 변경사항을 당겨온다(pull)는 뜻이고 workspace를 보면 변경사항이 적용된 걸 확인할 수 있다.
Git과 Github를 연동하면 Git의 commit log가 Github에 모두 기록된다. Git에 commit을 5번 한 뒤 처음 commit으로 돌아가면 그 뒤에 한 모든 commit 정보는 날아가기 때문에 디렉터리를 삭제하고 원격 저장소에서 다시 clone 하거나 Github의 commit 기록에서 해시코드를 복사해 git reset --hard <해시코드>를 쳐서 돌아갈 수 있다.
마무리
지금 UMC 스터디에서 Github에 미션 내용을 올릴 때 가끔은 명령어 순서를 까먹기도 했고, 명령어를 빼먹기도 했다. 오류 처리하느라 구글링 실력은 확실히 는 것 같다. 실전으로 배우는 게 좋다곤 하지만... 맨 땅에 머리 박는 것보단 앞으론 이해를 좀 하면서 공부해야겠다. 🫠