1. Git 저장소를 만드는 두 가지 방법
- 기존 로컬 디렉토리를 Git 저장소로 전환하는 방법
- 다른 서버에 있는 기존 Git 저장소를 복사(Clone)해 오는 방법
📁 기존 디렉토리를 Git 저장소로 만들기
- 디렉토리 이동: 버전 관리를 원하는 프로젝트 폴더로 이동
- git init 실행: 폴더 내에 저장소 뼈대 파일이 포함된 .git 하위 디렉토리를 생성
- 파일 추적 및 커밋: 생성 직후에는 파일 관리 상태가 아니므로, git add로 파일을 추가하고 git commit을 통해 첫 버전을 기록
$ cd /c/user/my_project
$ git init # .git 하위 디렉토리를 생성
$ git add . # 전체 디렉토리
$ git add ./my_project # 특정 디렉토리
$ git commit -m 'initial project version'
📁 기존 저장소 복사하기 (Clone)
- git clone <url> 실행: 다른 프로젝트 참여 시 프로젝트 히스토리를 통째로 복제해 옴
- 백업 역할 수행: 서버의 모든 데이터를 복사하므로, 서버가 망가져도 클라이언트 저장소를 통해 완벽히 복구 가능함
- 디렉토리 명 지정: URL 뒤에 새 이름을 추가하면 원하는 폴더명으로 복사본 생성 가능함
- 다양한 프로토콜 지원: HTTPS뿐만 아니라 git:// 방식이나 SSH 프로토콜(user@server:path/to/repo.git)도 사용함
# “libgit2” 라는 디렉토리를 만들어 그 안에 .git 디렉토리를 생성
$ git clone https://github.com/libgit2/libgit2
# "mylibgit" 라는 디렉토리 이름만 다를 뿐 이 명령의 결과는 앞선 명령의 결과와 같음
$ git clone https://github.com/libgit2/libgit2 mylibgit
2. 워킹 디렉토리 파일의 두 가지 상태
워킹 디렉토리의 모든 파일은 크게 두 가지 상태로 분류된다.
- Tracked (관리대상): 이미 스냅샷에 포함되어 Git이 인지하고 있는 파일 상태
- Untracked (관리대상 아님): 워킹 디렉토리에는 존재하지만, 스냅샷이나 Staging Area 어디에도 포함되지 않은 파일 상태
💡 Tracked 파일의 세부 3단계 상태
Unmodified: 마지막 커밋 이후 아무것도 수정하지 않은 상태
Modified: 파일을 수정한 상태Staged: 다음 커밋에 포함하도록 기록한 상태
3. 핵심 Git 명령어와 파일 관리 흐름
① 파일 상태 확인하기
$ git status
# 짧게 확인
$ git status -s
$ git status --short
- 역할: 현재 브랜치 정보 및 파일들의 상태(Tracked, Untracked, Modified, Staged)를 확인하는 명령어
- 짤막하게 확인하기: git status -s 또는 git status --short 옵션을 주면 변경 상태를 요약해서 보여줌
- ??: 아직 추적하지 않는 새 파일 (Untracked)
- A: Staged 상태로 추가한 새 파일
- M: 수정된 파일
② 파일을 새로 추적하거나 Stage 하기
$ git add . # 전체 디렉토리
$ git add ./my_project # 특정 디렉토리
- 역할: 파일을 Staging Area(다음 커밋에 추가할 공간)에 넣는 명령어
- 특징: 새 파일을 처음으로 추적할 때도 사용하고, 이미 관리 중인 Modified 상태의 파일을 Staged 상태로 만들 때도 동일하게 사용
- 주의점: git add를 실행한 후 파일을 또 수정하면, 수정된 최신 버전을 반영하기 위해 git add를 다시 실행해야 함
③ 변경 내용 상세히 보기
$ git diff
- 역할: 단순히 파일이 바뀌었다는 사실 외에 정확히 어떤 라인이 수정되었는지 비교하는 명령어
- git diff: 워킹 디렉토리에 있는 내용과 Staging Area에 있는 내용을 비교
(즉, 아직 Stage 하지 않은 Unstaged 상태의 변경점만 표시) - git diff --staged (또는 --cached): 저장소의 최신 커밋과 Staging Area에 있는 내용을 비교
(즉, 커밋 대기 중인 Staged 상태의 변경점을 표시)
④ 변경사항 커밋하기
$ git commit -m "커밋 메세지 입력" # 인라인 메시지 작성
$ git commit -a -m "메시지"
- 역할: Staging Area에 올라온 파일들의 스냅샷을 안전하게 저장소 히스토리에 기록하는 명령어
- Staging Area 생략하기: git commit -a -m "메시지"와 같이 -a 옵션을 붙이면, Tracked 상태의 수정된 파일들을 자동으로 Stage 한 뒤 커밋을 완료 (새로 만든 Untracked 파일은 제외)
⑤ 파일 삭제하기
- 역할: Git 관리 대상(Staging Area)에서 파일을 삭제하고 워킹 디렉토리의 실제 파일도 함께 지우는 명령어
- 일반 삭제와의 차이: 일반 파일 삭제 명령 후에는 git add나 git rm을 다시 거쳐야 하지만, 이 명령을 쓰면 즉시 Staged 상태의 삭제 기록으로 반영
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
단순히 워킹 디렉터리에서 파일을 삭제. Git은 현재 “Changes not staged for commit” (즉, Unstaged 상태)라고 표시
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: PROJECTS.md
git rm 명령을 실행하면 삭제한 파일은 Staged 상태, 커밋하면 파일은 삭제되고 Git은 이 파일을 더는 추적하지 않는다
$ git restore --staged ./hello.txt # hello.txt를 스테이징 영역에서 제거(unstage)
참고: 이 명령은 파일의 변경 내용을 삭제하는 것이 아니다. git add로 스테이징한 상태만 취소하고, 수정한 내용은 작업 디렉터리(Working Directory)에 그대로 유지
⑥ 파일 이름 변경하기
- 역할: 파일의 이름을 변경하거나 다른 디렉토리로 이동시키는 명령어.
- 특징: 내부적으로는 기존 파일 삭제(rm) 후 새 파일 추가(add) 과정을 편리하게 묶어 놓은 단축 명령어 역할을 수행
$ git mv file_from file_to
# 아래 명령어 실행과 동일한 결과
$ mv README.md README
$ git rm README.md
$ git add README
git mv 명령은 일종의 단축 명령어. 이 명령으로 파일 이름을 바꿔도 되고 mv 명령으로 파일 이름을 직접 바꿔도 된다. 단지 git mv 명령은 편리하게 명령을 세 번 실행해주는 것 뿐이다. 어떤 도구로 이름을 바꿔도 상관없다. 중요한 것은 이름을 변경하고 나서 꼭 rm/add 명령을 실행해야 한다.
4. 원치 않는 파일 제외하기
$ cat .gitignore
*.[oa] # 확장자가 “.o” 나 “.a” 인 파일 무시
*~ # ~ 로 끝나는 모든 파일을 무시
- 개념: 로그 파일, 빌드 시스템 자동 생성 파일 등 Git이 관리할 필요가 없는 파일을 지정하는 설정 파일
- 규칙: .gitignore 파일을 만들고 무시할 파일 패턴을 기술
- 아무것도 없는 라인이나, # 으로 시작하는 라인 무시
- *는 모든 문자, build/는 해당 디렉토리 전체를 무시 (디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현)
- 슬래시(/)로 시작하면 하위 디렉토리에 적용되지(Recursivity) 않음
- !로 시작하는 패턴은 무시 대상에서 제외
- Glob 패턴 : 정규표현식을 단순하게 만든 것, 보통 쉘에서 많이 사용
- 애스터리스크(*) : 문자가 하나도 없거나 하나 이상을 의미
- [abc] : 중괄호 안에 있는 문자 중 하나를 의미
- 물음표(?) : 문자 하나
- [0-9] : 중괄호 안의 캐릭터 사이에 하이픈(-)을 사용 시 그 캐릭터 사이에 있는 문자 하나
- 애스터리스크 2개 : 사용하여 디렉토리 안의 디렉토리 까지 지정 가능
a/**/z 패턴은 a/z, a/b/z, a/b/c/z 디렉토리에 사용할 수 있다.
.gitignore 파일의 예시
# 확장자가 .a인 파일 무시
*.a
# 윗 라인에서 확장자가 .a인 파일은 무시하게 했지만 lib.a는 무시하지 않음
!lib.a
# 현재 디렉토리에 있는 TODO파일은 무시하고 subdir/TODO처럼 하위디렉토리에 있는 파일은 무시하지 않음
/TODO
# build/ 디렉토리에 있는 모든 파일은 무시
build/
# doc/notes.txt 파일은 무시하고 doc/server/arch.txt 파일은 무시하지 않음
doc/*.txt
# doc 디렉토리 아래의 모든 .pdf 파일을 무시
doc/**/*.pdf
5. Other
$ pwd # 현재 작업 디렉터리 경로 출력
$ cd ./dir # dir 디렉터리로 이동
$ mkdir # 새 디렉터리 생성
$ clear # 터미널 화면 지우기
$ touch a.txt # a.txt 파일 생성(없으면 생성, 있으면 수정 시간 갱신)
$ cat b.txt # b.txt 파일 내용 출력
$ vi a.txt # a.txt 파일 편집
| i | 입력 모드로 전환 |
| Esc | 명령 모드로 전환 |
| :w | 저장 (write) |
| :q | 종료 (quit) |
| :wq | 저장 후 종료 |
| :q! | 저장하지 않고 강제 종료 |
'FullStack Survival > Git' 카테고리의 다른 글
| [Git] 깃 푸쉬 후 로컬에서만 삭제 (깃허브에는 보존) (0) | 2026.09.28 |
|---|---|
| [Git] 서브 모듈 문제 해결 (중첩 git) (0) | 2026.09.28 |
| [Git] Github 연동 시 주의사항⚠️ (0) | 2026.09.17 |
| [Git] Tutorial (0) | 2026.07.19 |
