work-flow

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

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

그림으로 나타내면 위와 아래와 같은 그림이 됩니다.

git의 3가지 components와 컴포넌트간 이동하는 명령어

add 명령어로 work-tree의 file을 index로 가져올 수 있고 commit을 통해 index에 있는 파일들을 repository로 넣을 수 있습니다. 그리고 reset을 통해 거꾸로 돌릴수도 있습니다.

init

init명령어버전관리를 하지 않는 기존 디렉토리(프로젝트)를 git으로 관리하겠다는 명령어입니다. 먼저 버전관리가 필요한 프로젝트의 디렉토리로 이동한 후 git init의 명령어를 사용하면 됩니다.

➜  git-sample git init
/Users/<User>/dev/sample/git-sample/.git/ 안의 빈 깃 저장소를 다시 초기화했습니다
➜  git-sample git:(master) ✗

git init 명령어를 입력하면 그 하위 디렉토리로 .git가 생성됩니다. 해당 디렉토리에는 버전관리에 필요한 기본 파일들이 존재합니다.

add

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

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

다 건을 index로 한번에 처리하는 명령어도 존재합니다. git add --all 또는 git add *를 이용하면 모든 파일을 index에 올릴 수 있습니다.

그리고 git add .를 이용하면 .gitignore 파일을 참고하여 index로 넘길파일과 안 넘길 파일을 결정합니다. .gitignore 파일은 다음 기회에 따로 포스팅 하겠습니다.

commit

commit은 add명령어로 index에 쌓인 것을 repository로 변경이력을 저장하는 것입니다. commit을 하게되면 이전 커밋 상태부터 현재 상태까지의 변경이력이 기록된 커밋이 만들어지며 시간순으로 저장됩니다. 그래서 우리는 변경이력을 통해 과거의 코드를 알 수 있습니다.

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

이 과정은 git commit -m "<message>" 명령어로 한줄로 처리할 수 있습니다. 그리고 commit message를 수정하고 싶을 때가 있습니다. 그때는 git commit --ammend -m "<message>" 명령어를 이용하면 현재 바라보고 있는 commit을 수정할 수 있습니다. amend명령어를 이용하면 메시지뿐만 아니라 commit의 파일등을 수정할 수 있습니다.

위를 보시면 순서대로 예전 커밋을 명령어를 통해 아래와 같이 변경시킨 것을 볼 수 있습니다. commit hashcode가 변경되었지만 Date는 변경되지 않은 것을 확인할 수 있습니다.

status

git status 명령어는 파일들의 상태를 확인할 때 사용하는 명령어입니다. git에서 파일의 상태는 4가지를 가지고 있며 git의 파일들은 아래의 상태를 순환하는 life cycle을 가집니다.

git file status : 참조 : https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EC%88%98%EC%A0%95%ED%95%98%EA%B3%A0-%EC%A0%80%EC%9E%A5%EC%86%8C%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0

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

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

이러한 상태는 git status라는 명령어를 통해 확인할 수 있습니다. 아래 이미지는 해당 명령어를 쳤을 때 결과입니다.

git status 명령어를 통해 나온 위의 이미지를 보면 file의 상태를 알 수 있습니다. 커밋할 변경 사항이라고 출력되는 부분은 Staged 상태이며, 커밋하도록 정하지 않은 변경 사항이란 Modified, 추적하지 않는 파일은 Untracked의 상태 file을 나타내는 것을 알 수있습니다. -s 또는 --short 옵션을 이용하면 아래처럼 요약해서 출력되어집니다.

초록색 M은 staged, 빨간색 M은 Modified, ??는 Untracked 상태를 나타냅니다.

log

git log는 현재까지 커밋된 상태를 시간 순서로 나열하여 보여주는 명령어입니다. 기본적인 명령어인 git log를 이용하면 아래와 같이 출력됩니다. 그리고 옵션을 제공합니다. --graph 옵션은 log의 왼쪽에 graph의 형태로 제공합니다. 그리고 -(n)을 이용하면 HEAD로 부터 해당 숫자만큼의 commit만 보여줍니다.

 

reset

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

먼저 파일의 이전상태로 되돌리는 것을 먼저 보겠습니다.

위 이미지를 보면 modified 상태에서 staged가 된 hello와 untracked 상태에서 staged가 된 hello6를 각각 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을 사용하면 우리가 저지른 실수는 대부분 복구할 수 있지만 되돌린 것은 복구할 수 없습니다. 아래는 되돌리는 명령어에 대해서 정리해 둔 이미지입니다. 참조하면 좋을 것같습니다.

출처 : https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0

마무리

오늘은 이렇게해서 git을 이용한 버전관리에 대해서 알아보았습니다. 저도 글을 쓰며 많은 정리가 되었습니다.

더 알고 싶으신내용이 있다면 덧글 환영합니다.

다음번에는 좀 더 다양한 git에 대한 내용으로 찾아뵙도록 하겠습니다.

감사합니다.

참조

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

https://backlog.com/git-tutorial/git-workflow/

 

 

+ Recent posts