버전 관리란?
Git은 여러 파일들을 관리할 때, 각 파일들의 버전들을 추적하여 변경 이력들을 체계적으로 관리할 수 있게 제공하는 버전 관리 시스템(VCS)이다.
Git은 변경 이력 추적, 자유로운 버전 이동으로 크게 두 가지 기능을 제공한다고 볼 수 있다.
Git에서는 하나의 의미 있는 작업 단위를 저장하는 것을 ‘커밋(Commit)’ 이라고 한다. → 즉 수정사항이 반영된 새로운 버전의 파일을 기록한다고 보면 됨
프로젝트를 진행하면서 변경 이력들을 관리하고 추적할 때, 혼란스럽지 않도록 해당 커밋마다 추가 정보들을 함께 명시하여 저장한다.
- 커밋 메시지(Message) : 작업 내용 (ex. ‘로그인 기능 추가’, ‘DB 인덱싱 버그 픽스’ 등)
- 작성자(Author) : 누가 변경했는지 (ex. Kim Changmo)
- 날짜(Timestamp) : 언제 변경했는지 (ex. 2025-10-15 14:45:00)
- 고유 ID(Hash) : 각 커밋을 식별하는 고유한 암호 같은 값(ex. k233jdcsj3..)
Git의 기본 명령어
- git commit
- git push
- git pull
- git petch : 원격 저장소의 최신 변경 내용을 가져와서 확인만 함. → 병합하는 것 아님! 가져온 변경 사항을 확인하는 방법
- git log : git log main..origin/main 을 실행하면 내 main브랜치와 원격(origin)의 main 브랜치를 비교해 원격에만 있는 커밋들 목록을 보여준다. 새로 가져온 커밋들 목록이 시간순으로 나열됨. 흐름 파악 가능
- git diff : git diff main origin/main 을 실행하면 내 main브랜치와 원격(origin)의 main 브랜치를 비교해 코드의 차이점을 보여준다. 어떤 파일의 코드가 삭제되고 추가되는지 명확히 보여줌. merge 전에 코드 충돌 부분 미리 확인하거나 동료가 수정한 코드 내용 검토 가능
- git status 내 브랜치가 몇 개의 커밋만큼 뒤처져 있는지 요약해준다. Ex) Your branch is behind 'origin/main' by 3 commits, and can be fast-forwarded. (현재 브랜치가 'origin/main'보다 3개의 커밋만큼 뒤처져 있습니다.)
- git branch
- git checkout
- git merge
git clone해온 원격저장소 링크를 git이 자동으로 origin으로 저장하여 사용한다. 즉 origin이 원격저장소를 의미하는 것임
*Upstream : 기준이 되는 중앙 원격 저장소를 의미 → 여기서 내 로컬에 코드를 가져오거나 내 코드를 push하는 곳임 #반대로 Downstream은 내 로컬 저장소를 의미함 git push -u origin main 으로 upstream을 설정하는 것은 원격(origin)의 main 브랜치에 push할 수 있고. 이 명령어는 원격 저장소 origin을 나의 upstream으로 설정하고(-u), 내 main 브랜치의 내용을 거기로 보내줘(push) 라는 의미다.
PR과 Merge
팀원들이 작업을 한 후, main 브랜치에 자신의 브랜치 작업 내역을 push하게 될 것이다. 만약 팀원이 자신의 코드가 잘못된 부분이 있다는 걸 모르고 바로 main 브랜치에 push를 하게 되면? → 그 내용은 원격에 바로 반영이 될 것이고, 최악의 경우 충돌이 발생해 코드가 꼬일 수도 있다.
이런 경우를 방지하기 위해 우리는 Pull Request를 사용한다.
Pull Request는 말 그대로 Pull을 요청하는 것이다. 즉, 팀원이 작성한 코드를 push하게 되면 깃허브에서 Pull Request를 생성할 수 있게 되고 팀원은 그 Pull Request 내용을 작성한 다음(작성 내용 등) 요청을 하게 되면 팀장에게 Pull Request가 간다. 그럼 팀장은 해당 PR을 보고 코드를 점검하며 합쳐도 되겠다고 판단되면 Merge를 해서 최종적으로 main 브랜치의 코드와 병합이 되게 된다.
병합 후에는 사용했던 브랜치는 삭제하는 게 원칙이다. → 기능 개발이 끝났음을 표시하고 브랜치별 역할을 명확히 하기 위함
*팀 프로젝트에서 main 브랜치는 **보호된 브랜치(Protected Branch)**로 설정하여 아무나 직접 코드를 push 할 수 없도록 막아두는 것이 원칙이다.
브랜치
브랜치 조회
- git branch : 로컬 브랜치 목록을 보여줌. 현재 브랜치 앞에는 *표시
- git branch -r : 원격 저장소의 브랜치 목록 보여줌 (-r 은 remote)
- git branch -a : 로컬과 원격의 모든 브랜치를 보여줌
브랜치 생성
- git branch <브랜치명> : 새로운 브랜치를 생성함.
- git checkout <브랜치명> : 해당 브랜치로 이동함.
- git checkout -b <브랜치명> : 새로운 브랜치를 생성하고, 바로 그 브랜치로 이동까지 처리
브랜치 삭제
- git branch -d <브랜치명> : 브랜치를 삭제함. 단 다른 브랜치와 병합이 완료된 브랜치만 가능 ( -d : --delete)
- git branch -D <브랜치명> : 브랜치를 강제로 삭제. 다른 브랜치와 병합되지 않은 내용 있어도 강제 삭제
- git push origin --delete <브랜치명> : 원격 저장소(origin)에 있는 브랜치를 삭제
브랜치 이름 변경
- git branch -m <기존이름> <새이름> : 현재 브랜치의 이름을 변경. 기존 이름 생략 가능 ( -m : --move)
- git branch -M <기존이름> <새이름> : 브랜치 이름 강제로 변경. 동일 이름 브랜치 있어도 무시하고 덮어씀
기타 명령어
- git branch --merged : 현재 브랜치에 병합이 완료된 브랜치들의 목록을 보여줌 → 삭제할 브랜치 목록 찾을 때 유용 (main 브랜치에서 자주 쓸 듯?)
- git branch --no-merged : 현재 브랜치에 아직 병합되지 않는 브랜치들의 목록을 보여줌
- git branch -u <원격저장소>/<원격브랜치> (origin/main) : 현재 로컬 브랜치의 업스트림을 (추적할 원격 브랜치) 설정하거나 변경
리베이스
- git rebase