본문 바로가기
FullStack Survival/Git

[Git] Command

by cloudhorison 2026. 7. 20.

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! 저장하지 않고 강제 종료