개념
소프트웨어의 발전에 따라 변경이 잦아져 이에 따라. 형상관리의 필요성이 두각돼 git이 등장했고, 주로 버전 관리, Github를 활용한 백업, 협업을 위해 사용된다.
특징
분산형
- 사용자는 각자의 저장소를 가지고 있고, 중앙 저장소에 변경 사항을 저장한다.
- 이로 인해 충돌도 발생할 수 있다.
Branch and Merging
- 여러 개의 브랜치를 만들어 용도에 따라 구분할 수 있다.
- 예시) 프로덕션용 브랜치, 개발용 브랜치, 테스트용 브랜치
Staging 영역

- 어원 : 준비 중 또는 예비
- 변경사항을 스테이징 영역에 등록해 파일들을 추적할 수 있다.
- 모든 변경 사항이 완료되면 브랜치에 커밋해 새로운 상태를 저장할 수 있다.
주요 기능 및 설치
저장소 (Repository) : Git이 파일을 추가하고 관리하는 영역이다.
- 로컬 저장소 (Local Repository) : 각각 개발자들이 로컬 컴퓨터에서 관리하는 저장소이다.
- 원격 저장소 (Remote Repository) : 개발된 로컬 저장소를 업데이트하는 기준이 되는 중앙 저장소로 사용하며, 주로 Github가 이를 수행한다.
커밋 (Commit) : 스테이징 영역에 저장된 파일 변경 사항을 기록하는 작업이다.
- 커밋된 지점을 기준으로 복원이 가능하다.
사용 방법 1 - 기초
git을 사용하기 위해 로컬 컴퓨터에 사용자명을 설정해야 한다.
git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"
로컬 git 저장소를 생성하는 명령어이다.
git init
git add 명령어를 통해 해당 파일을 스테이징 영역에 등록할 수 있다.
git commit 명령어를 통해 스테이징 영역에 등록된 변경 사항을 커밋 지점으로 생성해 필요 시 복원할 수 있다.
echo "hello world" > myflie.txt
git add myfile.txt
git commit -m "add: myfile.txt"
내가 관리하고 있는 로컬 저장소를 원격 저장소에 연결해 나의 커밋들을 업로드할 수 있다.
TMI : 기존에 사용되던 master 브랜치는 역사적으로 인종 차별과 관련된 민감한 의미를 가질 수 있어 현재는 Deprecated 됐다. 그러니, 가급적 main 브랜치를 사용하자.
git remote add origin https://github.com/baobabnamu/goormthon_git_practice.git
git branch -M main
git push -u origin main
새로운 기능을 개발할 때는 새로운 브랜치에서 작업하는 것을 권장한다.
git branch 명령어를 통해 새로운 브랜치를 생성할 수 있고, git switch 명령어를 통해 브랜치 간 이동이 가능하다.
git branch feature/git-practice
git switch feature/git-practice
만약, 커밋 히스토리을 확인하고 싶다면 git log 명령어를 사용하면 된다.
git log
지금까지 생성된 브랜치를 확인하고 싶으면 아래와 --list 플래그를 사용하면 된다.
사실 git branch 만 입력해도 확인할 수 있다.
git branch --list
생성했던 브랜치를 삭제하기 위해서는 -d 플래그를 사용하면 된다.
git branch -d feature/git-practice
지금까지 작업했던 저장소 위치는 로컬 저장소이다.
만약 원격 저장소의 브랜치를 삭제하고 싶으면 어떻게 해야할까?
먼저 원격 저장소의 새로운 브랜치를 업로드해보자.
git branch feature/branch-practice
git switch feature/branch-practice
touch test.txt
git add .
git commit -m "add: test.txt"
git push origin feature/branch-practice
우리가 연결해 놓았던 github 리포지토리에 업로드된 브랜치를 --delete 플래그를 사용해 삭제할 수 있다.
git push origin --delete feature/branch-practice
기능 개발이 모두 완료된 브랜치를 main 브랜치에 병합하고 싶다면 git merge 명령어를 사용하면 된다.
주의할 점은 해당 명령어는 기준이 될 브랜치로 전환한 다음 병합하고 싶은 브랜치의 이름을 입력해야 한다.
git switch main
git merge feature/branch-practice
HEAD의 개념
git을 통해 서비스가 고도화 되면 여러 브랜치를 오가며 여러 커밋을 사용한다.
때때로 현재 작업 중인 브랜치의 최신 커밋을 가리킬 때도 있다.
이때 우리는 HEAD 포인터를 통해 현재 작업 중인 브랜치의 최신 커밋을 확인할 수 있다.
HEAD 포인터의 위치는 git 리포지토리의 숨겨진 메타데이터 폴더 하위에 있다.
cat .git/HEAD
git에서는 HEAD 포인터를 통해 현재 작업 중인 리포지토리를 어디인지 참조할 수 있도록 관리하고 있다.
git status 명령어를 통해 간편하게 확인할 수 있다.
git status
.gitignore 파일의 용도
.gitignore 파일은 Git에서 버전 관리하지 않으려는 파일이나 디렉토리를 지정하는 데 사용할 수 있다.
사용하면 특정 파일들이 Git의 추적 대상에서 제외되며, 커밋할 때 해당 파일들이 포함되지 않는다.
- 위치: .gitignore 파일은 프로젝트의 루트 디렉토리에 위치해야 한다.
- 파일 형식: .gitignore 파일은 간단한 텍스트 파일이며, 각 줄마다 제외할 파일이나 폴더를 지정합니다.
나의 경우 아래와 같이 myfile.txt 파일을 제외 시키기로 결정했다.

VSC 상에서는 .gitignore 에 의해 추적되고 있지 않은 파일의 경우 다음과 같이 회색 글씨로 표현해 준다.

기존 파일이 이미 git에 커밋되면 .gitignore 파일에 추가해도 git 캐시에 저장돼 있어 동작하지 않을 수 있다.
따라서 해당 파일을 git 캐시에서 삭제해 주도록 하자.
git rm --cached <file_name>
git commit -m "del: Remove ignored files"
사용 방법 2 - diff, restore, revert, reset 에 대한 이해
git의 해쉬 값에 대하여
Git 해시는 커밋을 유일하게 식별하는 40자리 SHA-1 해시값이다.
커밋 내용 + 작성자 + 이전 커밋 + 메시지를 기반으로 해시값을 생성한다.
git diff
Git에서 파일 변경 사항을 비교(diff)할 때 사용하는 명령어이다.
- 워킹 디렉터리, 스테이징 영역, 특정 커밋 간의 차이를 확인할 수 있다.
- 추가된 부분(+)과 삭제된 부분(-)을 강조하여 변경 사항을 시각적으로 보여준다.
- git diff HEAD 를 통해 현재 워킹 디렉터리의 변경 사항과 HEAD(마지막 커밋)를 비교할 수 있다.
- git diff --staged 를 통해 스테이징 영역과 최신 커밋을 비교할 수 있다.
- git diff COMMIT1 COMMIT2 를 통해 두 개의 커밋을 서로 비교할 수 있다.
git restore
Git에서 수정된 파일 변경 사항을 복구하는 명령어이다.
- git restore . 워킹 디렉터리의 모든 변경 사항을 복원한다.
- git restore --staged FILENAME 를 통해 스테이징된 특정 파일을 되돌릴 수 있다.
git reset과 git revert
두 명령어는 모두 Git에서 커밋을 되돌리는 명령어이다.
git reset 은 로컬에서 최근 커밋을 취소하거나 스테이징 영역을 정리할 때 주로 사용한다.
특정 커밋으로 브랜치의 상태를 되돌리고 이후의 변경 사항을 제거하는 명령어이다.
로컬에서만 변경되며 따로 푸시(git push --force)하지 않는 이상 원격 저장소에는 영향을 주지 않는다.
이때 되돌린 커밋은 git 히스토리에서 완전히 사라질 수 있어 주의가 필요하다.
git revert 은 기존 커밋을 되돌리지만 새로운 “되돌리기 커밋”을 생성해 git 히스토리를 유지하는 방식이다.
원격 저장소에서도 적용이 가능해 협업에 적합하다.
기존 커밋을 완전히 삭제하지 않고 변경 사항을 반대로 적용하는 새로운 커밋을 생성한다.
실제 사례를 통해서 다시 정리해 보자.
핵심은 다음과 같다.
- 로컬에서 최근 커밋을 취소 시 git reset
- 원격 저장소에서 안전하게 특정 커밋을 되돌릴 시 git revert
1) 최근 커밋을 취소하고 다시 작업하고 싶을 때 (--soft)
git reset --soft HEAD~1
- 마지막 커밋을 취소하고 다시 수정 후 새로운 커밋을 하고 싶을 때 사용한다.
- 예) git commit 를 실수로 너무 빨리 한 경우
2) 최근 커밋을 취소하고 git add도 취소하고 싶을 때 (--mixed)
git reset HEAD~1
- 마지막 커밋을 취소하고, git add한 내용도 스테이징에서 제거할 때 사용한다.
- 변경 사항은 유지되므로 다시 git add 후 커밋할 수 있다.
- 예) 커밋을 취소하고 변경 사항을 수정한 후 다시 git add하고 싶을 때.
3) 최근 커밋을 완전히 삭제하고 싶을 때 (--hard)
git reset --hard HEAD~1
- 마지막 커밋을 완전히 삭제하고, 변경 내용도 모두 삭제할 때 사용한다.
- ⚠️ 되돌린 변경 사항은 복구할 수 없으므로 주의!
- 예) 잘못된 커밋을 했고, 변경 사항도 필요 없을 때.
4) 특정 커밋으로 돌아가고 이후 커밋을 삭제하고 싶을 때 (--hard)
git reset --hard <커밋 해시>
- 특정 커밋으로 프로젝트를 되돌리고, 이후의 모든 커밋을 제거할 때 사용한다.
- 원격 저장소와 동기화하려면 강제 푸시(git push --force)가 필요하다.
- 예) 최신 변경 사항을 모두 삭제하고 특정 버전으로 프로젝트를 복원할 때.
5) 스테이징된 파일을 취소하고 다시 수정하고 싶을 때 (--mixed 기본값)
git reset FILE
- git add를 실행했지만, 다시 변경 사항을 수정하고 싶을 때 사용한다.
- 스테이징에서 제거되지만 파일의 변경 내용은 유지된다.
- 예) 실수로 git add 했을 때 다시 취소하고 싶을 때.
6) 특정 커밋을 되돌리고 싶을 때
git revert <커밋 해시>
- 특정 커밋을 취소하고 싶지만, 기존 커밋 히스토리는 유지하고 싶을 때 사용한다.
- 원격 저장소에서 안전하게 커밋을 되돌릴 때 유용하다.
- 예) 팀원과 협업 중에 특정 커밋이 문제를 일으켜 이를 되돌리고 싶을 때.
7) 가장 최근 커밋을 되돌리고 싶을 때
git revert HEAD
- 가장 최근 커밋을 취소하고, 이를 되돌리는 새로운 커밋을 생성할 때 사용한다.
- 히스토리를 유지하면서 커밋을 취소할 수 있다.
- 예) 최신 커밋을 되돌려야 하지만, 기록을 남겨야 할 때.
8) 여러 개의 커밋을 되돌리고 싶을 때
git revert HEAD~3..HEAD
- 최근 3개의 커밋을 한 번에 되돌리고 새로운 커밋을 생성할 때 사용한다.
- 협업 환경에서 여러 커밋을 안전하게 취소하고 싶을 때 유용하다.
- 예) 최근 여러 개의 잘못된 변경 사항을 한 번에 되돌려야 할 때.
'Dev > Git & Github' 카테고리의 다른 글
현대적인 Git Branch 전략 비교 (0) | 2025.03.09 |
---|