이번 우아한테크코스 7기 프리코스를 진행하면서 자주 사용하는 Git 명령어뿐만 아니라 잘 사용하지 않았던 명령어들도 활용하게 되었다는 것을 깨달았다. 이를 복습하고자, 기본 커맨드와 다양한 명령어를 실습하고 정리하려고 한다.
1. 기본 설정 및 초기화
1.1 git init
Git 저장소를 초기화하여 현재 디렉토리를 새로운 Git 저장소로 설정한다.
$ git init
Git 폴더가 생성되며, 해당 디렉토리는 Git으로 관리되기 시작한다.
Initialized empty Git repository in C:/Users/bbt12/Desktop/git_test/.git/
1.2 git config
사용자 이름과 이메일을 설정하여 커밋 작성자 정보를 등록한다.
$ git config --global user.name "Your Name"
$ git config --global user.email "your.email@example.com"
git config –list 명령어로 설정된 정보를 확인할 수 있다.
$ git config --list
user.email=bbt1250912@gmail.com
user.name=Grayson1999
2. 저장소 상태 확인
2.1 git status
현재 작업 중인 파일의 상태를 확인하여 변경된 파일이나 스테이징된 파일 목록을 보여준다.
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
A.txt
B.txt
C.txt
D.txt
E.txt
2.2 git log
커밋 기록을 확인하여 이전 작업 내역을 살펴본다.
$ git log
commit 08a7b8f092e0d69123656caeadeaa0baf68996de (HEAD -> master)
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Tue Oct 22 19:40:09 2024 +0900
feat: A 기능 추가
A라는 엄청난 기능을 추가함
3. 파일 추적 및 스테이징
3.1 git add
변경된 파일을 Staging Area로 옮겨 Git이 변경 사항을 추적하도록 준비한다.
$ git add [파일명 | .]
git add .: 현재 디렉토리에서 변경되었거나 새로 추가된 모든 파일을 스테이징한다.git add {특정 파일}: 특정 파일만 스테이징한다.
$ git add B.txt
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: B.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
C.txt
D.txt
3.2 git restore –staged
스테이징된 파일을 Staging Area에서 제거하고, 다시 Unstaged 상태로 되돌린다.
$ git restore --staged [파일명 | .]
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
B.txt
C.txt
D.txt
E.txt
4. 커밋하기
4.1 git commit
스테이징된 변경 사항을 저장소에 커밋하며, 커밋 메시지를 추가하여 기록한다.
$ git commit -m 'feat: B라는 소박한 기능 추가'
$ git log
commit 2a145e1aee724f8eefa3a16041faf93a237b30f9 (HEAD -> master)
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Wed Oct 23 14:58:58 2024 +0900
feat: B라는 소박한 기능 추가
4.2 git commit –amend
마지막 커밋 메시지를 수정하거나 커밋 내용을 변경한다.
$ git commit --amend -m 'B라는 거대한 기능 추가로 커밋 메시지 변경'
$ git log
commit c5b0a86eaedf73ca757a39ab629e14e2500f3ec8 (HEAD -> master)
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Wed Oct 23 14:58:58 2024 +0900
B라는 거대한 기능 추가로 커밋 메시지 변경
5. 브랜치 관리
5.1 git branch
브랜치를 생성하거나 삭제하고, 목록을 확인한다.
$ git branch 새브랜치명
$ git branch
grayson
* master
git branch -d: 병합된 로컬 브랜치를 삭제할 때 사용한다. 병합되지 않은 브랜치를 강제로 삭제하려면git branch -D를 사용한다.
$ git branch -d grayson2
Deleted branch grayson2 (was c5b0a86).
5.2 git checkout
다른 브랜치로 이동하거나 특정 커밋으로 되돌아간다.
$ git checkout {브랜치명 | 해시}
$ git checkout grayson
Switched to branch 'grayson'
5.3 git switch
브랜치를 전환하거나 새 브랜치를 생성한다.
$ git switch master
Switched to branch 'master'
git switch -c: 새 브랜치를 생성하고 해당 브랜치로 전환한다.
$ git switch -c grayson2
※ git switch와 git checkout의 차이점
git switch: 브랜치 전환 및 생성에 특화된 명령이다.git checkout: 더 범용적인 명령으로, 커밋, 브랜치 전환 등이 가능하다.
6. 병합 및 충돌 해결
6.1 git merge
다른 브랜치를 현재 브랜치에 병합한다.
$ git merge 브랜치명
병합 후 충돌이 없으면 성공 메시지가 출력된다. 충돌이 발생하면 다음과 같은 메시지가 나타난다.
$ git merge grayson2
Updating c5b0a86..9fc798f
Fast-forward
C.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 C.txt
6.2 git rebase
기존 브랜치의 커밋 히스토리를 재정렬하는 데 사용한다.
- 기본적으로 rebase는 한 브랜치의 변경 사항을 다른 브랜치 위에 적용하여 마치 해당 브랜치가 그 위에서 바로 작업된 것처럼 히스토리를 수정하는 것으로, 더 깔끔한 커밋 히스토리를 남기고 싶을 때 사용한다.
grayson: C - B - A
grayson2: E - A
$ git rebase grayson2
Successfully rebased and updated refs/heads/grayson.
grayson: C - B - E - A
$ git log
commit 05ec340d2822ff527f76db88d9a10bd47360654b (HEAD -> grayson)
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Wed Oct 23 15:41:38 2024 +0900
feat: grayson2 브랜치에서 C 기능 추가
commit 2cf1e8631902ecba0eb5c230aed24caddf7edacf
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Wed Oct 23 14:58:58 2024 +0900
B라는 거대한 기능 추가로 커밋 메시지 변경
commit 18424c474a2139acd637fb0dbf71db0395456bb3 (grayson2)
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Wed Oct 23 15:57:56 2024 +0900
feat: E라는 기능을 추가
commit 08a7b8f092e0d69123656caeadeaa0baf68996de
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Tue Oct 22 19:40:09 2024 +0900
feat: A 기능 추가
주의할 점
- 공유된 브랜치에서는 rebase를 피하는 것이 좋다. 다른 사람들이 사용하는 브랜치의 커밋 히스토리를 변경하면 혼란을 초래할 수 있다.
6.3 git cherry-pick
git cherry-pick은 특정 커밋만을 선택적으로 다른 브랜치에 적용하는 명령어이다. 즉, 여러 커밋 중에서 필요한 커밋만 골라서 가져와 현재 브랜치에 추가할 수 있다.
grayson: C - B - A
grayson2: D - E - A
$ git cherry-pick 18424
[grayson 062b025] feat: E라는 기능을 추가
Date: Wed Oct 23 15:57:56 2024 +0900
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 E.txt
grayson: E - C - B - A
7. 원격 저장소와의 상호작용
7.1 git remote
원격 저장소를 추가한다.
$ git remote add origin 저장소URL
$ git remote -v
origin https://github.com/grayson1999/git_test.git (fetch)
origin https://github.com/grayson1999/git_test.git (push)
7.2 git push
로컬 브랜치의 변경 사항을 원격 저장소에 업로드한다.
$ git push origin 브랜치명
-u옵션: 푸시할 때 로컬 브랜치를 원격 브랜치에 연결한다. 이후에는git push만 입력해도 해당 브랜치로 자동으로 푸시된다.
$ git push -u origin grayson
...
* [new branch] grayson -> grayson
branch 'grayson' set up to track 'origin/grayson'.
7.3 git pull
원격 저장소의 변경 사항을 로컬로 가져와 병합한다.
$ git pull origin 브랜치명
$ git pull origin grayson
From https://github.com/grayson1999/git_test
* branch grayson -> FETCH_HEAD
7.4 git clone
원격 저장소를 복제하여 로컬에 저장한다.
$ git clone 저장소URL
8. 되돌리기
8.1 git reset
특정 커밋으로 되돌리거나 스테이징된 파일을 취소한다.
$ git reset [option] 커밋ID
$ git reset 95e179ea96491b831ed4e4237499360e78ba22c6
Unstaged changes after reset:
D E.txt
--soft: HEAD(커밋 기록)만 되돌리고, 스테이징 영역과 작업 디렉토리는 그대로 유지한다. 커밋만 되돌리고, 파일 수정 내용은 유지하고 싶을 때 사용한다.--mixed(기본 옵션): HEAD와 스테이징 영역을 되돌리지만, 작업 디렉토리는 그대로 유지한다. 스테이징된 파일들을 다시 Unstaged 상태로 돌리고 싶을 때 사용한다.--hard: HEAD, 스테이징 영역, 작업 디렉토리 모두 특정 커밋으로 되돌린다. 모든 변경 사항이 삭제된다. 작업 내용과 커밋 모두를 완전히 되돌리고, 모든 변경 사항을 삭제하고 싶을 때 사용한다.
8.2 git revert
이전 커밋을 되돌리는 새로운 커밋을 생성한다. 공유 브랜치에서 권장하는 방법이다.
$ git revert 커밋ID
commit bd46f25bd40142a088bd0f3a4b34f7805a8eeab0 (HEAD -> grayson2)
Author: Grayson1999 <bbt1250912@gmail.com>
Date: Wed Oct 23 16:41:02 2024 +0900
Revert "feat: E라는 기능을 추가"
This reverts commit 062b02571da503137bf5e8b59f36f4fafa149254.
revert, reset 차이점
| 특성 | git revert | git reset |
|---|---|---|
| 목적 | 커밋을 되돌리는 새로운 커밋을 추가 | 특정 커밋으로 히스토리 자체를 되돌림 |
| 히스토리 유지 여부 | 히스토리를 유지하고 되돌림 커밋을 추가 | 히스토리를 변경하며 되돌린 이후의 커밋을 제거 |
| 안전한 사용 환경 | 공유된 브랜치에서 안전하게 사용 가능 | 로컬 브랜치에서만 사용하는 것이 좋음 |
| 사용 옵션 | 단일 커밋을 되돌릴 때 사용 | –soft, –mixed, –hard 옵션으로 다양한 되돌리기 가능 |
| 데이터 손실 가능성 | 손실 없음 | –hard 사용 시 데이터 손실 가능 |
9. 기타 명령어
9.1 git tag
- 태그 추가하기
아래 명령어로 태그를 추가할 수 있다. 이 경우 HEAD가 가리키고 있는 커밋에 v0.1이라는 태그를 추가한다.
$ git tag v0.1

- 이전 태그와의 커밋 메시지 확인하기
git log 명령어를 사용하여 마지막 태그 이후의 커밋 메시지를 확인할 수 있다.
$ git log v0.1..HEAD --pretty=format:%s

- 특정 기능에 대한 커밋 확인하기
특정 태그에서 HEAD까지 원하는 을 찾아서 검색할 수 있다.
$ git log <last release>..HEAD --grep feat

9.2 git stash
작업 중인 변경 사항을 임시로 저장하고 워킹 디렉토리를 깨끗하게 유지한다.
사용 이유
- 작업 도중에 브랜치를 전환해야 할 때
- 작업 도중에 새로운 업데이트를 받아야 할 때
- 변경 사항을 보존하면서 디렉토리를 초기 상태로 유지하고 싶을 때
동작 방법
- 변경 사항 임시 저장:
$ git stash
Saved working directory and index state WIP on grayson2: bd46f25 Revert "feat: E라는 기능을 추가"
- 임시 저장 목록 확인:
$ git stash list
stash@{0}: WIP on grayson2: bd46f25 Revert "feat: E라는 기능을 추가"
- 임시 저장된 작업 복원:
$ git stash apply
On branch grayson2
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: D.txt
no changes added to commit (use "git add" and/or "git commit -a")
- 임시 저장된 작업 삭제:
$ git stash drop
Dropped refs/stash@{0} (67987ef47523125f4b0ac689d072facaaa8ecc69)
마무리
Git에서 사용하는 기본 명령어와 추가적인 명령어들을 정리해보았다. 이를 통해 Git의 전반적인 동작 과정을 이해할 수 있었다. 깊이 있는 공부는 아니었지만, 앞으로 이러한 기본 개념을 바탕으로 더 복잡한 기능들을 차근차근 공부해 나갈 예정이다.