독서

[지옥에서 온 관리자 깃&깃허브 입문] 2장. 깃으로 버전 관리하기

찐공log 2022. 1. 21. 11:41

2022.01.21 - [독서/IT・컴퓨터] - [지옥에서 온 관리자 깃&깃허브 입문] 1장. 깃 시작하기

 

[지옥에서 온 관리자 깃&깃허브 입문] 1장. 깃 시작하기

언제 산건지도 기억이 안나는 깃 책! git으로 소스 관리를 해보고자 블로그에 정리를 시작해봅니다. 생활코딩 이고잉님과 고경희님이 집필하신 책입니다. 책의 진도표를 보면 하루면 이 책을 끝

zzingonglog.tistory.com

 

 

1. 깃 저장소 만들기

맨 처음 깃을 사용하기 위해 깃 저장소를 만들어봅시다.

git init : 깃 저장소 초기화. 깃을 사용할 수 있도록 디렉터리를 초기화 하는 것

원하는 디렉토리에서 git init 을 입력하면 해당 디렉토리를 저장소로 만듭니다.

git init
저장소 초기화하기
 

hello-git 디렉토리를 만들고 hello-git 디렉토리 안에서 깃 저장소를 초기화한 후 ls -al 을 해서 확인해보면 .git이 생성되어 있습니다.

참고) 맥의 finder에서 숨은 파일 보기 단축키는 Shift + Command + . 입니다.

 

 

 

2. 버전 만들기

중요 개념 3가지 - 작업 트리, 스테이지, 저장소

 

🔸작업트리 : 작업 디렉터리, 여기서는 hello-git 디렉터리

🔸스테이지 : 버전으로 만들 파일이 대기하는 곳. 10개 중에 4개의 파일만 버전으로 만들려면 4개의 파일만 스테이지로 넘겨줌

🔸저장소 : 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳.

 

스테이지 내용은 .git/index파일에 저장되고, 저장소의 내용은 .git/HEAD파일에 저장됩니다.

 

즉, 작업트리에서 수정하고 저장한 파일을 버전으로 만들고 싶을 때 스테이지에 넣으며, 깃에게 커밋 명령을 통해 새로운 버전이 생기면서 스테이지에 대기하던 파일이 모두 저장소에 저장되는 프로세스입니다.

 

 

(1) 작업 트리에서 vim으로 문서 만들기

hello.txt파일을 아무 내용을 적고 하나 생성 후 git status를 해봅시다.

파일 생성 직후 git status를 입력한 결과 화면

이와 같이 추적하지 않는 파일이 있다고 출력됩니다.

한번도 버전관리를 하지 않은 파일을 untracked files 라고 합니다.

 

(2) 수정한 파일을 스테이징 하기

작업 트리에서 파일을 만들거나 수정 한 후 스테이지에 수정한 파일을 추가해야 합니다.

깃에게 버전 만들 준비를 하라고 알려주는 것을 스테이징, 혹은 스테이지에 올린다라고 표현합니다.

(혹은 인덱스에 등록한다라고도 합니다.)

git add hello.txt
 
git add hello.txt

git add hello.txt 하여 파일을 스테이징 한 후 git status를 해보면 커밋할 변경 사항이라고 문구가 변경됩니다.

즉, 새 파일을 앞으로 커밋할 것이다라는 뜻입니다.

 

🌀 스테이지 올릴 때 경고메시지 줄바꿈 개행 문자 출력되는 경우

깃은 리눅스를 기반으로 하며 리눅스와 맥의 개행문자는 LF입니다.

그러나 윈도우의 개행문자는 CRLF가 삽입됩니다.

그래서 윈도우에서 텍스트 문서를 스테이지에 올릴 때 CRLF를 LF로 교체한다는 경고 메시지가 나오게 됩니다.

 

 

(3) 스테이지에 올라온 파일 커밋하기

커밋을 하면서 -m옵션을 이용하면 커밋 메시지를 추가할 수 있습니다. 커밋 메시지는 주로 영어로 작성합니다.

git commit -m "message1"
파일 커밋하기

 

커밋 후 결과를 보면, 파일 1개가 변경되었고, 파일에 1개의 내용이 추가되었다고 나옵니다.

커밋 후 status 확인 결과

 

git status로 깃 상태를 확인해보면 작업 폴더가 깨끗하다고 출력됩니다.

 

또한 버전이 제대로 만들어졌는지 확인하기 위해 git log 명령을 사용합니다.

저장소에 저장된 버전을 확인할 수 있습니다.

git log
 

git log를 입력해보면 방금 커밋한 버전에 대한 설명이 나타납니다.

또한 만든사람, 만든 시간, 커밋 메시지가 보여집니다.

 

 

(4) 스테이지과 커밋 한번에 처리하기

한번 커밋 했던 파일이라면 수정 작업 후 git commit -am 명령을 통해 스테이징과 커밋을 한꺼번에 처리할 수 있습니다.

git commit -am "message2"
커밋 했던 파일을 스테이징,커밋 한번에 처리하기

 

 

 

3. 커밋 내용 확인하기

(1) 커밋 기록 자세히 살펴보기

git log 명령을 입력했을 때 나오는 화면을 자세히 확인해봅시다.

 

commit 옆에 긴 문자열 1eacfeeb0ce57ed6a20aeeb3972d4b5d959d264c 은 커밋 해시, 깃 해시라고 합니다. 커밋을 구별하는 ID라고 생각하면 됩니다.

(HEAD -> master) 는 이 버전이 가장 최신이라는 표시입니다.

누가, 언제, 어떤 메세지를 남겼는지 확인할 수 있습니다.

이렇게 git log 명령을 입력했을 때 나오는 정보를 묶어 간단히 커밋 로그라고 합니다.

 

 

(2) 변경 사항 확인하기

작업 트리에 있는 파일과 스테이지에 있는 파일을 비교하거나, 스테이지에 있는 파일과 저장소에 있는 최신 커밋을 비교해서 수정한 파일을 커밋하기 전에 최종적으로 검토할 수 있습니다.

git diff
파일 수정 후 git status 입력해보기

위와같이 hello.txt 파일의 내용을 변경 후 저장한 다음, git status를 하면 아직 스테이징 상태가 아니라고 뜨면서(change not staged for commit), hello.txt파일을 수정했다고 빨간글씨로 나옵니다.

git diff를 하여 방금 수정한 파일이 저장소에 있는 최신버전 파일과 어떻게 다른지 확인합니다.

위 화면에서 -2는 2가 삭제되었다는 뜻이며, +two는 two라는 내용이 추가되었다는 뜻입니다.

 

 

 

4. 버전 만드는 단계마다 파일 상태 알아보기

(1) tracked 파일과 untracked 파일

깃은 한 번이라도 커밋한 파일은 수정 여부를 계속 추적합니다.

커밋했던 파일과 새파일의 git status 차이

 

기존의 hello.txt 을 수정해 놓고, hello2.txt 파일을 새로 만든 후 아무거나 입력 후, git status 를 해보면 새로 생성한 hello2.txt 파일은 커밋한 적이 없으므로 위와 같이 추적하지 않는 파일이 있다고 표시됩니다.

새로 만든 hello2.txt과 수정된 hello.txt 파일을 스테이징하고 git status를 하여 확인해보면 방금 스테이징한 항목들을 확인할 수 있습니다.

git commit -m "message3" 을 입력하여 커밋합니다. 이러면 두 파일을 한꺼번에 커밋 가능합니다.

git log로 다시 확인을 해보면 방금 커밋한 message3을 확인할 수 있습니다.

 

또한 커밋에 관련된 파일을 확인해보려면 git log 명령에 --stat 옵션을 주면 됩니다.

git log --stat
 

로그 메시지가 너무 많을 경우 한 화면씩 나누어 보여줍니다.

Enter를 누르면 다음 로그 화면, Q는 로그 화면을 빠져나갑니다.

 

🌀.gitignore 파일로 버전 관리에서 제외하기

버전 관리를 안하고 싶은 파일들이 있는 경우 .gitignore파일을 만들어 그 안에 버전 관리하지 않을 파일, 혹은 디렉터리 이름이나 파일 확장자를 입력하면 됩니다.

예를 들어 다음과 같이 .gitignore 파일의 내용을 작성하면 mynote.txt 파일과 temp 디렉터리, 확장자가 .swp인 파일을 버전 관리에서 제외시킬 수 있습니다.

mynote.txt

temp/

.swp

 

 

(2) unmodified, modified, staged 상태

작업 폴더 깨끗함(working tree clean)은 현재 작업 트리에 있는 모든 파일의 상태는 unmodified, 즉 수정되지 않은 상태입니다.

이 상태에서 hello2.txt 파일을 수정하고 저장만 한 후 다시 git status를 입력해봅시다.

hello2.txt 파일이 수정되었고 아직 스테이지에 올라가지 않았다고 나타납니다.

커밋하도록 정하지 않은 변경 사항(Changes not state for commit) 은 파일이 수정만 된 modified 상태입니다.

 

 

git add hello2.txt를 하여 스테이징한 후 상태를 확인해봅시다.

커밋할 변경 사항(Changes to be committed) 는 커밋 직전 단계(=커밋할 변경 사항), staged 상태입니다.

 

커밋을 하고, git status 명령을 실행해봅시다.

즉, unmodified 상태로 돌아간 것을 확인할 수 있습니다.

 

 

 

🌀방금 커밋해둔 메세지 수정하는 방법

git commit --amend

 

커밋 메시지를 잘못 입력했을 때 위 명령어를 입력하면 가장 최근의 커밋 메시지를 수정할 수 있습니다.

기본 편집기 vim이 실행되면서 원래 커밋 메시지가 화면 위쪽에 나타납니다.

커밋 메시지가 수정되면서 이전 커밋에 더해집니다.

 

 

 

5. 작업 되돌리기

이제부터는 스테이지에 올렸던 파일을 내리거나 커밋을 취소하는 등 각 단계로 돌아가는 방법에 대해 알아보겠습니다.

 

(1) 작업 트리에서 수정한 파일 되돌리기

git checkout -- 파일명
git restore 파일명
 

파일을 수정한 후 소스가 정상적으로 동작하지 않을 때 원복 즉, 가장 최신 버전 상태로 되돌려야 할 경우가 생깁니다.

그럴경우 checkout 또는 restore 명령을 사용하면 됩니다. 책에는 checkout 명령만 나와있지만, 버전 업데이트가 되면서 restore 명령이 추가된 것 같습니다.

단, 이렇게 되돌린 내용은 다시 복구 할 수 없습니다.

파일만 수정한 후 git status 로 확인을 해보니 위 화면의 5라인에서 작업디렉토리의 변경을 취소하려면 restore 하라고 설명이 첨부되어있습니다.

hello.txt 파일의 숫자 3→three로 수정했던 것을 checkout 또는 restore로 되돌리니 파일 내용이 다시 3으로 원복되었습니다.

 

 

(2) 스테이징 되돌리기

수정된 파일을 스테이징 한 후, 스테이징을 취소하는 방법입니다.

git reset HEAD 파일이름
git restore --staged 파일이름
 

이것도 역시 reset 명령은 책에만 나와있습니다.

실제로 스테이징하고 git status를 해보면 스테이징을 취소하고 싶으면 restore명령을 사용하라고 나옵니다.

restore 명령을 사용하고 나면 파일이 아직 스테이지에 올라가기 전으로 돌아온 것을 확인할 수 있습니다.

 

 

(3) 최신 커밋으로 되돌리기

수정된 파일을 스테이징 후 커밋까지 했을 때 가장 마지막에 한 커밋을 취소하는 방법입니다.

HEAD^는 현재 HEAD가 가리키는 브랜치의 최신 커밋이라는 의미입니다.

git reset HEAD^
 

위 두 화면을 비교해보면 message로 새로 커밋을 했는데, 되돌리기 후 로그를 확인한 결과 해당 커밋 기록이 취소되었습니다.

 

🌀git reset 명령 옵션

--soft HEAD^ : 최근 커밋을 하기 전 상태로 작업 트리를 되돌린다.

--mixed HEAD^ : 최근 커밋과 스테이징을 하기 전 상태로 작업 트리를 되돌린다. 옵션없이 git reset을 사용할 경우 이 옵션을 기본으로 사용한다.

--hard HEAD^ : 최근 커밋과, 스테이징, 파일 수정을 하기 전 상태로 작업트리를 되돌린다. 이 옵션으로 되돌리면 복구 불가능하다.

 

 

(4) 특정 커밋으로 되돌리기

특정 해시를 가진 커밋 버전으로 되돌릴 수 있습니다.

특정 버전으로 되돌린 다음 그 이후 버전을 삭제합니다.

reset A를 할 경우 A 커밋을 리셋하는 것이 아니라 최근 커밋을 A로 리셋합니다.

즉 A 커밋 이후에 만들었던 커밋을 삭제하고 A 커밋으로 이동한다는 의미입니다.

git reset 커밋해시
 

실습을 위해 rev.txt파일을 여러번 커밋해 놓습니다.

로그를 통해 확인해봅시다.

지금까지 4개의 커밋이 존재하며, 각 커밋마다 커밋캐시가 있습니다.

그러면 R2 메시지가 있는 커밋을 최신 커밋으로 만들어봅시다.

특정 커밋으로 되돌리려면 해당 커밋 해시를 복사해둡니다.

그리고 다음 명령어를 입력합니다.

git reset --hard 복사한 커밋 해시
 

--hard 옵션까지 추가해서 명령어를 입력하게 되면, HEAD가 방금 복사한 커밋 해시 위치로 옮겨갑니다. 즉, 해당 커밋이 가장 최신 커밋이 됩니다.

git log 명령으로 확인해보면 R3, R4는 삭제가 되었고, R2가 최신이 되어있습니다.

 

 

(5) 커밋 삭제하지 않고 되돌리기

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

그럴때는 revert 명령을 사용합니다.

git revert 커밋 해시
 

실습을 위해 R5 커밋을 하나 더 만듭니다.

 

현재 R1,R2,R5개의 버전이 만들어져 있습니다.

이제 가장 최근에 커밋한 R5버전을 취소하고, R5 직전 커밋 R2로 되돌아가려고 합니다.

revert 명령 뒤에 취소하려고 하는 버전, 즉 R5의 커밋 해시를 지정합니다.

revert를 할 때는 편집기가 나타나는데 커밋 메시지를 입력할 수 있습니다.

문서 맨 위에 추가로 남겨둘 내용이 있다면 입력하고 저장합니다.

그러면 R5 버전이 revert 되었다는 메시지가 나타납니다.

여기서 로그를 확인해봅시다.

R5버전을 지우는 대신 R5에서 변경했던 이력을 취소한 새 커밋을 만든 것입니다.

최종 버전은 R2버전의 내용과 같게 됩니다.