IT탐험

Git의 기초(init, add, .gitignore, clone, commit) 본문

공부내용정리/Git

Git의 기초(init, add, .gitignore, clone, commit)

watercase 2021. 12. 25. 07:17
  • Git이란 버전관리시스템(Version Control System)으로써 특정 폴더내 파일들의 변경사항을 추적하고 여러 사용자들 간 파일작업을 조율하기 위한 분산 버전관리시스템임

 

  • Git을 사용하려면 설치가 필요함
    • https://git-scm.com/ 에서 설치를 할 수 있음
    • 설치 후 Git Bash를 실행하여 Git을 이용함

 

  • Git을 사용하기 위해 .git이라는 파일의 변경 내역을 저장하는 영역이 필요함
    • Git을 적용하기 위한 폴더로 이동 후 'git init' 명령을 사용하여 생성이 가능함
      • cd [폴더이름] : 현재 위치의 하위에 있는 [폴더이름]으로 이동함
      • cd .. : 상위 디렉토리로 이동함
      • git init : 현재 폴더에 .git을 생성함

 

  • 깃은 세 가지 공간으로 분리하여 생각할 수 있음
    1. 작업을 하는 공간(working)
    2. 임시로 저장하는 공간(stage)
    3. 실제로 저장하여 기록하는 공간(repository)

 

  • 작업을 하는 공간(working)
    • 실제로 파일을 생성하고 수정하는 공간임
    • 깃은 워킹 디렉터리에 있는 파일들을 untracked(추적되지 않음)와 tracked(추적됨) 상태로 구분함
      • untracked
        • 워킹 디렉터리에 추가하거나 수정한 파일은 모두 untracked 상태임
        • 깃으로 파일을 관리하려면 명령을 통해 파일을 추적하도록(tracked 상태로) 변경해야함
      • tracked
        • untracked 상태인 파일들은 'git add' 명령어를 통해 tracked 상태로 변경할 수 있음
        • git add [파일이름] : [파일이름]을 깃이 추적하도록 변경함

 

  • 임시로 저장하는 공간(stage)
    • 커밋을 빠르게 처리하려는 목적으로 워킹 디렉터리에서 제출된 tracked 파일들을 관리함
    • 파일들의 스테이지 상태는 'git status' 또는 'git ls-files --stage' 명령어로 확인할 수 있음
    • 스테이지 영역에 등록된 파일든은 stage 상태와 unstage 상태로 구분됨
      • 깃이 변화 이력을 기록하려면 파일들이 stage 상태여야함
      • unstage 상태란 파일에 변화가 있다는 것을 의미함
        • 스테이지 영역의 파일과 워킹 디렉터리 안의 파일 내용에 차이가 있으면 unstage 상태이고 'git add' 명령으로 스테이지에 다시 추가하면 stage 상태가 됨
        • 스테이지 영역에 등록하지 않은 워킹 디렉터리 안의 파일은 unstage 상태임과 동시에 untracked 상태임
    • 파일이 수정되면 워킨 디렉터리와 스테이지 간 내용이 일치하지 않는데, 이를 구분하기 위해 수정함(modified) 상태와 수정하지 않음(unmodified) 상태로 구분됨
      • tracked 상태인 파일이 수정되면 스테이지는 파일 상태를 modified 상태로 변경하고 스테이지에서 제외함
        • modified 상태로 변경된 파일은 'git add' 명령어로 스테이지에 재등록 해야함
      • unmodified 상태는 tracked 상태이면서 스테이지에서 한 번도 수정하지 않은 원본 상태를 의미함

 

  • 파일의 상태를 확인하려면 'git status' 명령을 사용함
    • 파일의 상태란 깃의 분리된 저장 영역인 워킹 디렉터리와 스테이지, 추적 여부를 의미함

 

  • 추적이 불필요하거나 보안에 민감한 파일 등을 워킹디렉터리 목록에서 제외시키려면 .gitignore 설정 파일 안에 기록하여 추가함
    • 저장소 폴더의 최상위 디렉터리에 파일 이름을 .gitignore로 만들고 텍스트 에디터를 이용하여 깃에서 제외할 파일 이름을 적거나 규칙을 사용하여 나열할 수 있음
    • .gitignore 파일 표기법
      • 파일에서 #으로 시작하는 줄은 주석으로 처리
      • * 기호를 이용하여 모든 문자열을 대체할 수 있음
        • *.exe
      • 제외하지 않거나 추적이 필요한 파일은 ! 기호로 표현함
        • !main.java
      • 디렉터리는 슬래시(/)를 이용하여 표현함
        • 현재 디렉터리 안에 있는 파일 무시
          • /readme.txt
        • a 디렉터리 안의 모든 것을 무시
          • /a/
        • a 디렉터리 아래의 모든 .html 파일 무시
          • a/**/*.html
      • 이외에도 glob 패턴을 지원하므로 정규 표현식으로 작성할 수 있음

 

  • 외부의 기존 프로젝트(GitHub, GitLab...)를 기반으로 로컬 저장소를 생성할 수 있음
    • 일반적으로 웹 사이트에서 소스 코드를 압축 파일로 내려받으면 .git폴더는 가져올 수 없음
    • 깃을 이용하여 저장소를 복제하면 .git 폴더도 함께 내려받을 수 있음
      • git clone 원격저장소URL [새폴더이름]
        • 폴더 이름을 지정하지 않으면 공개 저장소에서 사용된 폴더와 동일한 이름으로 새 폴더를 만듬
      • 예시) git clone https://github.com/username/projectname copyfolder

 

  • 커밋(commit)이란 깃이 코드 변경 과정을 기록하여 코드의 이력을 만드는 것을 뜻함
    • 개발하는 도중 실수나 잘못된 동작을 발견했을 때 특정 커밋 시점으로 되돌아갈 수 있음
    • 최종적인 커밋 작업의 위치를 가리키는 HEAD라는 묵시적 참조 포인터가 있는데 최초 커밋시점에서는 HEAD의 포인터가 없음
    • HEAD가 가리키는 커밋에서 변경된 부분을 찾아 수정된 내용만 저장하는 스냅샷 방식으로 깃 저장소에 영구적으로 기록함
    • 'git commit -m ['msg']' : 커밋할 때 msg를 작성하는 작업을 스킵하고 곧바로 msg 이름으로 커밋
    • 'git commit -am 'msg'' : 커밋할 때 add 작업과 msg 작성하는 작업을 스킵하고 곧바로 msg 이름으로 커밋
    • 'git checkout -- [수정파일이름]' : 파일의 내용을 수정 전 상태로 되돌림
    • 'git commit --amend' : 마지막 커밋을 수정할 수 있음
    • 커밋 아이디는 40자리의 hexa값으로 이루어진 SHA1 해시알고리즘을 사용하는데 앞쪽 7자만으로도 중복을 방지하면서 전체 키 값을 사용할 수 있으나 전체의 키 값을 다 사용하는것이 안전함
    • 'git log --pretty=short' : 로그를 출력할 때 첫 번째 줄의 커밋 메시지만 출력함
    • 'git show 커밋ID' : 특정 커밋의 상세 정보를 확인할 수 있음
    • 'git log [파일이름] : 특정 파일의 로그 기록을 확인할 수 있음
    • 'git log' 의 옵션
      • -p : diff 기능(수정한 라인 비교)을 같이 포함하여 출력함
      • --stat : 히스토리를 출력함
      • --pretty=oneline : 각 커밋을 한 줄로 출력함
    • 'git diff' : 워킹 디렉터리와 스테이지 영역 간 파일의 변경 내역을 파악할 수 있음
      • 'git diff head' : 이전 커밋과 최신 커밋의 변경 내용을 비교할 수 있음

'공부내용정리 > Git' 카테고리의 다른 글

복귀(reset, revert)  (0) 2021.12.28
병합과 충돌(merge, rebase)  (0) 2021.12.27
스태시(stash)  (0) 2021.12.27
브랜치(branch, checkout)  (0) 2021.12.26
서버 저장소(GitHub, remote, push, clone, pull, fetch, merge)  (0) 2021.12.26
Comments