Git 기본기 — 스테이징부터 되돌리기와 브랜치까지
이 글은 2022년 6월 기준 기록입니다.
Git은 리누스 토발즈가 개발한 버전 관리 시스템(VCS)입니다. Bash 환경을 사용하는 Git Bash로 다룰 수 있습니다.
Git은 코드를 두 공간으로 나눈다
Git은 코드를 작업 공간과 로컬 저장소로 구분합니다. 작업 공간에서 파일을 고쳤다고 해서 그것이 곧바로 기록으로 남지는 않습니다. 변경 사항을 Staging해 기록할 대상으로 올리고, 올린 내용을 Commit해야 로컬 저장소(Local Repository)에 적용됩니다.
전체 흐름은 다음과 같습니다.
Working Dir → Staging → Commit → Local Repository → Push → Remote Repository이렇게 단계를 나눠 두면 얻는 것이 있습니다. 문제가 생겼을 때 로컬 저장소에 기록된 지점으로 작업 공간의 코드를 복구할 수 있습니다.
원격 명령 전에 이름부터 등록한다
원격 저장소를 다루기 전에 로컬에서 쓸 이름과 메일을 등록하고, 저장소를 초기화한 뒤, 원격지와 연결합니다.
$ git config --global user.name "사용자이름" # 로컬에서 사용할 이름
$ git config --global user.email "사용자메일" # 로컬에서 사용할 메일
$ git init # 로컬저장소생성
$ git remote add 원격지이름 원격지주소 # 원격지 이름은 그냥 별칭
$ git remote -v # 원격지 버전 정보
원격지 주소는 GitHub에서 repository를 만든 뒤 code 탭에서 확인할 수 있습니다.
$ git remote add origin https://github.com/사용자명/저장소명.git
$ git remote -v
origin은 정해진 이름이 아니라 그냥 별칭입니다. 원격지가 여럿일 때 구별하기 위한 이름표입니다.
add와 commit과 push는 각각 다른 공간으로 옮기는 일이다
Add — 무대에 올린다
저장소에 파일을 추가(staged, 무대에 오르다)합니다.
$ git add . # 현재 디렉토리 안에 모든 파일 추가
$ git add [경로/파일이름] # 특정 파일만 추가
commit — 버전을 만든다
무대에 올린(staging한) 파일을 커밋합니다. 커밋할 때는 메시지를 함께 남깁니다. 추가된 파일에 대해 타인이 알아볼 수 있도록 전달되는 간략한 메시지입니다.
$ git commit -m '커밋메세지'
커밋은 반드시 메시지를 남겨야 합니다.
push — 원격 저장소로 보낸다
$ git push [원격저장소 이름] [원격저장소 브랜치 이름]
$ git push origin master
로컬 저장소의 변경사항을 원격 저장소(origin)의 브랜치(master)에 반영하는 명령입니다.
git status가 지금 어느 단계인지 알려 준다
파일을 만들고 나서 상태를 확인해 보면, 아직 아무것도 추적되지 않고 있음이 드러납니다.
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
newfile.txt
nothing added to commit but untracked files present (use "git add" to track)
특정 파일만 지정해 Staging한 뒤 다시 확인하면 두 목록으로 갈라집니다.
$ git add README.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
newfile.txt
Changes to be committed에 올라온 것만 다음 커밋에 들어갑니다. 커밋하고 push하면 원격까지 반영됩니다.
$ git commit -m "add README.md"
$ git push origin master
파일은 다섯 가지 상태를 거친다
버전을 만드는 각 단계마다 파일의 상태가 달라집니다. 파일의 상태를 이해하면 현재 어느 단계인지, 그 상태에서 어떤 일을 할 수 있는지 알 수 있습니다.
| 상태 | 의미 |
|---|---|
| tracked | 버전을 만든 후에 깃에서 변경 내역을 추적 중인 상태 |
| untracked | 한번도 버전을 만들지 않은 상태 |
| unmodified | 수정되지 않은 상태 (working tree is clean) |
| modified | 작업 트리에서 수정한 후 아직 스테이지에 저장하지 않은 상태 |
| staged | 스테이지에 있고 아직 커밋하지 않은 상태 |
버전을 쌓아 보면 흐름이 잡힌다
파일을 하나 만들어 수정하면서 커밋을 쌓아 봅니다.
$ touch sample.txt
$ ls -l
$ vim sample.txt # 임의의 값 작성 후 :wq
$ git status # Untracked files: sample.txt
$ git add sample.txt # 작업 트리에서 수정한 파일을 스테이지에 추가
$ git status
$ git commit -m "ADD sample.txt"
$ git log
버전을 만드는 것을 '커밋한다'라고 하고, 버전에 어떤 변경이 있었는지를 -m으로 메시지와 함께 기록해 둡니다. git log로는 저장소에 있는 버전(커밋)을 확인할 수 있으며, 커밋을 만든 사람·만든 시간·커밋 메시지 등이 나타납니다.
한 번이라도 커밋한 파일이라면 스테이징과 커밋을 한 번에 처리할 수 있습니다.
$ git commit -am "MODIFY SAMPLE"
commit 명령에 add를 의미하는 -a 옵션을 추가한 것으로, git commit -a -m처럼 옵션을 따로 써도 됩니다. 다만 스테이징과 커밋을 한꺼번에 처리하려면 무조건 한 번은 커밋했던 파일이어야 합니다.
수정한 파일과 저장소에 있는 파일을 비교할 때는 git diff를 씁니다.
$ vim sample.txt # 숫자 '2'를 'two'로 변경
$ git diff
여기서 갈림길이 생깁니다. 수정한 내용으로 다시 버전을 만들려면 스테이지에 올린 후 커밋하고, 수정한 내용을 버리려면 git checkout으로 취소합니다.
$ git checkout sample.txt
$ vi sample.txt # 되돌아간 내용 확인
되돌리기는 어디까지 되돌릴지에 따라 나뉜다
스테이징만 되돌리기
파일을 스테이지에 올린 상태에서 그것만 취소하고 싶을 때입니다.
$ vi sample.txt
$ git add sample.txt
$ git status
$ git reset HEAD sample.txt
$ git commit -m "미변경 확인"
$ git push test_git main
GitHub 원격 저장소에서 확인해 보면 스테이징이 취소되었기 때문에 자료가 변경된 것이 반영되지 않았음을 확인할 수 있습니다.
최신 커밋 되돌리기
가장 마지막에 했던 커밋을 되돌리려고 할 때입니다.
$ git commit -a -m "최신 커밋 되돌리기"
$ git log
$ git reset HEAD^
$ git log
커밋 취소와 함께 스테이지에서도 내려집니다. git log를 다시 보면 그 버전이 사라져 있습니다.
특정 버전으로 되돌리기
GitHub 사이트의 history나 git log로 버전 해시 코드를 얻은 뒤 사용합니다.
$ git reset --hard 버전해쉬코드
해당 커밋 해시를 가진 커밋으로 리셋되며, 이후 커밋은 삭제됩니다.
$ git revert 커밋해시
revert는 해당 커밋 해시의 직전 커밋으로 돌아가되 이후 커밋은 그대로 유지됩니다. 되돌리는 지점은 비슷하지만 이후 이력을 남기느냐 지우느냐가 다릅니다.
브랜치는 갈라졌다가 다시 합쳐진다
깃에서 자동으로 만드는 기본 브랜치가 main 브랜치입니다. main 브랜치에서 새 브랜치를 만드는 것을 분기(branch), 새 브랜치에 있던 파일을 main 브랜치에 합치는 것을 병합(merge)이라고 합니다.
$ git branch # 저장소의 브랜치 확인
$ git branch apple # apple이라는 새 브랜치 만듦
$ git log # 변경 정보 확인
만든 브랜치로 이동하는 것을 '체크아웃한다'고 합니다.
$ git checkout apple
이때 main 브랜치의 커밋 내용들이 apple로 복사됩니다.
$ git log --oneline
$ git log main..apple # main에는 없고 apple에만 있는 버전을 확인
git log main..apple은 두 브랜치의 차이만 뽑아 보여 주므로, 갈라진 뒤 무엇이 더해졌는지 확인할 때 유용합니다.
작업이 끝나면 main으로 돌아와 병합합니다.
$ git checkout main
$ git merge apple
$ git log --oneline
로그로 확인해 보면 main과 apple이 같은 commit을 가리킵니다. 병합이 끝났다는 뜻입니다.
GitHub은 원격지의 저장 공간이다
GitHub은 깃의 로컬 저장소 기록을 원격지의 공간에 저장할 수 있도록 저장 공간을 제공하고, 이를 공유하는 기능을 제공합니다.
그리고 누가, 언제, 어떤 변경 사항을 적용했는지 모두 기록합니다. 로컬에서 쌓은 이력이 그대로 남는다는 점이 협업의 근거가 됩니다.
'IT·테크 > 개발' 카테고리의 다른 글
| 자바 연산자 정리 — 우선순위, 오버플로우, NaN과 Infinity (0) | 2026.07.22 |
|---|---|
| 자바 참조 타입 — 스택과 힙, 배열, 열거 타입 정리 (0) | 2026.07.21 |
| 자바 변수와 타입 — 기본 타입 8개와 타입 변환 규칙 (0) | 2026.07.20 |
| 자바 시작하기 — JVM과 바이트 코드, 그리고 개발 환경 (0) | 2026.07.19 |