git init
Create an empty Git repository or reinitialize an existing one
— Git 공식 매뉴얼(man git-init)
모든 버그, 모든 야근, 모든 갈등의 태초의 빛이 바로 이 명령어다. 여기서 그만두었어야 했다. 엔터를 치는 게 아니었는데...
1. 개요
버전 관리 시스템의 대명사인 Git을 사용할 때 가장 먼저 마주하게 되는 명령어다. 실행하는 순간 해당 디렉터리에 숨김 폴더 형태로 .git 폴더가 생성되며, 이때부터 해당 폴더 안의 모든 파일은 Git의 삼엄한 감시 하에 놓이게 된다. 즉, 평화롭던 로컬 폴더에 버전 관리라는 무거운 형벌을 내리는 의식이다.(...)
2. 개요 및 동작 원리
아무런 설정이 없는 황무지 상태의 터미널 창에서 git init을 입력하는 순간, 컴퓨터는 현재 경로를 기준으로 로컬 저장소를 구축하기 시작한다. 실제로는 아주 정직하게 .git이라는 이름의 숨겨진 디렉터리를 하나 만들 뿐인데, 이 안에는 객체 데이터베이스(objects), 참조 팁(refs), 그리고 수많은 설정 파일들이 조용히 둥지를 틀게 된다. 이미 초기화된 저장소에 다시 입력해도 기존 작업물이 날아가지는 않고 단순히 재초기화(Reinitialize)될 뿐이니 안심해도 좋다.1
3. 주요 옵션 및 변칙 사용
기본적으로는 현재 위치에 생성하지만, git init <directory>를 통해 특정 폴더를 새로 만들면서 동시에 초기화할 수도 있다. 또한 분산 환경에서 중앙 서버 역할을 수행할 순수 저장소를 만들 때는 --bare 옵션을 활용하여 작업 디렉터리(Working Directory)가 없는 기묘한 뼈대 저장소를 생성하기도 한다. 요즘은 메인 브랜치명을 master에서 main으로 강제하기 위해 git init -b main 옵션을 습관적으로 덧붙이는 것이 현대 웹 생태계의 트렌드로 자리 잡았다.
4. 실제 사용 예시
새 프로젝트를 Git 저장소로 만들 때의 가장 기본적인 흐름이다. 이미 파일이 있는 폴더에서도 그대로 실행할 수 있다.
mkdir my-app
cd my-app
git init
git status
# 첫 파일을 만든 뒤 첫 커밋까지 진행
echo "# My App" > README.md
git add README.md
git commit -m "Initial commit"
기본 브랜치 이름을 명시하고 싶다면 초기화 시점에 바로 지정할 수 있다.
git init --initial-branch=main
5. 관련 밈 및 드립
5.1. 바탕화면 init 대참사
경로 확인을 제대로 하지 않고 사용자 루트 디렉터리(~)나 윈도우 바탕화면 한가운데서 무지성으로 git init을 갈겼다가, 컴퓨터 전체의 파일 수만 개가 Untracked 상태로 잡혀 git status 창이 폭발하는 뉴비들의 정기 행사다. 결국 해결법을 못 찾고 포맷을 고민하는 비극으로 이어진다.
5.2. .git 폴더를 지우면 해결된다는 괴담
코드가 꼬이거나 충돌이 발생해 멘탈이 나갔을 때, .git 폴더를 통째로 휴지통에 버리면 모든 흔적이 깨끗이 사라져 마치 없던 일처럼 된다는 무시무시한 괴담이다. 실제로 로컬의 모든 커밋 히스토리가 통째로 우주 너머로 소멸하므로 시도하는 순간 퇴사 사유가 된다.(...)
6. 여담
- 바탕화면 테러: 실제로 학원이나 대학 강의 첫날에 이 실수를 저질러 강사가 뒷목을 잡는 사례가 전 세계적으로 수만 건에 달한다.
- 재초기화의 무해성: 이미
git init이 된 곳에 백 번을 더 쳐도 기존 버전 히스토리는 전혀 손상되지 않는다. - 숨김 처리: 윈도우 환경에서는 기본적으로 숨김 속성이 걸리기 때문에 탐색기 옵션에서 '숨겨진 항목 표시'를 켜야만 실체를 볼 수 있어 뉴비들을 종종 어리둥절하게 만든다.