git — 분산 버전 관리
개발 / 소스 관리 / git.html
💬 "git 명령어"
git은 파일 내용의 변경 이력을 커밋이라는 단위로 저장해 두고, 언제든 이전 상태로 되돌리거나 여러 사람과 병합할 수 있게 해 주는 분산 버전 관리 시스템입니다.
서버 프로젝트든 개인 스크립트든 변경 이력을 남겨 두면 실수로 지운 코드도 되살릴 수 있고, 누구의 변경이 문제를 만들었는지도 빠르게 추적할 수 있습니다.
- 저장 단위: 커밋(commit) — 한 번에 저장되는 변경 묶음
- 작업 공간: working tree(수정 중인 파일) → index(스테이징) → 로컬 저장소
- 원격 저장소: GitHub·GitLab 등에서 공유하는 서버 저장소
- 기본 브랜치: 보통 main — 안정된 최신 상태를 담는 줄기
자주 쓰는 옵션
| 옵션 | 설명 |
|---|---|
git status | 현재 변경 상태와 브랜치 확인 |
git log --oneline -n 10 | 최근 커밋 10줄 요약 보기 |
git add <파일> / git commit -m "메시지" | 변경 스테이징 후 커밋 |
git diff | 커밋되지 않은 변경 내용 나란히 비교 |
git branch / git switch | 브랜치 목록 보기 / 이동 |
git pull / git push | 원격 변경 가져오기 / 내 변경 보내기 |
필수 명령어 조합 3가지
git status && git diff— 무엇이 바뀌었는지 확인한 뒤 커밋git pull --rebase && git push— 원격 최신 내용을 내 이력 위로 정리해 보내기git log --oneline --graph -n 20— 브랜치 간 합류 지점까지 한눈에 보기
💬 "새벽 점검에서 쓰는 순서로 예시 만들어줘"
실제 운영 중인 서버에서 자주 만나는 상황을 순서대로 정리했습니다.
저장소 준비
빈 폴더에서 시작하거나 기존 폴더를 등록합니다.
mkdir demo && cd demo && git init
첫 커밋
읽을 파일을 하나 만들고 커밋합니다.
echo '# demo' > README.md
git add README.md
git commit -m "첫 커밋: README 추가"
원격 연결
원격 저장소 주소를 연결한 뒤 첫 push를 보냅니다.
git remote add origin <저장소 URL>
git push -u origin main
실무에서는 이렇게 씁니다
1. 실수로 지운 복원
상황 — 로그 분석 스크립트를 수정하다가 내용을 통째로 망가뜨려 이전 상태로 되돌려야 하는 상황.
git log --oneline -n 5
git checkout HEAD~1 -- analyze.sh
git status
결과 — analyze.sh가 이전 커밋 시점의 내용으로 복원됩니다.
포인트 — 체크아웃 후 커밋하지 않으면 복원 내용도 이력에 남지 않으니 반드시 다시 커밋합니다.
2. 기능별 브랜치 분리
상황 — 서버 배포용 안정 브랜치(main)를 건드리지 않고 새 기능만 만들고 싶은 상황.
git switch -c feature/nginx-ssl
git commit -m "nginx ssl 설정 추가"
git switch main
결과 — feature/nginx-ssl 브랜치에서 작업이 분리되고 main은 그대로 유지됩니다.
포인트 — 배포 서버의 main은 항상 동작하는 상태로 두는 습관이 장애를 줄입니다.
3. 누가 언제 바꿨는지 추적
상황 — 설정 파일 한 줄이 바뀌어 배포가 깨졌는데 언제·누가 바꿨는지 확인해야 하는 상황.
git log -L 10,20:deploy.yml --oneline
git show <해당 커밋>
결과 — 해당 줄을 건드린 커밋과 작성자·시각이 나옵니다.
포인트 — git blame 대신 -L로 범위를 좁히면 긴 설정 파일에서도 원인 커밋만 뽑아볼 수 있습니다.
주의할 점
- 커밋 메시지는 나중의 나를 위해 '무엇을 왜 바꿨는지'가 보이게 작성합니다.
- 비밀번호·API 키가 담긴 파일은 .gitignore로 제외한 뒤 커밋합니다.
- force push는 공유 브랜치에서 이력을 사라지게 할 수 있어 주의합니다.
실제 실행 화면
서버 저장소에서 git status와 diff --stat를 함께 실행한 가상 예시입니다(실제 실행 결과 아님).

실제 운영 중인 서버
이 문서는 화면 표시용 가상 디렉터리의 항목입니다. 실제 서버 파일시스템과 연결되지 않으며, 파일 실행이나 시스템 명령을 수행하지 않습니다.