Git 개념 설명서
1. Git이란?
Git은 소스 코드와 문서의 변경 이력을 관리하는 분산 버전 관리 시스템(DVCS)이다. 파일이 언제, 어떻게, 왜 변경되었는지 기록하고 필요할 때 이전 상태로 되돌릴 수 있다.
Git은 중앙 서버에만 의존하지 않는다. 각 개발자의 컴퓨터에 저장소 전체 이력이 복제되므로 오프라인에서도 커밋, 로그 확인, 브랜치 생성과 같은 작업을 수행할 수 있다.
2. Git의 핵심 구조
Git 작업은 다음 세 영역을 중심으로 이루어진다.
Working Directory → Staging Area → Local Repository ↔ Remote Repository
파일을 수정 커밋할 변경 선택 커밋과 이력 저장 GitHub 등 공유 저장소
2.1 Working Directory
현재 작업 중인 실제 파일이 있는 공간이다. 파일을 새로 만들거나 수정하면 변경 사항이 먼저 이 영역에 나타난다.
2.2 Staging Area
다음 커밋에 포함할 변경 사항을 임시로 선택하는 공간이다. 여러 파일을 수정했더라도 일부 파일만 골라 하나의 커밋으로 만들 수 있다.
2.3 Local Repository
개발자의 컴퓨터에 있는 Git 저장소다. git commit으로 생성한 커밋과 브랜치, 태그 등의 이력이 저장된다.
2.4 Remote Repository
GitHub, GitLab, Bitbucket 등의 서버에 있는 공유 저장소다. 팀원 간 코드 공유와 백업에 사용한다.
3. 기본 용어
| 용어 | 의미 |
|---|---|
| Repository(저장소) | 프로젝트 파일과 변경 이력을 함께 관리하는 공간 |
| Commit(커밋) | 특정 시점의 변경 내용을 기록한 스냅샷 |
| Branch(브랜치) | 독립적인 작업 흐름을 가리키는 포인터 |
| HEAD | 현재 체크아웃된 커밋 또는 브랜치를 가리키는 참조 |
| Merge(병합) | 한 브랜치의 변경 사항을 다른 브랜치에 합치는 작업 |
| Rebase | 기준 브랜치 위에 커밋을 다시 적용해 이력을 정리하는 작업 |
| Tag(태그) | 특정 커밋에 붙이는 고정된 이름. 보통 버전 표시에 사용 |
| Clone | 원격 저장소를 로컬로 처음 복사하는 작업 |
| Fetch | 원격 저장소의 최신 이력만 가져오는 작업 |
| Pull | 원격 이력을 가져온 뒤 현재 브랜치에 반영하는 작업 |
| Push | 로컬 커밋을 원격 저장소에 올리는 작업 |
| Conflict(충돌) | 같은 부분을 서로 다르게 수정해 Git이 자동 병합하지 못하는 상태 |
4. 변경 상태
파일은 다음 상태를 거칠 수 있다.
- Untracked: Git이 아직 관리하지 않는 새 파일
- Modified: 추적 중인 파일이 수정된 상태
- Staged: 다음 커밋에 포함하도록 선택된 상태
- Committed: 로컬 저장소에 커밋으로 기록된 상태
- Pushed: 원격 저장소에도 업로드된 상태
상태는 다음 명령으로 확인한다.
git status
5. 커밋의 개념
커밋은 단순히 파일을 저장하는 행위가 아니라, 변경된 파일의 스냅샷과 작성자·시간·메시지·부모 커밋 정보를 기록하는 작업이다.
좋은 커밋은 다음 특징을 가진다.
- 하나의 목적을 가진다.
- 메시지만 읽어도 변경 의도를 알 수 있다.
- 서로 무관한 수정 사항을 한 커밋에 섞지 않는다.
- 애플리케이션이 동작 가능한 단위로 자주 기록한다.
예시:
git add src/login.js
git commit -m "로그인 실패 메시지 개선"
6. 브랜치의 개념
브랜치는 커밋을 가리키는 이동 가능한 이름이다. 일반적으로 안정적인 기준 브랜치에서 기능별 브랜치를 만들어 독립적으로 작업한다.
master ──●────●────────●────●
\
feature/login ●────●────
일반적인 브랜치 예시는 다음과 같다.
main또는master: 배포 가능한 안정 버전develop: 여러 기능을 통합하는 개발 브랜치feature/*: 기능 개발fix/*: 일반적인 버그 수정hotfix/*: 운영 중인 긴급 수정
브랜치 관련 명령:
git branch # 로컬 브랜치 목록
git switch -c feature/login # 새 브랜치 생성 후 이동
git switch master # 기존 브랜치로 이동
git branch -d feature/login # 병합된 로컬 브랜치 삭제
7. 원격 저장소와 동기화
원격 저장소를 사용하는 기본 흐름은 다음과 같다.
git clone https://example.com/project.git
git switch -c feature/profile
# 파일 수정 후
git add .
git commit -m "프로필 화면 추가"
git push -u origin feature/profile
다른 사람의 변경 사항을 확인하고 반영할 때는 다음 명령을 사용한다.
git fetch origin
git pull --rebase origin master
fetch는 원격 정보를 가져오기만 하고 작업 파일을 바꾸지 않는다. pull은 보통 fetch와 현재 브랜치 반영을 함께 수행한다.
8. Merge와 Rebase
Merge
두 브랜치의 이력을 그대로 보존하면서 병합 커밋을 만들 수 있다.
git switch master
git merge feature/login
장점은 이력이 안전하게 보존된다는 점이고, 단점은 병합 커밋이 많아져 그래프가 복잡해질 수 있다는 점이다.
Rebase
현재 브랜치의 커밋을 다른 기준점 위에 다시 적용한다.
git switch feature/login
git rebase master
이력이 직선적으로 정리되지만, 이미 다른 사람과 공유한 커밋을 rebase하면 커밋 ID가 바뀔 수 있다. 따라서 공유된 브랜치의 이력을 함부로 rebase하지 않는 것이 안전하다.
9. 충돌 해결
충돌은 같은 파일의 같은 영역을 서로 다르게 수정했을 때 발생한다. 충돌이 발생하면 파일에 다음과 같은 표시가 남는다.
<<<<<<< HEAD
현재 브랜치의 내용
=======
병합하려는 브랜치의 내용
>>>>>>> feature/login
해결 순서는 다음과 같다.
- 충돌 표시를 확인한다.
- 최종적으로 남길 내용을 직접 수정한다.
- 충돌 표시를 모두 제거한다.
- 해결한 파일을 스테이징한다.
- 병합 또는 rebase를 계속한다.
git add 충돌이-해결된-파일
git commit # merge 충돌 해결
# 또는
git rebase --continue # rebase 충돌 해결
작업을 취소하려면 상황에 맞게 다음 명령을 사용한다.
git merge --abort
git rebase --abort
10. 되돌리기 명령 비교
| 명령 | 용도 | 주의점 |
|---|---|---|
git restore file |
작업 디렉터리의 수정 취소 | 수정 내용이 사라질 수 있음 |
git restore --staged file |
스테이징 취소 | 파일 수정 내용은 남음 |
git commit --amend |
가장 최근 커밋 수정 | 이미 공유한 커밋에는 주의 |
git revert <commit> |
기존 커밋을 취소하는 새 커밋 생성 | 공유된 이력을 안전하게 되돌릴 때 적합 |
git reset |
브랜치와 HEAD를 과거로 이동 | 옵션에 따라 커밋·스테이징·파일이 삭제될 수 있음 |
공유 저장소에 이미 올린 커밋은 일반적으로 reset보다 revert가 안전하다.
11. 자주 사용하는 명령
git init # 현재 폴더를 Git 저장소로 초기화
git status # 현재 변경 상태 확인
git diff # 스테이징 전 변경 내용 확인
git diff --staged # 스테이징된 변경 내용 확인
git log --oneline --graph # 커밋 이력을 간단한 그래프로 확인
git show <commit> # 특정 커밋의 상세 내용 확인
git remote -v # 원격 저장소 주소 확인
git tag v1.0.0 # 현재 커밋에 태그 생성
git push origin --tags # 태그를 원격에 업로드
12. 권장 협업 흐름
최신 main 동기화
↓
기능 브랜치 생성
↓
작은 단위로 수정·커밋
↓
원격 브랜치 push
↓
Pull Request 생성 및 리뷰
↓
테스트·충돌 확인
↓
main에 병합
실무에서는 다음 원칙이 특히 중요하다.
main에 직접 작업하지 않고 목적별 브랜치를 사용한다.- 커밋 메시지는 변경 목적을 중심으로 작성한다.
- 커밋 전에
git diff와 테스트 결과를 확인한다. - 비밀번호, API 키, 인증서 등 민감 정보를 커밋하지 않는다.
.gitignore에 빌드 결과물, 로그, 로컬 설정 파일을 등록한다.- 공유 브랜치의 이력을 강제로 덮어쓰는
push --force는 신중하게 사용한다.
13. 한 줄 요약
Git은 변경 사항을 선택적으로 스테이징하고, 의미 있는 단위로 커밋하며, 브랜치와 원격 저장소를 통해 안전하게 협업하는 도구다.
'Study > Git' 카테고리의 다른 글
| 로컬에 폴더 지정하는 옵션 -l (0) | 2017.11.10 |
|---|