Git

2024-08-08
Git 을 사용하기 위한 명령어


깃이 무엇이냐

  1. 버전 관리
    • 파일 변화를 기록했다가 특정 시점의 버전을 꺼내 사용하는 시스템이다.
  2. 백업, 저장
    • 수정 사항을 이전 상태로 되돌리거나 수정 내용을 비교할 수 있다.
  3. 협업
    • 누가 수정을 했는지, 어디서 문제가 발생했는지 추적할 수 있다.

시작하기

깃을 사용하기 위해서 깃 저장소를 만들어야 한다.

git init

해당 디렉터리에 깃 저장소를 생성한다.

.gitignore

node_modules 등의 깃으로 관리하지 않는 파일들을 .gitignore 파일에 작성해 무시하도록 한다.


상태 관리

수정 사항이 있는 파일에 번호를 붙여 버전으로 구별한다.

  • 작업 저장소(working directory) : 파일에서 작업을 하는 장소
  • 스테이지(staging area) : 버전으로 만들기 위해 수정 사항이 있는 파일들을 올려 대기시키는 장소
  • 깃 저장소(git directory - repository) : 스테이지의 파일들을 버전으로 만들어 저장하는 장소.

Working tree, staging area, and Git directory.

git add <file>

변경 사항이 잇는 파일을 스테이지로 옮긴다.

git reset <file>

add를 취소하고 파일을 작업 저장소로 복구시킨다.


파일 상태

깃으로 관리하는 파일에는 4가지의 상태가 있다.

  • Untracked : 파일이 새로 생성되어 깃이 인식하지 못하는 상태
  • Unmodified : 파일의 변경사항이 모두 커밋을 통해 저장된 상태
  • Modified : 파일을 수정하여 변경 사항을 인식한 상태
  • Staged : 파일의 변경 사항을 저장하기 위해 스테이지에 올려놓은 상태 (git add)

파일의 라이프사이클.

git status

Untracked, Modified, Staged 파일들을 확인할 수 있다.

변경사항이 없는 Unmodified 파일은 뜨지 않는다.


커밋 - Commit

커밋은 변경 사항을 깃 저장소에 기록해 저장하고 복구하는 단위가 된다.
변화하는 내용만 시간 순서대로 관리한다.
어떤 변경사항이 있는지 확인할 수 있도록 커밋할 때 간단한 메시지로 기록한다.

git commit -m 'message'

스테이지에 있는 모든 파일을 깃 저장소로 커밋한다.

git log

모든 커밋에 대한 정보를 확인할 수 있다. (commit hash 확인가능)

  • git log --graph : 커밋 상태를 그래프로 보여준다.
  • git log --stat : 커밋에 포함된 파일들을 보여준다.

작업 되돌리기

git restore

작업중 변경 사항과 스테이징 영역의 파일을 되돌릴 수 있다.

  • git restore <file> : 파일의 변경사항을 마지막 커밋 상태로 되돌린다.
  • git restore --staged <file> : 스테이징 영역의 파일을 취소시킨다. (reset과 동일)

git reset

커밋을 취소하고 이전의 버전으로 돌아갈 수 있다.

돌아가려는 버전과 현재 버전 사이의 모든 커밋이 제거되고 변경사항만 남긴다.

  • (옵션이 없으면 스테이징 영역의 파일을 취소시킨다.)
  • git reset HEAD^ : 한 단계 이전 버전으로 돌아감
  • git reset HEAD~<amount> : 현재 버전부터 원하는 갯수만큼의 커밋을 취소함
  • git reset <commit hash> : 원하는 버전으로 돌아감
  • git reset --hard <commit hash> : 변경사항을 남기지 않고 전부 되돌리기 위해 사용한다.

git revert

특정 버전의 커밋과 변경사항을 지우는 revert커밋을 올린다.

  • git revert HEAD : 바로 직전의 버전을 제거
  • git revert <commit hash> : 원하는 버전을 제거

git checkout

현재 커밋에서 다른 커밋으로 단순히 이동할 수 있다.

커밋의 포인터인 HEAD를 특정 커밋으로 이동시킨다.

  • git checkout HEAD^ : 한 단계 이전 버전으로 돌아감
  • git checkout HEAD~<amount> : 현재 버전부터 원하는 갯수만큼의 커밋을 취소함
  • git checkout <commit hash> : 원하는 버전으로 돌아감

브랜치 - Branch

코드를 분기해 원래 코드와 독립적으로 개발하기 위해 사용한다.
협업 과정에서 다른 개발자의 코드와 직접적인 충돌이 나지 않게 하고, 배포된 코드와 개발중인 코드를 분리한다.

git branch

브랜치를 확인하고 관리한다.

  • git branch -a : 리모트 브랜치를 포함한 모든 브랜치를 확인
  • git branch <branch> : 브랜치 생성
  • git branch -d <branch> : 브랜치 삭제

git switch

브랜치를 이동한다.

  • git switch <branch> : 특정 브랜치로 이동
  • git switch -c <branch> : 브랜치를 생성하고 이동

checkout 명령어도 switch와 동일하게 브랜치를 이동할 수 있다.

  • git checkout <branch> : 브랜치를 이동한다.
  • git checkout -b <branch> : 브랜치를 만들고 바로 이동한다.

  • git log --branches : 커밋 로그와 브랜치를 함깨 확인한다.

병합 - Merge

git merge <branch name>

특정 브랜치를 현위치의 브랜치로 병합한다.

  • ‘develop’ 브랜치의 작업을 ‘main’ 에 병합하려면 ‘main’ 브랜치로 이동해 merge를 사용한다.
  • 병합 과정에서는 브랜치의 변경 부분이 충돌하는 경우가 발생할 수 있다.
  • 해당 파일을 열어 충돌한 코드와 마커 태그를 수정하고 다시 커밋해야 한다.

원격 저장소 - Remote

깃 저장소는 로컬 저장소와 원격 저장소가 있다.
Github와 같은 서버의 원격 저장소와 연결해서 백업과 협업을 한다.

git clone <remote url>

로컬 저장소가 없는 상태에서 원격 저장소를 복사해온다.

git remote

  • git remote add origin <remote url> : 원격 저장소와 연결
  • git remote -v : 원격 저장소 연결 여부 확인

  • git checkout -t <remote>/<branch> : 원격 저장소의 브랜치를 내려받아 이동한다.
    • 로컬 저장소에 같은 이름의 브랜치가 있으면 충돌이 발생한다.

git push

로컬 저장소의 내용을 원격 저장소에 올린다.

  • git push -u origin main : 원격 저장소에 로컬 저장소의 새로운 브랜치를 올림

git fetch

원격 저장소의 변경사항을 내려받는다.

git pull

원격 저장소의 내용을 로컬 저장소로 내려받아 병합한다. (fetch + merge)


참고