1 Git 개념
1.1 Git이란?
Git은 코드의 변경 이력을 관리하는 분산형 버전 관리 시스템(Distributed Version Control System, DVCS)이다.
1.2 버전 관리 시스템의 두 가지 아키텍처
1.2.1 중앙형 (예: SVN)
중앙 저장소 (Server)
↑↓
유저 A, 유저 B, 유저 C
특징:
- 모든 변경사항이 중앙 저장소에 저장됨
- 인터넷 연결 필수 (커밋할 때마다)
- 충돌 시 서로 겹치면 중앙에서 에러 발생
- 백업이 중앙 저장소 하나에만 존재
문제점:
- 중앙 저장소 장애 → 전체 팀 작업 중단
- 커밋하려면 반드시 인터넷 필요
1.2.2 분산형 (예: Git)
중앙 저장소 (GitHub/GitLab)
↑↓
유저 A의 유저 B의 유저 C의
로컬 저장소 로컬 저장소 로컬 저장소
특징:
- 각 개발자가 전체 저장소의 복사본을 가짐 (로컬)
- 로컬에서 커밋 (인터넷 불필요)
- 나중에 중앙 저장소에 푸시 (인터넷 필요)
- 충돌은 로컬에서 발생 → 중앙 저장소는 항상 안전
장점:
- 중앙 서버 장애 → 로컬 작업 계속 가능
- 오프라인 작업 가능
- 각자 독립적으로 작업 후 병합
1.3 Git vs GitHub
| 구분 | Git | GitHub |
|---|---|---|
| 정의 | 버전 관리 시스템 (소프트웨어) | Git을 기반한 웹 서비스 |
| 실행 | 로컬 컴퓨터에서 실행 | 온라인 저장소 호스팅 |
| 역할 | 코드 변경 추적 및 기록 | 코드 공유, 협업, CI/CD |
| 비용 | 무료 (오픈소스) | 무료 + 유료 플랜 |
간단한 비유:
- Git = “책 쓰는 방법” (도구)
- GitHub = “책 출판사” (플랫폼)
1.4 Git의 3가지 영역
Git은 파일을 3가지 영역에서 관리한다. 이 개념을 이해하면 Git의 모든 명령어가 자연스럽게 이해된다.
Working Directory Staging Area (Index) Repository (.git)
(작업 디렉토리) (스테이징 영역) (로컬 저장소)
파일 수정 git add → git commit →
커밋할 파일 선택 변경 이력 확정
| 영역 | 설명 | 비유 |
|---|---|---|
| Working Directory | 실제 파일을 수정하는 공간 | 작업대 |
| Staging Area | 다음 커밋에 포함될 파일을 모아두는 공간 | 택배 포장대 |
| Repository | 커밋된 이력이 저장되는 공간 (.git 폴더) | 택배 발송 완료 |
2 OS별 Git 설치
2.1 Windows
Git 다운로드에서 최신 버전을 설치한다.
설치 시 주의:
- “Add a Git Bash Profile to Windows Terminal” 옵션 선택 (PowerShell에서 Git 사용 가능)
설치 확인:
버전 번호가 출력되면 설치 성공이다. 'git'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 라고 나오면 설치가 되지 않은 것이다. 재설치 후 터미널(PowerShell)을 완전히 닫았다가 다시 열어야 PATH가 적용된다.
2.2 macOS
macOS에는 기본 Git이 설치되어 있지만 버전이 낮다. Homebrew로 설치하면 최신 버전을 사용할 수 있다.
2.3 Linux (Ubuntu/Debian)
3 Git 초기 설정
3.1 사용자 정보 설정
첫 커밋 전에 반드시 설정해야 한다. 이 정보가 커밋 이력에 기록된다.
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --list # 설정 확인
# 출력 예시:
# credential.helper=manager
# user.name=Kwangmin Kim
# user.email=kwangmin@example.com
# core.autocrlf=true ← Windows에서 줄바꿈 자동 변환
# core.editor=vim
# init.defaultbranch=mainuser.name과 user.email이 목록에 있으면 설정 완료이다. git config --list 출력이 길게 나와도 당황하지 말고, 그 중에서 user.name과 user.email 두 줄만 확인하면 된다.
3.2 저장소 생성
3.2.1 방법 1: GitHub에서 먼저 만들고 Clone (권장)
- GitHub에 로그인
- “+” 버튼 → “New repository”
- 저장소 이름 입력, README 추가 체크 → “Create repository”
- 로컬로 복제:
git clone https://github.com/username/my_project.git
# 출력 예시:
# Cloning into 'my_project'...
# remote: Enumerating objects: 3, done.
# remote: Counting objects: 100% (3/3), done.
# remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
# Receiving objects: 100% (3/3), done.
cd my_project마지막 줄 Receiving objects: 100% (3/3), done. 이 보이면 성공이다. 현재 디렉토리에 my_project 폴더가 생긴다.
3.2.2 방법 2: 로컬에서 먼저 만들고 GitHub에 연결
# 작업 폴더 생성 및 Git 초기화
mkdir my_project
cd my_project
git init # .git 폴더 생성
# 출력 예시:
# Initialized empty Git repository in /home/user/my_project/.git/
# GitHub에서 빈 저장소 생성 후 연결
git remote add origin https://github.com/username/my_project.git
git push -u origin mainInitialized empty Git repository in .../.git/ 가 출력되면 현재 폴더가 Git 저장소로 초기화된 것이다. 이후 git remote add origin 명령으로 GitHub의 원격 저장소와 연결한다.
방법 1(Clone)이 더 간단하고 실수가 적다. 방법 2는 이미 로컬에 프로젝트가 있을 때 사용한다. 방법 2에서 발생할 수 있는 문제는 7편: Git Remote에서 다룬다.
4 GitHub 인증 설정
GitHub는 보안상 비밀번호 인증을 2021년에 제거했다. 다음 2가지 방법 중 하나를 사용한다.
4.1 방법 1: Personal Access Token (PAT)
4.1.1 토큰 생성
- GitHub 로그인
- 우측 상단 프로필 → Settings
- 왼쪽 메뉴 → Developer settings → Personal access tokens → Tokens (classic)
- Generate new token (classic) 클릭
- 설정:
- Note: “Local development” (또는 원하는 이름)
- Expiration: 원하는 기간 (90 days 등)
- Select scopes:
repo체크박스 선택
- Generate token 클릭
- 토큰을 복사하여 안전한 곳에 저장 (다시 볼 수 없음!)
4.1.2 토큰으로 인증
4.2 방법 2: SSH Key
4.2.1 SSH Key 생성
ssh-keygen -t ed25519 -C "you@example.com"
# 출력 예시 (대화형):
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/user/.ssh/id_ed25519): [Enter]
# Enter passphrase (empty for no passphrase): [Enter]
# Enter same passphrase again: [Enter]
# Your identification has been saved in /home/user/.ssh/id_ed25519
# Your public key has been saved in /home/user/.ssh/id_ed25519.pub
# The key fingerprint is:
# SHA256:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcdef you@example.com
# The key's randomart image is:
# +--[ED25519 256]--+
# | .o+. |
# | ..+. |
# +----[SHA256]-----+프롬프트에서 Enter 2~3번 (파일 경로와 패스프레이즈)을 입력하면 키 쌍이 생성된다. 생성된 파일은 두 개이다: - ~/.ssh/id_ed25519 — 비밀키 (절대 공유하지 않는다) - ~/.ssh/id_ed25519.pub — 공개키 (GitHub에 등록하는 키)
4.2.2 공개키를 GitHub에 등록
- 공개키 복사:
# Windows (PowerShell)
cat ~/.ssh/id_ed25519.pub | clip
# macOS
cat ~/.ssh/id_ed25519.pub | pbcopy
# Linux
cat ~/.ssh/id_ed25519.pub- GitHub 설정:
- 우측 상단 프로필 → Settings
- SSH and GPG keys → New SSH key
- Title 입력, Key에 공개키 붙여넣기 → Add SSH key
4.2.3 SSH로 원격 저장소 연결
# SSH 연결 테스트 (등록 후 먼저 확인)
ssh -T git@github.com
# 성공 출력:
# Hi username! You've successfully authenticated,
# but GitHub does not provide shell access.
# 원격 저장소를 SSH 주소로 변경
git remote set-url origin git@github.com:username/my_project.git
# 푸시
git pushHi username! You've successfully authenticated 가 출력되면 SSH 설정이 완료된 것이다. “but GitHub does not provide shell access.” 는 에러가 아니다 — GitHub는 SSH 접속으로 명령어 실행(shell)을 허용하지 않는다는 안내 문구이며, Git push/pull은 정상 동작한다.
5 자주 발생하는 에러
5.2 Push 거부 에러
error: failed to push some refs to 'origin'
hint: Updates were rejected because the tip of your current branch is behind
원인: 원격 저장소에 로컬에 없는 새로운 커밋이 있음
해결:
5.3 SSH 첫 연결 시 호스트 확인 경고
SSH로 처음 GitHub에 연결하면 다음과 같은 경고가 나타난다:
The authenticity of host 'github.com (140.82.121.4)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
해석: “이 서버(github.com)가 진짜 GitHub인지 처음 만나서 확인할 수 없다. 계속 접속하겠는가?”
해결: yes 입력 → Enter. 이후 동일 서버에는 다시 묻지 않는다.
# yes 입력 후 출력:
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
GitHub의 공식 SSH 키 지문(fingerprint)은 SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU 이다. 표시된 지문이 이와 다르면 중간자 공격(MITM) 가능성이 있으니 연결하지 않는다.
5.4 SSH Permission denied
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
원인 3가지:
- SSH 공개키를 GitHub에 등록하지 않았다
- 비밀키(
~/.ssh/id_ed25519)가 없거나 경로가 다르다 - SSH Agent에 키가 로드되지 않았다
해결:
5.5 관련 포스트
- GitHub 로컬-원격 저장소 연결 문제 해결 — git init, remote add, 브랜치 불일치(main/master) 트러블슈팅