Git에 대한 기본 개념과 자주 나오는 상황 정리

Git? GitHub?

Git은 소스코드 버전관리1 시스템(VCS; Version Control System)으로, 소스코드의 변경사항을 추적하고 관리한다.

  • Git의 사용 목적: 소스코드의 변경사항을 추적하고 관리하기 위해서

GitHub은 분산 버전 관리 시스템인 Git을 기반으로 하는 원격 저장소 호스팅 서비스이다.

  • Github의 사용 목적: Git 사용자끼리 협업을 위해서

Git과 GitHub
그림 1: Git과 GitHub
출처: https://cobook.tistory.com/19

로컬 저장소 (Local Repository)

git init 명령어로 로컬 저장소를 생성할 수 있다.

원격 저장소 (Remote Repository)

git clone <repository-url> 명령어로 원격 저장소를 복제할 수 있다. -> 로컬 저장소 생성

git remote add <remote-name> <repository-url> 명령어로 원격 저장소를 추가할 수 있다. 보통은 원격 저장소를 하나만 연결하게 되는데, 그때 <remote-name>으로는 origin을 많이 사용한다.

git remote -v 명령어로 원격 저장소 목록을 확인할 수 있다.

git remote remove <remote-name> 명령어로 원격 저장소를 제거할 수 있다.

커밋 (Commit)

커밋은 로컬 저장소에서 소스코드의 변경사항을 저장하는 것이다.

git commit -m "commit message" 명령어로 커밋을 생성할 수 있다.

푸시 (Push)

로컬 저장소의 커밋을 원격 저장소에 업로드하는 것이다.

git push <remote-name> <branch-name> 명령어로 원격 저장소에 커밋을 푸시할 수 있다.

풀 (Pull)

원격 저장소의 커밋을 로컬 저장소에 불러오는 것이다.

git pull <remote-name> <branch-name> 명령어로 원격 저장소의 커밋을 로컬 저장소에 풀할 수 있다.


브랜치 (Branch)

Git 브랜치 공식 문서

공식 문서가 잘 되어있다. 결론적으로, 브랜치 하나는 일련의 커밋이며, 따라서 특정 버전의 소스코드와 대응된다고 생각하면 된다.

로컬 브랜치 (Local Branch)

로컬 브랜치는 로컬 저장소에 있는 브랜치이다.

git branch 명령어로 로컬 브랜치 목록을 확인할 수 있다.

git branch <branch-name> 명령어로 새로운 브랜치를 생성할 수 있다.

git checkout <branch-name> 명령어로 브랜치를 이동할 수 있다.

원격 브랜치 (Remote Branch)

Git 원격 브랜치 공식 문서

원격 브랜치는 원격 저장소에 있는 브랜치이다.

git fetch 명령어로 원격 저장소의 브랜치 목록을 확인할 수 있다.

git fetch <remote-name> <branch-name> 명령어로 원격 저장소의 브랜치를 가져올 수 있다.

git push <remote-name> <branch-name> 명령어로 원격 저장소에 브랜치를 푸시할 수 있다.


git status - 로컬 저장소 상태 확인

커밋할 것이 없을 때

로컬 저장소에 커밋할 내용이 없고, 원격 저장소와 커밋 내역이 완전히 동일할 때

$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

이 상태에서 파일을 하나 만들어봤다.

$ touch just-created-file

Untracked 파일이 있을 때

Untracked 파일은 git이 추적하지 않는 파일이다. add하기 전까지는 커밋 대상이 아니다.

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	just-created-file

nothing added to commit but untracked files present (use "git add" to track)

이 상태에서 git add 명령어를 통해 추적하게 만들 수 있다.

$ git add just-created-file

Tracked 파일 중 변경사항이 있을 때

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   just-created-file

이 상태에서 커밋을 하면 된다.

$ git commit -m "Add just-created-file"

로컬 저장소의 커밋이 원격 저장소를 앞설 때

$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

이 상태에서 git push 명령어를 통해 원격 저장소에 커밋을 푸시할 수 있다.

$ git push origin main

그러면 다시 원격 저장소와 로컬 저장소의 커밋 내역이 동일해진다. (== 로컬 저장소의 로컬 브랜치가 원격 저장소의 원격 브랜치와 일치된다. )


git log - 커밋 로그 확인

git log 명령어로 커밋 로그를 확인할 수 있다.

$ git log
commit 6c2ee3d54bf392f4810e450b574100578673747b (HEAD -> main)
Author: whysw <yysw1109@gmail.com>
Date:   Tue Mar 4 23:49:24 2025 +0900

    new-commit

commit e5c7683ba8ff54439cd817b58bf14e7d380ad8eb (origin/main, origin/HEAD)
Author: whysw <35984562+YangSeungWon@users.noreply.github.com>
Date:   Thu Nov 21 23:03:13 2024 +0900

    remove collider on time

origin은 <remote-name>이니, origin/main은 원격 저장소의 main 브랜치를 의미한다.

HEAD지금 내가 작업하고 있는 브랜치내가 보고 있는 버전이라고 생각하면 된다.


git bundle

git bundle 공식 문서

원래는 로컬 저장소에서 커밋을 하고, 그걸 원격 저장소로 푸시하는 것이 일반적이다. git bundle은 그 대신 묶음파일을 만들어주는 것이다. 메일로 보낼 수도 있지만 소포를 부치는 그런 상황?

$ git bundle create <bundle-name> <branch-name>

git merge

Git Merge 공식 문서

git merge <branch-name> 명령어로 브랜치를 병합할 수 있다. == 현재 작업 중인 코드에, <branch-name> 브랜치의 코드를 병합한다.

Updated: