개발/기타
[Git] Git 주요 명령어
귀뚜래미
2025. 6. 13. 02:07
1. commit
정의
- 작업 디토리의 변경 내용을 스테이징 영역을 거쳐 로컬 저장소(Local repository)에 영구히 기록하는 작업.
설명·특징
- 스냅샷 단위로 코드 상태를 기록
- 커밋 메시지는 “무엇을, 왜 바꿨는지” 간결하고 구체적으로 작성
- 해시(예: a1b2c3d)로 고유 식별
예시
git add PlayerController.cs
git commit -m "플레이어 이동 로직 개선: 속도 보간 적용 및 버그 수정"
2. branch
정의
- 커밋 히스토리의 분기점(포인터). 메인 히스토리와 독립된 개발 흐름을 동시에 관리할 수 있음.
설명·특징
- 기본 브랜치는 main 또는 master
- 가벼운 포인터이므로 생성·삭제가 매우 빠름
- 기능별(feature), 버그 수정(hotfix), 실험(experiment) 등 용도별로 분리
예시
git branch feature/player-animation # 브랜치 생성
git branch # 브랜치 목록 확인
3. checkout
정의
- 작업 디렉토리를 지정한 브랜치나 커밋 상태로 전환(switch)
설명·특징
- git checkout 브랜치명 으로 브랜치 전환
- 커밋 해시 또는 태그로 이동 가능 (git checkout a1b2c3d)
예시
git checkout feature/player-animation
4. cherry-pick
정의
- 특정 커밋 하나(또는 여러 개)의 변경 이력만 현재 브랜치로 가져오는 명령
설명·특징
- 선택적 코드 병합: 불필요한 히스토리 전체가 아니라 필요한 부분만
- 충돌(conflict) 발생 시 수동 해결
예시
git checkout hotfix/critical-bug
git cherry-pick a1b2c3d # main 브랜치의 특정 버그 수정 커밋만 가져오기
5. reset
정의
- 브랜치의 HEAD를 지정한 커밋으로 이동시키고, 스테이징 영역과(또는) 작업 디렉토리를 조정
설명·특징
- --soft: HEAD만 이동, 스테이징 유지, 커밋 취소 후 바로 다시 커밋하거나 수정할 때 유용
- --mixed(기본): HEAD 이동 + 스테이징 초기화, 워킹 디렉토리는 그대로
- --hard: HEAD 이동 + 스테이징·워킹 디렉토리 모두 지정 커밋 상태로 되돌림(주의!)
예시
git reset --soft HEAD~1 # 마지막 커밋만 취소, 수정 사항은 스테이지된 상태로 유지
git reset --mixed HEAD~2 # 마지막 두 커밋 취소, 수정 사항은 언스테이지된 상태
git reset --hard HEAD~3 # 마지막 세 커밋 + 작업 디렉토리 완전 초기화
6. revert
정의
- 지정한 커밋을 “되돌리는(revert)” 새로운 커밋을 생성해 히스토리를 안전하게 유지
설명·특징
- 지정한 커밋의 변경 내용을 역으로 적용하는 새 커밋을 생성
- 원격에 이미 푸시된 커밋이라도 안전하게 “되돌리기” 가능
예시
# [Revert "원본 커밋 메시지"] 형태의 새 커밋이 찍히고, 원본 커밋 이력은 그대로 유지됨
git revert a1b2c3d # a1b2c3d 커밋 내용과 반대되는 커밋 추가
7. rebase
정의
- 한 브랜치의 커밋들을 다른 브랜치 기반으로 “다시 적용”(재배치)
설명·특징
- 히스토리 정리: 커밋 직렬화(선형화)
- 충돌 발생 시 순차 해결
- 공개 브랜치(release, main)에 적용 시 동료에게 혼란 초래할 수 있으므로 주의
예시
git checkout feature/login
git rebase main # feature/login 커밋들을 main 최신 커밋 위로 재배치
8. merge
정의
- 두 브랜치의 공통 조상부터 HEAD까지 변경 이력을 합치는 작업
설명·특징
- HEAD가 가리키는 브랜치가 main이 된다.
- git merge feature/login 명령어는 feature/login 브랜치의 변경 이력을 현재(Main) 브랜치 위로 합.
- 충돌(conflict) 없으면
- Fast-forward 가능 시 포인터만 이동
- 불가능 시 3-way 머지(merge commit) 생성
- main 브랜치에 feature/login의 모든 변경 사항이 포함됨.
- d이후 main에서 git log --graph를 하면 두 브랜치가 합쳐진 히스토리 확인 가능
예시
git checkout main # ① main 브랜치로 이동
git merge feature/login # ② feature/login의 커밋들을 현재(main) 브랜치에 병합
main과 HEAD의 의미
main
- 기본(primary) 브랜치 이름(과거에는 master 사용)
- 보통 “정식 배포” 또는 “항상 안정된 상태”를 유지하기 위해 사용
- 팀마다 컨벤션에 따라 변경 가능 (develop, production 등)
HEAD
- 현재 작업 중인 커밋(또는 브랜치 포인터) 를 가리키는 심볼릭 레퍼런스
- 예시
- HEAD -> main 이면, 현재 main 브랜치의 최신 커밋 위치
- 특정 커밋 해시를 체크아웃하면 HEAD는 브랜치가 아닌 “Detached HEAD 상태”로 그 커밋 자체를 가리킴
- HEAD 역할
- 커밋, merge, reset 등의 기준점
- git status, git log에서 “현재 어디에 있는지” 표시
# HEAD 확인
git rev-parse --abbrev-ref HEAD # 현재 브랜치 이름 출력 (or “HEAD” if detached)
reset vs revert 의 구체적 차이
구분 | git reset | git revert |
목적 | 브랜치의 포인터(HEAD)를 이전 커밋으로 이동 | 지정 커밋을 “되돌리는” 새로운 커밋을 생성 |
히스토리 수정 | 이력 자체를 삭제/변경 | 이력은 보존 (반대 동작 커밋만 추가) |
협업 안전성 | 위험 (원격에 이미 푸시된 커밋을 reset하면 충돌) | 안전 (원격 히스토리 보존 → 푸시해도 무해) |
사용 예시 | git reset --hard HEAD~1 | git revert HEAD~1 |
효과 on Disk | 커밋 + 스테이지 + 워킹 디렉토리 상태 모두 제어 | 워킹 디렉토리에는 변경 사항 그대로, 새 커밋만 추가 |
자주 쓰이는 Git 명령·옵션 요약
명령어 / 옵션 설명
명령어 / 옵션 | 설명 |
git add <파일> | 스테이징 영역에 변경 추가 |
git add -p | 변경을 한 덩어리씩 선택해서 스테이징 |
git commit -m "<메시지>" | 인라인 커밋 메시지 |
git commit --amend | 마지막 커밋 메시지·내용 수정 |
git branch -d <브랜치> | 로컬에서 삭제 (머지된 브랜치만) |
git branch -D <브랜치> | 로컬에서 강제 삭제 (머지 여부 상관없음) |
git checkout -b <브랜치> | 새 브랜치 생성 + 체크아웃 |
git checkout <브랜치> | 기존 브랜치로 전환 |
git fetch --prune | 원격에 없는 브랜치 정보 로컬에서도 정리 |
git pull --rebase | 병합 커밋 없이 내 커밋을 최신 원격 뒤로 재배치(rebase) |
git merge --no-ff | fast-forward 없이 병합 커밋 생성 |
git merge --squash | 여러 커밋을 하나로 합쳐서 병합 |
git push -u origin <브랜치> | 원격에 최초 푸시 시 트래킹 설정 |
git push origin --delete <브랜치> | 원격 브랜치 삭제 |
git push origin --tags | 로컬 태그를 원격에 모두 푸시 |
git log --graph --decorate --all --oneline | 커밋 그래프를 한눈에 보기 |
git diff | 워킹 디렉토리와 스테이징 영역 차이 보기 |
git diff --staged | 스테이징 영역과 마지막 커밋 차이 보기 |
반응형