슬기로운 개발생활

[Git] Git 버전관리 - 기본 (init, add, commit, status, log, diff, reset)

by coco3o
반응형

Git 설치&방법

Git 다운로드가 안되어있다면 위의 링크로 가서 다운로드 하시면 됩니다.

 

Work-flow

git은 3가지의 컴포넌트를 가지고 있다.

 

  • work-tree
    • work-tree는 working directory라고도 불리며 현재 작업중인 디렉토리에 들어있는 수정가능하며 읽을 수 있는 모든 파일이 들어있는 컴포넌트라고 생각하면 된다.
  • index
    • index는 staging area라고도 불리며 commit 되기 전 준비단계가 보존되는 컴포넌트이다. index는 work-tree에 있는 file 중 변경되어져 commit 되어질 파일들이 모여있는 컴포넌트이다.
    • working directory에 있는 file중 한 파일을 변경한다면 index 컴포넌트에서 수정되었다는 마크처리를 해둔다.
  • repository 
    • 레포지토리는 컨테이너라고도 불린다. 해당 컴포넌트는 프로젝트 파일들의 변화를 축적한다.
    • 모든 커밋의 history를 snapshot의 형태로 가지고 있다.
    • git log 명령어를 통해서 commit history를 확인할 수 있다.

그림으로 나타내면 아래와 같다.

출처 : https://sabarada.tistory.com/71?category=792135


init

init 명령어는 버전관리를 하지 않는 기존 디렉토리(프로젝트)를 git으로 관리하겠다는 명령어이다.

먼저 버전관리가 필요한 프로젝트의 디렉토리로 이동한 후 git init 의 명령어를 사용하면 된다.

pwd : 현재 위치

cd : 이동

mkdir :디렉토리 생성

git init . : ( . ) 은 현재 디렉토리를 Git으로 관리하겠다는 명령어


add

git add 명령어는 work-tree에 있는 file을 index 컴포넌트로 넘기는 명령어이다.

 

add 명령어를 사용하기에 앞서 먼저 예제 파일을 하나 만들어보자.

Git bash의 기본 에디터 vim을 이용해서 hello.txt 파일을 생성한다.

여기서 i를 눌러야만 파일을 작성할 수 있다.

작성 후 -- INSERT -- 를 벗어나기 위해 Esc를 누르고 :wq를 해준다.

:wq  : 작성(저장) 후 종료

git add <filename> 명령어는 file 하나를 index 컴포넌트로 넘기는 명령어이다. 아래와 같이 사용할 수 있다.

add 명령어를 하기 전에 git status로 상태를 확인해봤더니 hello.txt는 Untracked files(추적되지 않는 파일)이라고 나와있고, 커밋할 사항에 포함시키려면 "git add <file>..."을 사용하라고 Git이 친절하게 알려준다.

git add hello.txt 명령어를 사용해서 add 해주고 다시 git status를 해보았다.

 

git status 명령어는 아래에서 설명하도록 한다.

 

여기서 commit을 하기 전에 add를 하는 이유를 생각해보자.

- h1.txt와 h2.txt 두 개의 파일이 있다고 가정하고, 두 개의 파일 중 h1.txt만 커밋을 하고 싶을 때 h1.txt만 add 명령어를 사용하여 index(커밋대기존)에 포함시킬 수 있다. 즉, add를 이용하여 선택적으로 파일을 커밋한다는 것이다.


commit

commit은 add명령어로 index에 쌓인 것을 repository로 변경이력을 저장하는 것이다.

commit을 하게되면 이전 커밋 상태부터 현재 상태까지의 변경이력이 기록된 커밋이 만들어지며 시간순으로 저장된다.

그래서 우리는 변경이력을 통해 과거의 코드를 알 수 있다.

 

git commit 명령어는 기본으로 사용할 수 있는 명령어이다. 명령어를 사용하면 아래와 같이 vi로 들어가게 되고, 메시지를 입력하고 :wq로 저장하면 커밋 메시지가 된다.

이 과정은 git commit -m "<message>" 명령어를 사용해 한줄로 처리할 수 있다.

그리고 commit message를 수정하고 싶을 때가 있을 것이다.

그땐 git commit --amend -m "<message>" 명령어를 이용하면 현재 바라보고 있는 commit을 수정할 수 있다. amend 명령어를 이용하면 메시지뿐만 아니라 commit의 파일 등을 수정할 수 있다.

위를 보면 순서대로 예전 커밋을 명령어를 통해 아래와 같이 변경시킨 것을 볼 수 있다.

commit hashcode(노란색)가 변경되었지만 Date는 변경되지 않은 것을 확인할 수 있다.


status

git status 명령어는 파일들의 상태를 확인할 때 사용하는 명령어이다.

git에서 파일의 상태는 4가지를 가지고 있으며 git의 파일들은 아래의 상태를 순환하는 life cycle을 가진다.

출처 :&nbsp;https://sabarada.tistory.com/71?category=792135

각각 상태의 설명은 아래와 같다.

  • Untracked : git에서 관리하고 있지 않는 파일
  • Tracked : git에서 관리하는 파일이며 이미 스냅샷에 포함되어 있는 파일 이는 Committed, Modified, Staged의 상태 중 하나를 가지게 됨
    • Staged : 커밋으로 저장소로 기록될 상태
    • Committed : git의 관리대상이기는 하지만 수정되지 않았을 상태. 이는 처음 저장소를 clone 했을 때의 상태이기도 하다.
    • Modified : git에서 관리하는 파일 중 파일을 수정했을 때의 상태. 이 커밋하기 위해서는 이 상태에서 Staged 상태로 만든 후(add 명령어 등 이용) 커밋하면 된다.

이러한 상태는 git status 명령어를 통해 확인할 수 있다.


log

git log는 현재까지 커밋된 상태를 시간 순서로 나열하여 보여주는 명령어이다. 기본적인 명령어인 git log를 이용하면 아래와 같이 출력된다.

그리고 옵션을 제공한다. --graph 옵션은 log의 왼쪽에 graph의 형태로 제공해준다.

 


diff

Git을 사용하다보면 현재 commit과 예전에 수행했던 commit의 변경사항을 비교 하고 싶을 때가 있을 것이다.

이럴 땐 git diff A..B 명령어를 사용한다. 여기서 A와 B엔 commit의 hashcode(id)가 들어간다.

commit의 hashcode는 git log를 통해 확인할 수 있다.

h1.txt의 first-commit의 내용은 Hello이고 h1.txt의 second-commit의 내용은 Wolrd!이다.

그렇다면 그냥 git diff 명령어는 무엇일까? 우선 h1.txt를 열어 @@를 붙여주고 git add를 하지 않고 git diff를 입력해보자.

위와 같이 변화의 전후를 보여주고 있다. 만약 git add를 한 후, git diff를 입력하게 되면 git은 아무것도 보여주지 않는다.

그리고 이것은 우리가 git add를 하기 전에 다시 한 번 내용을 검토할 기회를 준다는 것을 알 수 있다.


reset

reset 명령어는 staged 상태가 되어있는 파일을 이전 상태(untracked 또는 modified) 상태로 되돌리거나 commit을 이전으로 되돌릴 때 사용하는 명령어이다.

위 이미지를 보면 modified 상태에서 staged가 된 h2.txt와 untracked 상태에서 staged가 된 h3.txt를 각각 

reset 명령어를 이용해서 아래와 같이 원 상태로 돌릴 수 있는걸 확인해 보자.

commit을 되돌리는데 사용되는 reset은 옵션으로 3가지를 지원한다.

 

  • --soft : commit된 수정내용이 index에 들어가있는 상태가 된다.(HEAD와 master가 가리키는 commit 변경)
  • --mixed : commit된 수정내용이 work-tree에 들어가있는 상태가 된다.(HEAD와 master가 가리키는 commit 변경, 변경된 HEAD에 있는 내용 index에 가져오기)
  • --hard : commit된 내용을 이전으로 이동하는데 work-tree까지 reset한다. 따라서 모든 수정 내용이 없던것으로 돌아간다.(HEAD와 master가 가리키는 commit 변경, 변경된 HEAD에 있는 내용 index에 가져오기, index에 있는 내용 work-tree로 가져오기)

각 단계에 따라 하나씩 되돌아 오는게 많아진다고 생각하면 좋다.

 

--hard 옵션을 이용하여 한 번 되돌리면 복구할 수 없기에 주의해야 한다.

Git을 사용하면 우리가 저지른 실수는 대부분 복구할 수 있지만 되돌린 것은 복구할 수 없다.

 

 

references : https://sabarada.tistory.com/71?category=792135

생활코딩 지옥에서 온 Git 강의

 

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기