[Git & Github] 자주 쓰는 내용 정리
예전에 git & github를 배우면서 필기를 했던 노트를 찾아서 이걸 다시 정리해서 여기에 올린다.
(언젠가 해야지 하고 있긴 했는데 예전 파일 뒤적거리다가 찾아서 하는 중 ㅎㅎ)
근데 예전이랑 달라진 부분이 있을 수도 있기 때문에 AI 한테 물어봐서 고쳤슴다.
- 기본 브랜치 이름이 master에서 main으로 변경된 점. -> 이게 무슨 인권? 문제 떄문에 이름이 바뀐걸로 알고 있습니다.
- 역할이 너무 많아 헷갈렸던 git checkout 명령어가 git switch(브랜치 이동)와 git restore(파일 복구)로 분리된 점 -> 근데 이거 여전히 checkout 쓸 순 있습니다.
Git & GitHub 핵심 개념 및 최신 명령어 총정리
개발자라면 필수로 알아야 하는 Git과 GitHub! 처음 배울 때는 헷갈리기 쉽지만 핵심 개념과 자주 쓰는 명령어를 이해하면 강력한 무기가 됩니다.
1. Git과 GitHub란 무엇인가
| 구분 | 설명 |
| Git | 분산 버전 관리 시스템(VCS). 내 컴퓨터(Local)에서 파일의 모든 변경 사항을 추적하고 기록합니다. |
| GitHub | Git이 기록한 내역(History)을 온라인에 저장하고 다른 사람과 공유할 수 있게 해주는 원격 저장소(Remote Repository) 호스팅 서비스입니다. |
| GitHub Desktop | 터미널(CLI) 환경이 익숙하지 않은 사용자를 위해 Git을 시각적으로 다룰 수 있게 만든 GUI 프로그램입니다. |
2. Git의 핵심 개념 및 작업 영역
Git이 파일을 관리하는 공간은 크게 3가지 영역(Areas)으로 나뉩니다. 이 영역을 이해하는게 git을 사용하는데 진짜 중요합니다
- Working Directory: 현재 파일을 작업하고 수정하는 공간. 그냥 보통 작업하는 그 폴더입니다
- Staging Area: 커밋(Commit) 되기 전, 변경된 파일들이 잠시 대기하는 공간. 폴더 내에서 변경된 것을 git이 추적합니다
- Repository (.git): 커밋이 완료되어 버전의 역사(History)가 영구적으로 저장되는 공간. 보통 원격저장소(Github)에 저장
관련 명령어
- git init [folder name]: 해당 폴더를 Git 저장소로 초기화합니다. (숨김 폴더인 .git이 생성됨)
- git init -b main을 사용하면 기본 브랜치를 바로 main으로 설정할 수 있습니다.
- 이걸 해줘야 git이 해당 폴더의 변경사항을 추적하기 시작합니다
- git add [file]: 변경된 파일을 Staging Area에 등록합니다.
- git log: 지금까지 커밋된 모든 변경 사항(History)을 확인합니다.
- git commit -m "[commit message]": Staging Area에 있는 파일들을 코멘트와 함께 .git 저장소에 영구 기록합니다.
- 이 명령을 쓰기 전에 아마 git이 니가 누구냐며 정보를 입력하라고 합니다
- git config --global user.name "이름" or git config --global user.email "이메일" 둘 중에 하나만 해도 됩니다.
- commit message는 혼자 쓸 때는 상관 없지만 팀 단위에서는 규칙을 정하고 사용하는 것이 좋습니다.
🔗 [Git & Github] Git Commit Message 규칙
.gitignore 란?
Git의 추적을 원치 않는 파일(예: 보안 키, 빌드 결과물 등)의 목록을 적어두는 파일입니다. 여기에 등록된 파일은 git add를 해도 Staging Area에 올라가지 않습니다. -> 중복되는 모듈이나 중요한 env 파일등을 등록합니다
3. 브랜치(Branch)와 병합(Merge)
- 브랜치 이동: git switch
- 파일 복구: git restore
브랜치 관련 명령어
- git branch [branch name]: 새로운 브랜치를 생성합니다.
- git branch -v: 현재 존재하는 브랜치 목록과 최근 커밋을 확인합니다.
- git switch [branch name]: 해당 브랜치로 이동합니다. (구: git checkout)
- git switch -c [new branch name]: 브랜치를 생성함과 동시에 해당 브랜치로 이동합니다. (구: git checkout -b)
- git branch -d [branch name]: 브랜치를 삭제합니다.
4. GitHub을 활용한 원격 협업
로컬에서 작업한 내용을 GitHub에 올리거나, 남의 프로젝트를 가져와 작업할 때 사용합니다.
원격 저장소 연결 및 업로드 (Push)
- git remote -v: 현재 연결된 원격 저장소 목록을 확인합니다.
- git remote add [name] [URL]: 새로운 원격 저장소를 등록합니다. (보통 기본 이름으로 origin을 사용)
- git remote remove [name]: 등록된 원격 저장소 연결을 끊습니다.
- git push -u origin main: 로컬의 커밋 내역을 GitHub(원격 저장소)에 업로드합니다.
오픈소스 및 팀 프로젝트 참여 (Fork & Clone)
- Fork: GitHub에 있는 다른 사람의 저장소를 내 GitHub 계정으로 그대로 복사해 오는 기능입니다.
- Clone: GitHub에 있는 원격 저장소를 내 컴퓨터(Local)로 다운로드하여 작업 폴더를 생성합니다.
- git clone [저장소 주소] [folder name(선택)]
- clone은 사용하면 자동으로 remote 정보까지 등록되어서 편리합니다
- Upstream Branch: Fork 해온 원래 베이스 저장소(원본)를 의미합니다. 원본의 최신 코드를 가져와 내 저장소를 동기화할 때 사용합니다. (최근에는 GitHub 웹사이트에서 'Sync fork' 버튼으로 쉽게 동기화할 수 있습니다.)
풀 리퀘스트 (Pull Request, PR)
작업자(또는 Fork 한 사람)가 원본 저장소 관리자에게 "내가 수정한 코드를 당신의 메인 코드에 병합(Merge) 해주세요"라고 요청하는 기능입니다. 관리자가 코드 리뷰 후 승인하면 코드가 병합됩니다. 이것도 규칙이 있다면 따르고 없다면 상세하게 써주는 게 좋습니다.
5. 이슈 추적과 마일스톤 (Issues & Milestone)
GitHub은 단순한 코드 저장소를 넘어 프로젝트 관리 도구의 역할도 합니다.
- Issues: 프로젝트의 버그, 문제점, 추가할 기능 등을 등록하여 팀원들과 공유하고 토론하는 게시판 역할을 합니다. PR을 올릴 때 제목이나 본문에 Fixes #이슈번호 라고 적으면 PR이 병합될 때 해당 이슈가 자동으로 닫힙니다. (Tag/Label을 달아 분류 가능)
- Milestone: 특정 버전 배포(릴리즈) 등 하나의 큰 목표를 위해 해결해야 할 Issue들과 PR을 묶어서 진척도를 관리하는 기능입니다.
6. 시간 여행하기: HEAD와 Reset
- HEAD: 현재 작업 중인 로컬 브랜치의 가장 최신 커밋을 가리키는 포인터입니다.
- git switch --detach [commit id]: HEAD를 과거의 특정 커밋 시점으로 이동시켜 과거 코드를 확인합니다. (구: git checkout [commit id])
되돌리기 (Reset)
과거 커밋으로 돌아갈 때 사용하며, 돌아가는 방식에 따라 옵션이 다릅니다.
- git reset --hard HEAD^: 이전 커밋 하나(^ 개수만큼)로 완전히 되돌아갑니다. 작업 중이던 내용도 모두 삭제되므로 주의해야 합니다.
- git reset --mixed HEAD^: (기본값) 커밋 내역은 되돌리지만, 작업했던 파일의 변경 내용은 Working Directory에 그대로 남겨둡니다.
강제 덮어쓰기
- git push origin main --force: 로컬의 역사와 원격 저장소의 역사가 달라 충돌할 때, 로컬의 내역으로 원격 저장소를 강제로 덮어씁니다. (협업 시 타인의 코드를 날릴 수 있으므로 매우 주의해서 사용해야 합니다.)
- 이건 사실상 혼자 쓸 때만 쓰는 걸 추천합니다.(팀 단위에서 쓰다가 망해버릴 수 있습니다)