본문 바로가기
ETC/Git

[Git] Git의 기본

by 컴돈AI 2024. 4. 30.

목차

Git이란?

  • Git이란 간단히 말하면 코드 버전 관리 시스템입니다. 

Git의 작업영역

  • Working Directory / Staging Area / Local repository / Remote repository
    • Working Directory
      • 현재 로컬환경에서 작업 중인 프로젝트 폴더
    • Staging Area
      • commit 하기 전 commit 할 파일들을 모아두는 공간
      • commit 시 Staging Area안의 내용이 한 번에 Local Repository에 반영
    • Local Repository
      • commit된 파일들이 위치하는 영역 (이를 통해 버전 관리를 진행합니다.)
    • Remote Repository
      • 협업이나 백업을 위해 존재하는 원격 저장소

git 시작

  • "git init"을 통해 Local Repository를 생성할 수 있습니다. (즉, .git 폴더가 생성됩니다.)
  • "git add"를 통해 현재 프로젝트 폴더에서 작업된 내용을 Staging Area에 올릴 수 있습니다.
    • 파일 스테이징 하기 : "git add 파일"
    • 여러 파일 스테이징 하기 : "git add 파일1 파일2 파일3 ..."
    • 변경된 모든 파일 스테이징 하기 : "git add ."
    • (참고)스테이징한 파일을 다시 취소하고 싶은 경우 : "git restore --staged 파일명"
  • "git commit"을 통해 Staging Area에 있는 파일들을 커밋할 수 있습니다. (즉, 버전이 생성되는 것입니다.)
    • 스테이징된 파일들 커밋하기 : "git commit -m 커밋메시지"

Git이 관리하는 파일 상태

  • Untracked
    • 파일이 처음 생성 시에 해당 파일은 Git이 추적하지 못하므로 Untracked 상태입니다.
  • Tracked
    • 처음 파일이 생성되고 Untracked 파일이 add나 commit을 통해 Git이 관리하도록 해주면 Tracked 상태가 됩니다.
    • git add 만 해주더라도 Tracked file이 됩니다.
  • Ignored
    • .gitignore에 작성된 파일이나 폴더
    • 해당 파일은 Git이 추적하지 않습니다.

git status를 통한 파일 상태 확인

  • "git status" 명령어를 사용하면 해당 브랜치의 변경되거나 추가된 파일들의 상태를 표시해 줍니다. 
    • 제일 처음 줄에 On branch 브랜치명을 통해 현재 브랜치명이 표시되어 있습니다.
    • 다양한 상태
      • nothing to commit, working tree clean
        • 현재 브랜치에 변경사항이 존재하지 않습니다.
      • Untracked files
        • 새로 생성된 파일, 즉 Git에서 추적되고 있지 않은 파일들입니다. (= 새로 생긴 파일)
      • Changes to be committed
        • Staging Area에 올라간 파일들입니다. (= add된 상태) (초록색)
        • new file : 새로운 파일
        • modified : 변경된 파일
        • deleted : 삭제된 파일
      • Changes not staged for commit
        • 현재 브랜치기준 변경되었지만, Staging Area에 올라가지 않은 파일들입니다. (= 변경되었지만, add 되지 않은 상태) (빨간색)
        • modified : 변경된 파일
        • deleted : 삭제된 파일
        • (참고 : new file은 add 되기 전에 Untracked File이기 때문에 여기에 표시되지 않고, Untracked files에 표시가 됩니다.)
  • "git status -s" 의 경우 두 개의 글자로 현재 상태를 표시합니다. 
    • nothing to commit, working tree clean일 경우 아무런 내용이 출력되지 않습니다.
    • Untracked files 의 경우 "?? 파일명"으로 표시됩니다.
    • Changes to be committed(X)(초록색)Changes not staged for commit(Y)(빨간색)는 각각 해당 파일 상태를 2개의 문자(XY)로 표시합니다.
      • 해당 내용이 없을 경우 공백으로 표시됩니다.
      • Changes to be committed(왼쪽문자)
        • Staging Area에 올라간 파일들입니다. (= add된 상태) (초록색)
        • new file : A로 표기
        • modified : M으로 표기
        • deleted : D로 표기
      • Changes not staged for commit(오른쪽문자)
        • 현재 브랜치기준 변경되었지만, Staging Area에 올라가지 않은 파일들입니다. (= 변경되었지만, add 되지 않은 상태) (빨간색)
        • modified : M으로 표기
        • deleted : D로 표기
        • (참고 : new file은 add 되기 전에 Untracked File이기 때문에 여기에 표시되지 않고, Untracked files로 ??표시가 됩니다.)
    • 예시

        • a파일은 수정되고 stage에 올라간 상태입니다.
        • b파일은 수정되고 stage에 올라간 상태이지만, stage에 올라간 이후에 추가로 수정된 상태입니다.(이 뒤에 작업은 아직 stage에 올라가지 않은 상태입니다.)
        • c파일은 삭제되고 stage에 해당 삭제내용을 add한 상태입니다.
        • d파일과 f파일은 생성된 뒤, stage에 올라간 상태입니다.
        • e파일의 경우 생성된 뒤, 아직 add가 되지않아 Untracked 상태입니다.

Git 설정(config)

  • git에는 사용자이름, 사용자이메일, 기준이 되는 브랜치명 등 여러 설정항목들이 있습니다. 해당 설정항목들은 config 파일에 존재합니다. config 파일은 로컬 - 글로벌 - 시스템 우선순위로 적용됩니다.
    • 로컬 : 해당프로젝트폴더\.git\config
      • 프로젝트 별로 적용되는 설정사항입니다.
    • 글로벌 : C:\Users\[사용자 아이디]\.gitconfig
    • 시스템 : C:\Program Files\Git\etc\gitconfig
  • git config  
    • "git config --list"를 통해 해당 프로젝트에 적용되는 모든 설정사항을 확인할 수 있습니다.
    • --global
      • 이 옵션을 적용하면 글로벌 config에 적용이 됩니다. 보통 컴퓨터를 사용하는 사용자 이름, 이메일 계정 등을 글로벌 config에 적용시킵니다.
        • 이 옵션을 적용하지 않으면 로컬 config에 적용됩니다. (즉, 다른 프로젝트에서는 해당 config 정보가 저장되어 있지 않습니다.)
      • "git config --global 설정명 설정값"
      • 예시
        • "git config --global user.name 사용자이름"
        • "git config --global user.email 이메일계정"
        • "git config --global init.defaultbranch main"
          • 이 옵션은 기준이 되는 브랜치 명이 master로 생성되는 경우가 많은데, 이를 main으로 변경시켜 주는 것입니다.
    • --unset
      • 이 명령어는 해당 config 정보를 삭제시킵니다.
      • "git config --unset 설정명"
      • 예시
        • "git config --global --unset user.name"
        • "git config --global --unset user.email"