본문 바로가기

CS+/리눅스

깃&깃허브 입문 2일차 - git init, add, commit, reset, checkout

지난 시간에 이어서 

 

이고잉님의 '지옥에서 온 문서 관리자 깃&깃허브 입문' 2장을 공부해보겠습니다. 

깃 실습은 별도로 코드를 올리지 않겠습니다. 올릴 수도 없(?)구요. 

우분투나 맥을 쓰신다면 제 실습 캡쳐를 보시고 각자의 터미널에서 하시면 되고,

윈도우를 쓰신다면 이고잉님의 생활코딩 강의 영상이나 위 책을 통해 세팅을 한 뒤에 하시면 될 것 같습니다.

 

시작하겠습니다! 

 

02-1 깃 저장소 만들기 

깃 초기화 - git init 
(우분투 기준) 숨김 파일 gui 에서 확인하기 : ctrl + h 

 

디렉터리를 하나 생성한 다음, 

git init 

이라는 명령어를 입력하면 해당 디렉토리에서 깃을 사용할 수 있습니다. 

 

위 캡쳐에서 .git 이라는 폴더가 없었다가 git init 을 한 뒤에는 나타납니다. 

ls -la 명령어 말고 gui 환경에서는 처음에 안나타납니다. 

이 때, ctrl + h 를 눌러주면

 

이렇게 나타납니다. 

 

02-2 버전 만들기

 

출처: https://www.youtube.com/watch?v=tP_Q_o8KOUA&list=PLuHgQVnccGMATJK16UJ9Fjay0ozrSZKiI&index=5

 

작업 트리(Working tree)
- 파일 수정, 저장 등의 작업을 하는 디렉터리. 우리 눈에 보이는 디렉터리

- 버전으로 만들어 지기 전 단계


스테이지(Staging Area)
- 버전으로 만들 파일들이 대기하는 곳. 스테이징 영역(staging area)라고도 부른다 

- 예를 들어,  작업 트리에서 10개의 파일을 작업하고 있는데 2개의 파일만 버전으로 만들고 싶다면 이 2개의 파일만 스테이지에 넘겨줍니다. 


저장소(Repository) 
- 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳 

깃이 버전을 만드는 순서
1) 작업 트리에서 문서를 수정
2) 수정한 파일 중 버전으로 만들고 싶은 것을 스테이징 영역에 저장
3) 스테이지에 있던 파일을 저장소로 커밋 

 

정도를 머리에 담아주셨으면, 

이제 실습을 해보겠습니다. 

 

vim 을 통해 hello.txt 라는 파일을 만듭니다. 안에는 1이라는 내용만 입력하고 저장 후 종료 해주시면 됩니다. 


# 깃 상태 확인 
$ git status 

 


-On branch master: 현재 master 브랜치에 있습니다.

-untracked files: 한 번도 버전관리하지 않은 파일 

 

git status 를 처음에 입력할 때와 hello.txt 를 만든 뒤 입력하고 나서의 결과 차이가 보이시나요? 


# 수정한 파일을 스테이징하기 
$ git add 파일명 

 


- ' new file: ' hello.txt 
Changed to be commit  
: 새 파일 hello.txt 를 앞으로 커밋할 것이다 라는 의미

#스테이지에 올라온 파일 커밋하기 
$ git commit -m 메시지명

 

파일이 스테이지에 있으면 버전을 만들 수 있습니다. 깃에서는 버전을 만드는 것을 간단히 '커밋(commit)한다'고도 말합니다. 

 

위 실습에서 결과 메시지를 보면 파일 1개가 변경되었고, 파일 1개의 내용이 추가되었다고 영어로 써있습니다. 이 다음에 git status 를 보면, 버전으로 만들 파일이 없고(nothing to commit) 작업 트리도 수정사항 없이 깨끗하다(working tree clean)고 나타납니다. 

 

저장소에 저장된 버전을 확인할 때는 git log 명령을 사용합니다. 

 

# 스테이징과 커밋 한꺼번에 처리하기 

$ git commit -am 메시지명
: 한 번 커밋한 파일이라면 -am 옵션을 붙여서 스테이징과 커밋을 한꺼번에 처리할 수 있다. 

 

기존에는 git add 명령(워킹 트리 -> 스테이지) 한 뒤, git commit 명령(스테이지 -> 저장소)을 처리했습니다.  hello.txt 파일은 한 번 커밋한 전적이 있습니다. 이 때, -am 옵션을 붙여서 스테이징과 커밋을 한꺼번에 처리할 수 잇습니다. 

 

02-3 커밋 내용 확인하기 

 

# 커밋 기록 자세히 살펴보기 
$ git log 
- 커밋을 만든 사람, 시간, 메시지가 함께 나타남 

- 커밋 해시 옆에 있는 (HEAD-> master) 은 이 버전이 가장 최신이라는 표시 

- git log 명령을 입력했을 때 나오는 정보를 묶어 간단히 '커밋 로그' 라고 부른다.

 


# 변경 사항 확인하기 
$ git diff

 

 

위 실습에서 hello.txt 파일을 열어서 마지막에 'two'라는 글자를 추가 한뒤 저장 및 종료 하겠습니다. 

그 후, git diff 를 입력하면 차이를 알 수 있습니다. 

 

'-2'는 '2' 가 삭제되었다는 의미이며 '+two'는 'two라는 내용이 추가되었다는 의미입니다. 

 

# tracked 파일과 untracked 파일

 

tracked: 깃은 한 번이라도 커밋을 한 파일의 수정 여부를 계속 추적하는데 깃이 추적하는 파일을 tracked 파일이라 한다.
untracked files: 한 번도 깃에서 버전 관리를 하지 않은 파일. 수정 내역을 추적하지 않는다. 

 

hello.txt 파일에 3을 추가 입력합니다. hello2.txt 파일을 추가로 만들었습니다. 

hello.txt 파일의 경우, 변경된 파일이 아직 스테이지에 올라가지 않았다는 메시지가 나타납니다. modified 라고 되어있기에 수정되었다는 것을 알 수 있습니다. 이렇게 깃은 한 번이라도 커밋을 한 파일의 수정 여부를 계속 추적합니다. 깃이 추적하고 있다는 뜻에서 tracked 파일이라고 부릅니다.

 

hello2.txt 파일 앞에는 아무 것도 없는데 한 번도 깃에서 버전 관리를 하지 않았기 때문에 수정 내역을 추적하지 않습니다. 그래서 unstacked 파일이라고 표시합니다. 

 

git add 명령어를 두 파일에 해주고 나면,

Changed to be commit  
: 앞으로 커밋할 것이다 

라는 메시지가 나타납니다. 스테이지 올라가 있기 때문에 저러한 문구가 뜨는 겁니다. 

스테이지 올라가 있다는 뜻은 버전관리(=commit)을 해줄 단계이기 때문이죠. 

 

이제, 커밋 해보겠습니다. 

이 커밋에는 hello.txt 를 수정한 내용과 새로 만든 hello2.txt 내용이 다 포함됩니다. 

 

각 커밋에 어떤 파일들이 관련된 것인지 위에서는 알 수 없습니다. 

이 때는,

 

--stat 옵션을 사용합니다. 

 

message3 커밋은 hello.txt, hello2.txt 파일과 관련되어 있고, 

message2 커밋은 hello.txt 파일과 관련된 것을 확인할 수 있습니다. 

 

로그 메시지가 너무 많으면 한 화면씩 나누너 보여줍니다. 이 때, enter 를 누르면 다음 로그 화면을 볼 수 있고 Q 를 누르면 로그 화면을 빠져 나와 다시 깃 명령을 입력할 수 있습니다. 

 

# unmodified, modified, staged 상태

ls -al 명령으로 hello-git 디렉터리를 살펴보겠습니다. 

 

현재 작업 트리에 있는 모든 파일의 상태는 unmodified , 즉 수정되지 않은 상태입니다. 

hello2.txt 파일을 열어 'a'만 남기고 모두 삭제하고 저장 후 종료합니다. 

 

git status 명령을 실행하면, changes not staged for commit: 메시지가 나타납니다. 

파일이 수정만 된 modified 상태라는 의미입니다. 

 

add 해준 뒤에 상태를 보면 changes to be commited :라는 메시지가 나타납니다.

커밋 직전 단계, 즉 staged 상태입니다. 

이제 커밋을 하고 상태를 보면 수정이 없던 unmodified 로 돌아간 것을 볼 수 잇습니다.

 

02-5 작업 되돌리기

 

#작업 트리에서 수정한 파일 되돌리기 - git checkout

 

hello.txt 파일을 열여서 '3'을 영문 'three'로 수정한 후 저장합니다.

status를 보면 아직 스테이지에 올라가 있지 않다고 합니다. 

두 번째 메시지에 변경 사항을 취소하려면 checkout 을 쓰라고 되어있습니다. 

git checkout -- hello.txt

를 입력해보겠습니다.

 

 

three 로 추가한 내용이 다시 '3'으로 되어 있는 것을 확인할 수 있습니다. 

 

#스테이징 되돌리기 - git reset HEAD 파일 이름 

- 수정된 파일을 스테이징 했을 때, 스테이징을 취소하는 방법

 

hello2.txt 의 기존 내용을 삭제하고 대문자 'A,B,C,D'를 입력한 후 저장하고 종료합니다. 

 

 

수정한 hello2.txt 파일을 스테이지에 올린 후 상태를 봅니다. 스테이지에서 내리려면 reset HEAD 명령을 사용하라고 합니다. 

스테이지에서 내려졌다는(unstaged) 메시지가 나타납니다. 

git status를 사용하면 파일이 아직 스테이지에 올라가기 전(not staged)으로 돌아온 것을 확인할 수 잇습니다. 

 

#최신 커밋 되돌리기 - git reset HEAD^

- 수정된 파일을 스테이징하고 커밋까지 했을 때, 가장 마지막에 한 커밋을 취소하는 방법을 알아보겠습니다. 

 

hello2.txt 문서를 수정합니다. 대문자 'E'를 끝에 추가후, 저장합니다. 

커밋 메시지는 'message4'로 하겠습니다. 

 

최신 커밋을 되돌리려면 git reset 명령 다음에 HEAD^를 붙입니다. 

 

HEAD^ 는 현재 HEAD가 가리키는 브랜치의 최신 커밋을 가리킵니다. 

이렇게 되돌리면 커밋도 취소되고 스테이지에서도 내려집니다. 취소한 파일이 작업 트리에만 남습니다.

git log 명령으로 커밋을 보면 'message 4' 인 커밋이 사라진 것을 볼 수 있습니다. 

 

#특정 커밋으로 되돌리기 - git reset 커밋 해시

 

깃에서는 파일을 수정하고 커밋할 때마다 저장된 버전들이 쌓여있습니다. 앞에서 살펴본 reset HEAD^ 명령으로 최신 커밋을 되돌릴 수도 있지만 특정 버전으로 되돌린 다음 그 이후 버전을 삭제할 수도 있습니다. 이 때, 커밋 해시를 사용합니다. 

 

먼저, rev.txt 을 만들겠습니다. 'a'를 입력 후 저장 하고 'R1'메시지와 함께 커밋합니다. 그 다음은 b를 입력 후 저장 그리고 'R2'메시지로 커밋하는데 이런 식으로 R4까지 진행합니다. 

 

세팅이 됐습니다. 

 

R2 커밋의 해시를 복사합니다. 

 

 

R2 의 커밋 해시를 git reset --hard 다음에 붙여넣습니다.

 

git log 를 보면 R2 이후의 커밋은 다 삭제되고 R2 커밋이 가장 최신 커밋이 됩니다. 

확인해보겠습니다. 

 

잘 된 것을 확인할 수 있습니다. 

 

# 커밋 삭제하기 않고 되돌리기 - git revert 

나중에 사용할 것을 대비해서 커밋을 되돌리더라도 취소한 커밋을 남겨두어야 할 때가 있습니다. 

이 때, git revert 를 사용합니다. 

 

위 작업 결과물을 이어서 실습하겠습니다. 

rev.txt 파일을 열고 a b 다음에 e 라는 글자를 입력 후 저장하고 'R5'메시지로 커밋합니다. 

 

R5 커밋을 취소하고 R2 로 되돌아가려고 합니다. 

이 때, R5의 해시를 복사합니다. 

git revert 다음에 붙여넣습니다. 

 

revert 명령을 실행하면 깃을 설치할 때 지정한 기본 편집기가 자동으로 나타나면서 커밋 메시지를 입력할 수 있습니다. 

 

 

이상 '2장' 내용의 요약 및 실습을 마칩니다 :)