Git 기초 - 버전 관리의 시작
Git & GitHub 협업 마스터 시리즈 1편
들어가며: 왜 버전 관리가 필요한가?
개발을 하다 보면 누구나 한 번쯤은 이런 경험을 해봤을 겁니다. "어제 작업한 코드가 더 나았는데...", "이 기능 추가하기 전으로 돌아가고 싶다", "동료가 수정한 부분이랑 내가 수정한 부분이 충돌해서 난리가 났다". 파일 이름 뒤에 날짜를 붙이거나, "최종", "진짜최종", "진짜진짜최종" 같은 접미사를 붙여본 경험, 다들 있으시죠?
이런 문제를 해결하기 위해 등장한 것이 바로 버전 관리 시스템(Version Control System, VCS)입니다. 그리고 현재 전 세계 개발자들이 가장 많이 사용하는 버전 관리 시스템이 바로 오늘 배울 Git입니다.
Git은 2005년 리눅스 커널 개발을 위해 리누스 토르발스가 만들었습니다. 처음에는 리눅스 개발팀 내부에서만 사용했지만, 그 뛰어난 성능과 유연성 덕분에 이제는 소프트웨어 개발의 표준 도구가 되었습니다. 스타트업부터 대기업까지, 1인 개발자부터 수천 명이 참여하는 오픈소스 프로젝트까지, Git 없이는 현대 소프트웨어 개발을 상상하기 어려울 정도입니다.
이번 글에서는 Git의 기본 개념부터 실무에서 바로 쓸 수 있는 명령어까지 차근차근 알아보겠습니다. 처음 Git을 접하는 분들도 이 글을 따라하면 기본적인 버전 관리를 시작할 수 있을 겁니다.
1. Git 설치하기
Git을 사용하려면 먼저 컴퓨터에 설치해야 합니다. 운영체제별로 설치 방법이 조금씩 다르니, 본인의 환경에 맞는 방법을 따라해 보세요.
1.1 Windows에서 설치하기
Windows 사용자라면 Git 공식 사이트에서 설치 파일을 다운로드하는 것이 가장 간편합니다.
- git-scm.com/download/win에 접속합니다.
- 자동으로 다운로드가 시작됩니다. 시작되지 않으면 "Click here to download manually"를 클릭하세요.
- 다운로드된 설치 파일을 실행합니다.
- 설치 과정에서 대부분의 옵션은 기본값을 그대로 사용해도 됩니다.
- 다만, "Adjusting your PATH environment" 단계에서는 "Git from the command line and also from 3rd-party software"를 선택하는 것을 권장합니다.
설치가 완료되면 시작 메뉴에서 "Git Bash"를 찾아 실행해 보세요. 이 터미널에서 Git 명령어를 사용할 수 있습니다.
1.2 macOS에서 설치하기
macOS에서는 여러 가지 방법으로 Git을 설치할 수 있습니다.
방법 1: Xcode Command Line Tools 사용
터미널을 열고 다음 명령어를 입력하면 됩니다.
xcode-select --install
팝업 창이 나타나면 "설치"를 클릭하세요. Git을 포함한 개발 도구들이 함께 설치됩니다.
방법 2: Homebrew 사용
Homebrew가 설치되어 있다면 더 간단합니다.
brew install git
1.3 Linux에서 설치하기
Linux 배포판별로 패키지 관리자를 사용하면 됩니다.
Ubuntu/Debian 계열:
sudo apt update
sudo apt install git
Fedora/CentOS/RHEL 계열:
sudo dnf install git
# 또는 구버전의 경우
sudo yum install git
1.4 설치 확인
어떤 운영체제든 설치가 완료되면 터미널에서 다음 명령어로 확인해 보세요.
git --version
git version 2.x.x와 같은 형태로 버전이 출력되면 설치가 완료된 것입니다.
2. Git 초기 설정
Git을 처음 설치했다면 몇 가지 기본 설정을 해줘야 합니다. 이 설정은 한 번만 하면 되고, 나중에 언제든 변경할 수 있습니다.
2.1 사용자 정보 설정
Git은 코드를 커밋할 때마다 누가 작성했는지 기록합니다. 그래서 먼저 본인의 이름과 이메일을 설정해야 합니다.
# 사용자 이름 설정
git config --global user.name "홍길동"
# 이메일 설정
git config --global user.email "hong@example.com"
--global 옵션을 사용하면 이 컴퓨터의 모든 Git 저장소에서 이 설정을 사용합니다. 특정 프로젝트에서만 다른 정보를 사용하고 싶다면, 해당 프로젝트 폴더에서 --global 없이 같은 명령어를 실행하면 됩니다.
2.2 기본 편집기 설정
Git은 커밋 메시지를 작성할 때 텍스트 편집기를 엽니다. 기본값은 Vim인데, Vim에 익숙하지 않다면 다른 편집기로 변경할 수 있습니다.
# VS Code 사용
git config --global core.editor "code --wait"
# Notepad++ 사용 (Windows)
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
# nano 사용 (Linux/macOS)
git config --global core.editor "nano"
2.3 설정 확인
현재 설정된 내용을 확인하려면 다음 명령어를 사용합니다.
# 모든 설정 확인
git config --list
# 특정 설정만 확인
git config user.name
git config user.email
3. Git의 핵심 개념 이해하기
Git을 제대로 사용하려면 몇 가지 핵심 개념을 이해해야 합니다. 처음에는 조금 헷갈릴 수 있지만, 이 개념들을 이해하면 Git의 모든 명령어가 논리적으로 연결됩니다.
3.1 세 가지 영역: Working Directory, Staging Area, Repository
Git은 파일을 세 가지 영역으로 관리합니다.
Working Directory (작업 디렉토리)
실제로 파일을 편집하는 공간입니다. 여러분이 코드를 작성하고 수정하는 바로 그 폴더입니다. 이 영역의 파일들은 Git이 "추적 중(tracked)"일 수도 있고 "추적하지 않음(untracked)"일 수도 있습니다.
Staging Area (스테이징 영역, Index)
다음 커밋에 포함시킬 파일들을 준비하는 공간입니다. "이 파일들의 현재 상태를 저장하겠다"고 표시하는 것과 같습니다. git add 명령어로 파일을 이 영역에 올립니다.
Repository (저장소)
Git이 모든 버전 정보를 저장하는 공간입니다. 프로젝트 폴더 안의 .git 폴더가 바로 이 저장소입니다. git commit 명령어로 스테이징된 파일들을 여기에 영구적으로 기록합니다.
쉽게 비유하자면, 사진첩을 만드는 과정과 비슷합니다. Working Directory는 카메라 롤에 있는 모든 사진, Staging Area는 "이번 앨범에 넣을 사진들"로 선택한 것들, Repository는 실제로 인화해서 앨범에 붙인 사진들이라고 생각하면 됩니다.
3.2 파일의 상태
Git에서 파일은 다음과 같은 상태를 가질 수 있습니다.
- Untracked: Git이 아직 추적하지 않는 새 파일
- Staged: 스테이징 영역에 추가된 파일
- Modified: 수정되었지만 아직 스테이징되지 않은 파일
- Committed (Unmodified): 저장소에 안전하게 저장된 파일
4. 기본 명령어 마스터하기
이제 실제로 Git을 사용해봅시다. 가장 자주 사용하는 기본 명령어들을 하나씩 살펴보겠습니다.
4.1 git init - 저장소 생성
새 프로젝트를 시작할 때 가장 먼저 실행하는 명령어입니다.
# 새 폴더를 만들고 Git 저장소 초기화
mkdir my-project
cd my-project
git init
이 명령어를 실행하면 현재 폴더에 .git이라는 숨겨진 폴더가 생성됩니다. 이 폴더 안에 Git이 버전 관리에 필요한 모든 정보를 저장합니다.
4.2 git status - 상태 확인
현재 작업 디렉토리와 스테이징 영역의 상태를 확인합니다. Git을 사용하면서 가장 자주 실행하게 될 명령어입니다.
git status
출력 결과를 통해 어떤 파일이 수정되었는지, 어떤 파일이 스테이징되었는지, 어떤 파일이 추적되지 않는지 한눈에 확인할 수 있습니다.
4.3 git add - 스테이징
파일을 스테이징 영역에 추가합니다.
# 특정 파일만 스테이징
git add index.html
# 여러 파일 스테이징
git add index.html style.css script.js
# 현재 폴더의 모든 변경사항 스테이징
git add .
# 특정 확장자의 파일만 스테이징
git add *.js
팁: git add .은 편리하지만, 실수로 불필요한 파일까지 스테이징할 수 있습니다. 커밋 전에 git status로 스테이징된 파일을 꼭 확인하세요.
4.4 git commit - 변경사항 저장
스테이징된 파일들을 저장소에 기록합니다.
# 커밋 메시지와 함께 커밋
git commit -m "로그인 기능 구현"
# 스테이징과 커밋을 한 번에 (이미 추적 중인 파일만)
git commit -am "버그 수정"
좋은 커밋 메시지 작성하기
커밋 메시지는 나중에 변경 이력을 확인할 때 매우 중요합니다. 다음 규칙을 따르면 좋습니다.
- 무엇을 변경했는지 명확하게 작성
- 현재형으로 작성 (예: "Add feature" 또는 "기능 추가")
- 첫 줄은 50자 이내로 요약
- 필요하다면 빈 줄 후에 상세 설명 추가
4.5 git log - 커밋 이력 확인
지금까지의 커밋 이력을 확인합니다.
# 기본 로그 보기
git log
# 한 줄로 간단하게 보기
git log --oneline
# 그래프로 브랜치 구조 보기
git log --oneline --graph
# 최근 5개 커밋만 보기
git log -5
# 특정 파일의 변경 이력 보기
git log -- index.html
4.6 git diff - 변경 내용 확인
파일의 구체적인 변경 내용을 확인합니다.
# 작업 디렉토리와 스테이징 영역 비교
git diff
# 스테이징 영역과 마지막 커밋 비교
git diff --staged
# 두 커밋 간의 차이 비교
git diff abc123 def456
# 특정 파일만 비교
git diff index.html
5. .gitignore 파일 설정하기
프로젝트에는 Git으로 관리하지 않아야 하는 파일들이 있습니다. 예를 들어 빌드 결과물, 로그 파일, API 키가 담긴 설정 파일, node_modules 같은 의존성 폴더 등이 그렇습니다. 이런 파일들을 무시하도록 설정하는 것이 .gitignore 파일입니다.
5.1 .gitignore 파일 만들기
프로젝트 루트 폴더에 .gitignore 파일을 만들고, 무시할 파일이나 폴더의 패턴을 작성합니다.
# 운영체제 관련 파일
.DS_Store
Thumbs.db
# 에디터/IDE 설정 파일
.vscode/
.idea/
*.swp
# 의존성 폴더
node_modules/
vendor/
# 빌드 결과물
dist/
build/
*.min.js
*.min.css
# 로그 파일
*.log
logs/
# 환경 설정 파일 (민감 정보)
.env
.env.local
config/secrets.yml
# 캐시
.cache/
__pycache__/
*.pyc
5.2 .gitignore 패턴 문법
#으로 시작하는 줄은 주석*는 0개 이상의 문자와 매칭?는 정확히 1개의 문자와 매칭/로 시작하면 현재 폴더만 해당/로 끝나면 폴더를 의미!로 시작하면 예외 처리 (무시하지 않음)
# 모든 .txt 파일 무시
*.txt
# 하지만 important.txt는 추적
!important.txt
# 루트의 TODO 파일만 무시 (하위 폴더의 TODO는 추적)
/TODO
# build 폴더 전체 무시
build/
# doc 폴더 안의 .txt 파일만 무시
doc/**/*.txt
5.3 이미 추적 중인 파일 무시하기
.gitignore에 추가했는데도 파일이 계속 추적된다면, 이미 Git이 추적을 시작한 파일이기 때문입니다. 이 경우 캐시를 삭제해야 합니다.
# 특정 파일의 추적 중지 (파일은 삭제하지 않음)
git rm --cached config.json
# 폴더의 추적 중지
git rm -r --cached node_modules/
# 변경사항 커밋
git commit -m "Add gitignore and remove tracked files"
6. 실수 되돌리기
Git의 가장 강력한 기능 중 하나는 실수를 되돌릴 수 있다는 것입니다. 상황에 따라 다른 명령어를 사용합니다.
6.1 스테이징 취소하기
실수로 파일을 스테이징했다면 다음 명령어로 취소할 수 있습니다.
# 특정 파일의 스테이징 취소
git restore --staged index.html
# 모든 파일의 스테이징 취소
git restore --staged .
6.2 파일 수정 취소하기
작업 디렉토리의 변경사항을 버리고 마지막 커밋 상태로 되돌리려면:
# 특정 파일을 마지막 커밋 상태로 복원
git restore index.html
# 주의: 이 명령어는 변경사항을 완전히 삭제합니다!
# 저장하지 않은 작업은 복구할 수 없습니다.
6.3 git reset - 커밋 되돌리기
git reset은 커밋을 취소하는 명령어입니다. 세 가지 모드가 있습니다.
# --soft: 커밋만 취소, 변경사항은 스테이징 상태로 유지
git reset --soft HEAD~1
# --mixed (기본값): 커밋 취소, 변경사항은 작업 디렉토리에 유지
git reset HEAD~1
# --hard: 커밋 취소, 변경사항도 완전히 삭제 (주의!)
git reset --hard HEAD~1
HEAD~1은 "현재 커밋의 1단계 전"을 의미합니다. HEAD~3은 3단계 전 커밋을 의미합니다.
주의:
git reset --hard는 변경사항을 완전히 삭제합니다. 다른 사람과 공유한 커밋을 reset하면 큰 문제가 발생할 수 있으니, 로컬에서만 사용하세요.
6.4 git revert - 안전하게 되돌리기
git revert는 특정 커밋의 변경사항을 취소하는 새로운 커밋을 만듭니다. 이미 공유된 커밋을 되돌릴 때 안전하게 사용할 수 있습니다.
# 특정 커밋 되돌리기
git revert abc123
# 최근 커밋 되돌리기
git revert HEAD
reset과 달리 revert는 이력을 삭제하지 않고 새로운 커밋을 추가하기 때문에, 협업 환경에서 더 안전합니다.
7. 실전 예시와 팁
7.1 전형적인 Git 워크플로우
실제 개발할 때 Git을 어떻게 사용하는지 예시로 살펴보겠습니다.
# 1. 새 프로젝트 시작
mkdir my-website
cd my-website
git init
# 2. 파일 생성 및 첫 커밋
echo "<h1>Hello World</h1>" > index.html
git add index.html
git commit -m "프로젝트 초기화: index.html 생성"
# 3. 기능 개발
# (파일 수정...)
git status # 변경사항 확인
git diff # 구체적인 변경 내용 확인
git add .
git commit -m "헤더 네비게이션 추가"
# 4. 실수했을 때
git log --oneline # 이력 확인
git reset --soft HEAD~1 # 커밋 취소하고 다시 작업
# (수정 후)
git add .
git commit -m "헤더 네비게이션 추가 (버그 수정)"
7.2 유용한 Git 별칭(Alias) 설정
자주 사용하는 긴 명령어를 짧게 줄여서 사용할 수 있습니다.
# 별칭 설정
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --all"
# 사용 예시
git st # git status와 동일
git lg # 예쁜 로그 그래프
7.3 자주 하는 실수와 해결법
커밋 메시지를 잘못 작성했을 때:
git commit --amend -m "수정된 커밋 메시지"
파일을 깜빡하고 커밋했을 때:
git add forgotten-file.txt
git commit --amend --no-edit
잘못된 브랜치에서 작업했을 때:
# 현재 변경사항 임시 저장
git stash
# 올바른 브랜치로 이동
git checkout correct-branch
# 변경사항 복원
git stash pop
마치며
이번 글에서는 Git의 기초를 살펴봤습니다. Git 설치부터 기본 명령어, .gitignore 설정, 그리고 실수를 되돌리는 방법까지 다뤘습니다. 처음에는 명령어가 많아서 헷갈릴 수 있지만, 실제로 사용하다 보면 금방 손에 익습니다.
오늘 배운 내용만으로도 혼자서 프로젝트의 버전 관리를 할 수 있습니다. 하지만 Git의 진정한 힘은 협업에서 발휘됩니다. 다음 글에서는 GitHub를 활용한 원격 저장소 관리와 협업 방법에 대해 알아보겠습니다.
Git은 처음에는 어렵게 느껴질 수 있지만, 한 번 익숙해지면 개발 생산성을 크게 높여주는 필수 도구입니다. 오늘 배운 명령어들을 실제 프로젝트에 적용해 보시고, 모르는 부분이 있으면 git help [명령어]를 활용해 보세요. Git과 함께하는 즐거운 개발 여정이 되길 바랍니다!