Git이란?
어떻게 하면 여러 사람이 동시에 같은 프로젝트의 개발을 진행할 수 있을까? Git은 동일한 소스 코드를 두 명 이상의 사람이 효과적으로 수정하고 협업할 수 있도록 도와주는 분산 버전 관리 시스템이다.
GitHub
GitHub는 전세계인이 소스 코드를 공유하고 오픈 소스 프로젝트를 진행할 수 있도록 도와주는 거대한 Git 저장소이다.
Git의 명령어
Git 저장소를 프로젝트의 소스 코드 사진을 찍어놓은 마법의 사진첩으로 비유할 수 있다. 여기서 각각의 사진은 프로젝트의 파일이라고 생각하면 된다.
우리는 이 사진첩에 새로운 사진을 추가하거나, 사진을 삭제하거나, 사진의 내용을 수정할 수 있다. Git은 이러한 사진첩의 사진(파일)들을 용이하게 관리하기 위한 명령어들을 제공한다.
init
새로운 Git 저장소를 생성한다. 새로운 프로젝트를 시작할 때 사용한다.
git init
사진첩을 생성하는 명령어라고 생각하면 된다.
clone
원격 저장소에 있는 프로젝트를 로컬에 복사한다. Github 레포지토리의 오른쪽 상단에 있는 초록색 버튼을 클릭하면 복사할 수 있는 주소를 확인할 수 있다.
커맨드라인에서 다음과 같이 입력하면 로컬에 프로젝트를 복사할 수 있다.
git clone <원격 저장소 주소>
공유용 사진첩을 복사해서 내껄로 만들었다고 생각하면 된다.
add
Git 저장소에 파일을 추가한다. 파일을 생성하거나 수정한 후에는 반드시 이 명령어를 사용해야 변경 사항을 Git에 반영할 수 있다.
예를 들어, hello.txt
파일을 생성하고 다음과 같이 입력하면 Git에 파일을 추가할 수 있다.
git add hello.txt
만약 모든 파일을 추가하고 싶다면 다음과 같이 입력하면 된다.
git add .
이는 새로운 변경 사항이 있을 때 사진을 찍어놓는 것과 같다. 아무리 멋진 코드를 썼다고 해도 사진을 찍어놓지 않으면 Git에 반영되지 않는다.
전문 용어로는 변경 내용을 스테이징 영역에 추가한다고 표현한다.
물론, 사진을 아무리 많이 찍어도 사진첩에 넣지 않으면 의미가 없다. 따라서 다음에 설명할 commit
명령어를 사용해야 한다.
commit
Git 저장소에 저장된 모든 수정 사항을 하나의 버전으로 만든다. 이 명령어를 사용하면 Git은 현재까지의 변경 내용을 하나의 버전으로 만들고, 그 버전에 대한 정보를 저장한다.
commit
명령어는 -m
뒤에 메세지를 입력함으로써 커밋에 대한 설명을 추가할 수 있다. 예를 들어, 웹사이트에 버튼을 추가했다고 하면 다음과 같이 입력할 수 있다.
git commit -m "버튼 추가"
여기서 잊지 말아야 할 것은 commit
을 하기 전에 add
를 해야 한다는 것이다. add
없이 commit
을 하면 아무 의미도 없는 커밋이 생성될 뿐이다.
branch & checkout
Git 저장소에 새로운 브랜치를 생성한다. 브랜치는 독립된 작업 공간으로, 여러 사람이 동시에 다른 작업을 진행할 수 있도록 도와준다.
예를 들어 철수와 영희가 게임을 만드는데 철수는 이즈리얼
, 영희는 티모
라는 캐릭터를 만들고 싶다고 하자.
그러면 철수는 다음 두가지 방법중 하나를 통해 새로운 브랜치를 생성할 수 있다.
git branch "이즈리얼-제작" --- git checkout -b "이즈리얼-제작"
첫번째는 브랜치를 생성하기만 하는 반면, 두번째는 브랜치를 생성하고 그 브랜치로 이동까지 하는 명령어이다.
마찬가지로 영희도 티모-제작
이라는 브랜치를 생성할 것이고, 철수와 영희는 각각의 브랜치에서 서로 방해받지 않고 작업을 진행할 수 있다.
만약 다른 브랜치로 이동하고 싶다면 다음과 같이 입력하면 된다.
git checkout <브랜치 이름>
merge
다른 브랜치의 변경 사항을 현재 브랜치에 병합한다. 예를 들어, 철수가 이즈리얼-제작
브랜치에서 작업을 마치고 티모-제작
브랜치와 병합하고 싶다면 다음과 같이 입력하면 된다.
git merge "티모-제작"
merge conflict
일반적으로는 두 브랜치의 변경 사항이 자동으로 합쳐지지만, 두 브랜치가 서로 같은 파일의 같은 부분을 수정했을 경우에는 자동으로 합쳐지지 않는다. 이를 merge conflict라고 한다.
이 경우 Git은 다음과 같은 메세지를 출력하고, 두 브랜치의 변경 사항을 보여준다.
Auto-merging <파일 이름> CONFLICT (content): Merge conflict in <파일 이름> Automatic merge failed; fix conflicts and then commit the result.
이 경우 수동으로 변경 사항을 합쳐야 한다. 아주 귀찮다.
push
로컬 Git 저장소에 있는 변경 사항(커밋)들을 원격 저장소에 업로드한다. 이를 통해 내가 작업한 내용을 다른 사람들과 공유하고 협업할 수 있다.
git push <원격 저장소 이름> <브랜치 이름>
여기서 기본적으로 clone
을 통해 원격 저장소를 복사하면 origin
이라는 이름이 붙는다. 원격 저장소의 이름은 git remote
명령어를 통해 확인할 수 있다. 또한, GitHub의 기본 브랜치 이름은 main
이므로 기본 브랜치에 커밋을 업로드하고 싶다면 다음과 같이 입력하면 된다.
git push origin main
사실 매번 푸시할 떄마다 origin
과 브랜치 이름을 입력하는 것은 귀찮다. 다행히도 -u
옵션을 사용하면 이후에는 git push
만 입력해도 이전에 입력한 원격 저장소와 브랜치에 자동으로 푸시된다.
git push -u origin main
또한, config
를 통해 기본 원격 저장소와 브랜치를 설정할 수도 있다.
git config --global push.default current
위와 같이 설정하면 앞으로 git push
명령어를 사용할 때 자동으로 현재 작업하고 있는 원격 저장소와 브랜치에 푸시하게 된다.
pull
원격 저장소에 있는 변경 사항(커밋)들을 로컬 Git 저장소에 불러와서 현재 작업 공간에 병합한다. 이를 통해 다른 사람들이 작업한 내용을 내 로컬 저장소에 반영할 수 있다.
git pull
.gitignore
프로젝트를 진행하다 보면 함께 원격 저장소에 올릴 필요가 없는 다양한 파일들이 생성된다. 예를 들어, VSCode의 설정 파일들이 저장되는 .vscode
폴더가 있다. 또한, 중요한 정보(데이터베이스 비밀번호 또는 API 키 등)를 포함하는 .env
파일은 보안상의 이유로 원격 저장소에 올리지 않는다.
이러한 파일들은 .gitignore
파일을 통해 지정해줄 수 있다. .gitignore
파일에 명시된 파일들은 Git에 의해 추적되지 않고 저장소에 저장되지 않는다.
.gitignore
파일은 다음과 같이 작성한다.
.vscode build node_modules .env *.log