Git을 쉽게 배우기: 버전 관리 초보자 가이드
Source: Dev.to
Git을 쉽게 배우기: 버전 관리 초보자 가이드
소개
버전 관리는 소프트웨어 개발에서 필수적인 도구이며, Git은 가장 널리 사용되는 시스템 중 하나입니다. 이 가이드는 Git의 기본 개념과 가장 흔히 사용하는 명령어들을 단계별로 설명하여, 처음 접하는 사람도 쉽게 따라 할 수 있도록 돕습니다.
버전 관리란?
버전 관리는 파일의 변경 이력을 추적하고, 여러 사람이 동시에 작업할 수 있게 해주는 시스템입니다. 주요 이점은 다음과 같습니다.
- 변경 기록: 언제, 누가, 어떤 내용을 수정했는지 확인 가능
- 협업: 여러 개발자가 같은 프로젝트에서 충돌 없이 작업 가능
- 복구: 실수로 파일을 삭제하거나 코드를 망가뜨렸을 때 이전 상태로 되돌릴 수 있음
왜 Git인가?
Git은 다음과 같은 이유로 많은 팀과 프로젝트에서 선택됩니다.
- 분산형 구조: 로컬 저장소가 전체 히스토리를 가지고 있어 네트워크가 없어도 작업 가능
- 속도: 커밋, 브랜치, 병합 등이 매우 빠름
- 강력한 브랜치 관리: 브랜치를 만들고 병합하는 것이 간단하고 안전함
Git 설치하기
Windows
- Git 공식 사이트에서 설치 파일을 다운로드합니다.
- 설치 마법사를 따라 진행하고, 기본 옵션을 그대로 두어도 무방합니다.
macOS
brew install git
Homebrew가 설치되어 있지 않다면, 먼저 Homebrew 공식 페이지를 참고하세요.
Linux
sudo apt-get update
sudo apt-get install git # Debian/Ubuntu 기반
sudo dnf install git # Fedora 기반
설치가 완료되면 터미널에서 git --version 명령어를 입력해 버전을 확인합니다.
기본 Git 워크플로우
- 저장소 초기화 – 새 프로젝트를 시작하거나 기존 폴더를 Git으로 관리합니다.
- 파일 추가 – 변경된 파일을 스테이징 영역에 올립니다.
- 커밋 – 스테이징된 파일을 로컬 히스토리에 저장합니다.
- 원격 저장소와 동기화 – GitHub, GitLab 등 외부 서버와 연결해 협업합니다.
자주 사용하는 명령어
| 명령어 | 설명 |
|---|---|
git init | 현재 디렉터리를 새 Git 저장소로 초기화 |
git clone <url> | 원격 저장소를 복제하여 로컬에 가져옴 |
git status | 작업 디렉터리와 스테이징 영역의 현재 상태 확인 |
git add <file> | 지정한 파일을 스테이징 영역에 추가 |
git commit -m "메시지" | 스테이징된 변경을 커밋하고 메시지 기록 |
git log | 커밋 히스토리를 리스트 형태로 표시 |
git diff | 아직 커밋되지 않은 변경 사항을 보여줌 |
git push | 로컬 커밋을 원격 저장소에 업로드 |
git pull | 원격 저장소의 최신 변경을 로컬에 가져와 병합 |
예시 워크플로우
git init
git add .
git commit -m "첫 커밋"
git remote add origin https://github.com/username/repo.git
git push -u origin master
브랜치와 병합
브랜치는 독립적인 작업 라인을 만들 때 사용합니다. 기본적인 흐름은 다음과 같습니다.
- 브랜치 생성
git branch feature/login - 브랜치 전환
또는git checkout feature/logingit switch feature/login - 작업 후 커밋
git add . git commit -m "로그인 기능 구현" - 메인 브랜치에 병합
git checkout master git merge feature/login
충돌 해결
병합 과정에서 파일이 동시에 수정된 경우 충돌이 발생합니다. 충돌이 난 파일을 열어 <<<<<<<, =======, >>>>>>> 표시를 찾아 적절히 수정한 뒤, 다시 커밋합니다.
git add conflicted-file.js
git commit -m "충돌 해결"
팁과 모범 사례
- 작은 커밋: 한 번에 너무 많은 변경을 포함하지 말고, 의미 있는 단위로 나누어 커밋합니다.
- 의미 있는 커밋 메시지: 무엇을, 왜 변경했는지 명확히 적습니다.
- 정기적인 푸시: 로컬만 작업하지 말고, 원격 저장소에 자주 푸시해 팀원과 동기화합니다.
.gitignore활용: 빌드 파일, 비밀키 등 추적할 필요 없는 파일은.gitignore에 추가합니다.- 브랜치 전략: Git Flow, GitHub Flow 등 팀에 맞는 브랜치 모델을 도입합니다.
결론
Git은 처음엔 복잡해 보일 수 있지만, 기본 명령어와 워크플로우만 익히면 강력한 협업 도구가 됩니다. 위 가이드를 따라 직접 실습해 보면서, 점차 고급 기능(리베이스, 체리픽, 서브모듈 등)도 탐구해 보세요. 꾸준히 사용하면 버전 관리가 자연스러운 습관이 될 것입니다. Happy coding!
Git
기술적인 관점에서: Git은 Distributed Version Control System (DVCS) 입니다.
간단히 말하면: Git은 여러분의 프로젝트를 위한 타임머신입니다. 코드를 수정할 때마다 모든 변화를 추적하므로, 문제가 생기면 이전의 정상 작동 상태로 “되감기” 할 수 있습니다.
왜 사용하나요?
- Collaboration – 여러 사람이 동시에 같은 파일을 작업할 수 있어 서로의 작업을 덮어쓰지 않습니다.
- Distributed architecture – 모든 개발자는 저장소의 전체 로컬 복사본(히스토리와 커밋)을 가지고 있습니다. 이는 오프라인 작업을 가능하게 하고 단일 장애 지점을 없애줍니다.
- Branching & merging – 개발자는 기능을 위해 별도의 브랜치를 만들고 나중에 이를 메인 브랜치에 병합합니다.
Terminology Dictionary
| Term | What it means |
|---|---|
| Repository (Repo) | 프로젝트 파일 전체와 전체 수정 이력을 포함하는 폴더. |
| Commit | 특정 시점의 코드 스냅샷; 고유 해시로 식별됩니다. |
| Staging Area | 다음 커밋을 위해 준비 중인 파일 목록. |
| Local | 개인 컴퓨터에 저장된 저장소. |
| Remote | 서버에 저장된 저장소(예: GitHub, GitLab). |
| Clone | 원격 저장소를 컴퓨터에 다운로드하는 것. |
| Push | 로컬 커밋을 원격 서버에 업로드하는 것. |
| Pull | 원격 서버의 변경 사항을 로컬 머신에 다운로드하는 것. |
| Merge | 한 브랜치의 코드를 다른 브랜치와 결합하는 것. |
| Branch | 코드의 병렬 버전; 변경 사항은 병합될 때까지 메인 프로젝트에 영향을 주지 않음. |
| HEAD | 현재 보고 있거나 작업 중인 커밋을 가리키는 포인터. |
| Origin | 클론한 원격 URL에 Git이 기본으로 부여하는 별명. |
| Pull Request (PR) | 브랜치를 메인 브랜치에 병합해 달라는 요청 (GitHub/GitLab에서 사용). |
핵심 아키텍처
명령어로 이동하기 전에, 세 단계에 대해 이해하세요:
- Working Directory (The Workbench) – 코드를 작성하는 실제 폴더입니다.
- Staging Area (The Box) – 작업대에서 특정 파일을 선택해 상자에 넣습니다.
- Local Repository (The Shipping Truck) – 상자를 봉인하고 라벨을 붙입니다. 이것이 commit이 되며, 프로젝트 히스토리의 영구적인 부분이 됩니다.

How a Repository Looks

src/– 실제 소스 코드를 포함하며, 프로젝트를 체계적으로 유지합니다..gitignore– Git이 의도적으로 무시해야 할 파일/폴더를 나열합니다(예: 비밀키).README.md– 프로젝트가 무엇이며 어떻게 실행하는지 설명하는 설명서입니다.LICENSE– 다른 사람이 코드를 어떻게 사용하거나 복사할 수 있는지 명시하는 법적 문서입니다..git/– Git이 전체 프로젝트 히스토리와 저장 지점을 저장하는 숨김 데이터베이스입니다.
개발자 워크플로우
초기화
Git에게 폴더를 감시하도록 알려줍니다:
git init
상태 확인
현재 저장소의 상태를 확인합니다:
git status
스테이징
index.html이라는 파일을 만들고 다시 git status를 실행하면 파일이 빨간색(추적되지 않음)으로 표시됩니다. 이를 스테이징 영역으로 옮깁니다:
git add index.html
팁: 한 번에 모든 변경 파일을 스테이징하려면 git add .를 사용합니다. 스테이징 후 git status는 파일을 녹색(저장 준비 완료)으로 표시합니다.
커밋
스냅샷을 히스토리에 저장합니다(메시지를 반드시 포함해야 합니다):
git commit -m "홈페이지 파일을 생성함"
-m = “메시지”.
편리한 단축키
이미 추적 중인 파일에 대해 스테이징과 커밋을 한 번에 수행합니다:
git commit -am "스타일을 업데이트함"
참고: 이는 새(추적되지 않은) 파일을 스테이징하지 않으며, 수정되거나 삭제된 추적 파일만 커밋합니다.
히스토리
전체 커밋 목록을 확인합니다:
git log
차이점
작업 디렉터리와 마지막 커밋 사이에 어떤 변화가 있었는지 보여줍니다:
git diff
이것이 기본적인 Git 워크플로우입니다. 여기서부터 브랜치, 원격 협업 및 Git이 제공하는 다양한 강력한 기능들을 탐색해 보세요. 즐거운 코딩 되세요!
Git 치트 시트
Diff
스테이징하거나 커밋할 때, 실제로 어떤 부분이 변경되었는지 항상 확인하세요.
git diff
Branching
브랜치 만들기
기본적으로 main(또는 master) 브랜치에 있습니다. 새 브랜치를 만들려면:
git branch dark-mode-feature
브랜치 전환
새 브랜치로 전환:
git checkout dark-mode-feature
최신 Git 버전에서는
git switch dark-mode-feature도 지원합니다.
병합
dark-mode-feature에서 코드를 작성하고 커밋 및 테스트를 마쳤다고 가정합니다. 이제 이를 main에 병합합니다.
-
main으로 다시 전환git checkout main -
기능 브랜치 병합
git merge dark-mode-feature
원격 저장소 사용하기
지금까지 모든 작업이 로컬에서 이루어졌습니다. 코드를 공유하려면 원격 저장소가 필요합니다.
클론
기존 저장소를 내 컴퓨터에 다운로드:
git clone
푸시
로컬 커밋을 원격 저장소에 업로드:
git push origin main
풀
원격 저장소의 새로운 변경 사항을 로컬 컴퓨터에 다운로드:
git pull
Stashing
새 기능을 작업 중인데(코드가 어수선하고 반쯤 깨짐) 갑자기 중요한 버그를 고쳐야 합니다. 작업이 끝나지 않아 브랜치를 전환할 수 없고, 아직 커밋도 할 수 없습니다. 변경 사항을 일시적으로 저장하세요:
git stash
Stash 팝
저장해 둔 변경 사항을 다시 가져오기:
git stash pop
Reset
때때로 너무 일찍 커밋을 하고 되돌리고 싶을 때가 있습니다. git reset은 HEAD를 지정한 커밋으로 이동시킵니다. 크게 두 가지 형태가 있습니다.
Soft Reset
커밋을 취소하지만 코드 변경 사항은 스테이징 영역에 그대로 남깁니다.
# 한 커밋 뒤로 이동 (변경 사항은 스테이징된 상태 유지)
git reset --soft HEAD~1
# 한 커밋 뒤로 이동 (변경 사항은 스테이징되지 않음) – mixed reset
git reset HEAD~1
# 특정 커밋으로 이동
git reset
Hard Reset
커밋을 취소하고 모든 변경 사항을 삭제합니다. 작업을 시작하기 전 상태로 완전히 되돌립니다.
# 한 커밋 뒤로 이동 (커밋 및 변경 사항 삭제)
git reset --hard HEAD~1
# 특정 커밋으로 이동 (모든 변경 사항 삭제)
git reset --hard
경고: 작업이 영구적으로 삭제됩니다. 신중히 사용하세요.
Revert
이미 공유된 main 브랜치에 잘못된 코드를 푸시한 경우, 히스토리를 삭제하는 reset을 사용할 수 없습니다(다른 사람이 이미 다운로드한 히스토리를 삭제하면 충돌이 발생합니다). 대신 잘못된 커밋을 되돌리는 새 커밋을 만드세요:
git revert
Cherry‑Pick
팀원이 큰 실험 브랜치에서 작은 버그를 하나의 커밋으로 수정했지만, 나머지 변경 사항은 원하지 않을 때. 해당 커밋만 내 브랜치에 적용합니다:
git cherry-pick
Rebase
기능 브랜치에서 작업 중인데, main 브랜치에 새로운 업데이트가 들어와 내 브랜치가 뒤처졌다고 가정합니다. 복잡한 병합 대신 rebase를 사용해 최신 main 위에 내 작업을 올려 선형 히스토리를 유지합니다:
git rebase main
팁
위급 상황에서는: git commit, git push를 실행하고 CI/CD 파이프라인이 나머지를 처리하도록 두세요.
— 익명 개발자