Programming/Git

[Github] 1. Git 기초개념

Sujin Lee (Daisy) 2020. 1. 5. 04:21

Git에 관한 좋은 자료들 

1. Git Pro Book : https://git-scm.com/book/ko/v2/

2. 누구나 쉽게 이해할 수 있는 Git 입문 : https://backlog.com/git-tutorial/kr/

3. Git Tutorial : https://www.slideshare.net/ThomasRausch4/git-introduction-tutorial

 

Git의 데이터 관리법 : 스냅샷 

 - GIt은 데이터를 파일 시스템 '스냅샷'으로 취급. 

 - 파일이 달라지지 않았다면 파일을 새로 저장하지 않음. 단지 이전 상태의 파일에 대한 링크만 저장 

 - 아마도... 위의 이미지에서 보면 ver1~ver5까지 있는데, Git은 아래와 같이 작동하나봄.

    ver1 : 'File A, B, C가 있구나'

    ver2 : 파일A는 A1으로, 파일C는 C1으로 바뀌었군. 파일B는 바뀐거 없음ㅋ

    ver3 : 파일A,B는 바뀐거 없음ㅋ C는 C2로 바뀌었음

    ==> 이런식으로, 현재의 스냅샷(정보? 상태?)로 기억함 ==> 효율적. 

 

Git의 무결성

 - Git은 데이터를 저장하기 전 항상 체크섬(Checksum)을 구하고 그 체크섬으로 데이터를 관리

 - 체크섬(Checksum) : Git에서 사용하는 가장 기본적인 데이터 단위. 

 

세 가지 상태

1. Committed : 데이터가 로컬 DB에 안전하게 저장됐음

2. Modified : 파일을 수정했는데 로컬 DB에 커밋하기 전 

3. Staged : '수정한 파일 곧 커밋할게'라는 표시 

 

세 가지 단계

1. Working Directory : 프로젝트의 특정 버젼을 checkout한 것. 

 - Working directory에서 파일을 수정함 

2. Staging Area : 곧 커밋할 파일에 대한 정보 저장.

 - Staging area에 파일을 stage해서 커밋할 스냅샷을 만듦 

3. .git Directory (Repository) : ...

 - Staging area에 있던 파일들을 커밋해서 Git 디렉터리에 영구적인 스냅샷으로 저장 

 

 

파일의 라이프 사이클

 - Untracked : 관리대상X. 스냅샷에 포함 안 된 애. 

   워킹디렉토리에 있고, staging area에도 올라가지 않은 애. 

 - Tracked : 관리대상 O. 스냅샷에 포함된 애. 

   Unmodified (수정X), Modified(수정O), Staged(커밋예정이지만 아직 커밋은 안했음)로 구분됨. 

 

 

CLI 명령어 

$ git init

 - 이 위치의 폴더를 git으로 관리를 시작하겠다는 뜻. 

 - .git이라는 하위 디렉토리가 생성된다. (숨긴 파일이라 파일탐색기 보기 메뉴에서 '숨긴 항목' 체크해야 .git 폴더 보임) 

 

$ git add

 - 다음 커밋에 해당 파일을 추가하라는 뜻. 

 - 1) untracked이던 파일을 track 시작하고 싶을 때 

 - 2) tracked이던 modified 된 파일을 staging area에 올리고 싶을 때 

 - 3) merge할 때 충돌 난 애를 resolve 상태로 만들 때도 사용 

 

$ git status -s
$ git status --short 

 - 상태를 간단하게 보여줌

 - 파일명 앞 문자들 의미

   1) M : Modified. 수정한 파일.

      (공백)M : Modified && !Staged

      M(공백) : Modified && Staged

      MM : Modified && !Staged + Modified&&Staged. 

   2) A : Added. staging area에 add한 파일.

   3) ?? : 추적하지 않는 파일. Untracked인 애들.

  

$ git diff

 - 어떤 내용이 변경됐는지 확인.

 - Unstaged 상태인 애들만 보여줌. ==> staging area에 올라간 애들은 볼 수 없음  

 

$ git diff --staged
$ git diff --cached 

 - staging area에 올라간 애들의 변경된 부분을 보고 싶을 때 사용 

 

$ git commit

 - staging area에 있던 애를 커밋 

 

$ git commit -m "여기에 커밋 메시지를 입력합니다."

 - 커밋메시지 작성해서 커밋 

 

$ git commit -v

 - 편집기에 diff 메시지 추가해서 커밋 <==??? 

 

$ git commit -a -m '여기에 커밋메시지를 입력합니다.' 

 - add와 commit을 한 방에! 

 

 

 

 

$ git push --force

 - 강제 푸시 

 

 

$ git tag <tagname>

  - 태그 추가

$ git tag

 - 태그목록 확인

 

$ git log --decorate

 - 태그 정보를 포함한 이력 확인

 

$ git tag -a <tagname>

 - 주석달린 태그 추가 (주석내용은 저 명령어 직후 입력받음) 

 

$ git tag -am "주석내용" <tagname>

 - 주석달린 태그 추가 (주석내용까지 한 방에) 

 

$ git tag -n 

 - 태그 목록 / 주석내용 확인 

 

 

 

$ git reset --hard HEAD~1

 - 현재부터 1개의 커밋을 되돌아가라

 - reset 후 강제 푸쉬 (git push --force) 해줘야함 

 - HEAD : 현재 커밋 / HEAD~# : 현재 커밋으로부터 #번째 전 커밋

 - 옵션 : hard, soft, mixed 

   1) --soft: commit 취소하고 해당 파일들은 staged 상태로 워킹 디렉터리에 보존

   2) --mixed: 디폴트 옵션. commit 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에 보존

   3) --hard: commit 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에서 삭제

 

 

$ git stash 

 - 하고 있던 작업을 임시 작업공간에 저장

$ git stash list

 - stash 한 리스트 불러오기

$ git stash pop

 - 마지막으로 stash한 작업 불러오기

$ git stash apply stash@{3}

 - 특정 stash 불러오기 

 - stash@{#} : 가장 최근 stash 한 것이 stash@{0}이고 그 이전 것들은 1,2,3, ,,, 이렇게 숫자 매겨짐 

 

 

 

리모트 브랜치 삭제 

 

1) 삭제하고자 하는 브랜치 외의 다른 브랜치로 checkout 

$ git checkout dev

2) 로컬에서 브랜치 삭제 

$ git branch -d test

3) 원격저장소로 push 해서 리모트 브랜치도 삭제 

$ git push origin :test

 

 

 

충돌날 때 

<<<<< HEAD 
현재 체크아웃된 파일의 코드 (내꺼 지금 파일) 
============
병합하려는 브랜치의 코드 (깃에 이미 올라가 있는 파일) 
>>>>>>>

위에꺼가 지금 내 파일!!

아래꺼가 이전 파일!!! (깃에 이미 올라가있던 파일!!) 

반응형