본문 바로가기
깃 & 깃허브

[깃 & 깃허브] 2. 깃으로 버전 관리하기 - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2024. 1. 7.
728x90
반응형

 

버전 : 깃에서 문서를 수정할 때마다 간단한 메모와 함께 수정 내용을 스냅숏으로 찍어서 저장하는 것

깃에서 가장 기본이자 중요한 기능이 버전들을 관리하는 것이다.

 

1. 깃 저장소 만들기

저장소(repository) : 깃으로 버전 관리를 하기 위해 폴더 안에 버전이 저장되는 공간이 필요

 

mkdir 명령으로 hello-git 디렉터리 생성

cd 명령으로 hello-git 디렉터리로 이동

ls -la 명령으로 디렉터리 안의 내용 살펴보기

마침표가 하나인 항목(.) : 현재 디렉터리

마침표가 두 개인 항목(..) : 상위 디렉터리

 

git init 명령 : 현재 디렉터리에서 깃을 사용할 수 있도록 초기화하는 것

해당 메시지가 나타나면 이제부터 hello-git에서 깃을 사용할 수 있다.

파일 경로 끝에 (master) 또는 (main)이라고 표시된 것은 hello-git 디렉터리에 깃을 위한 저장소가 생겼다는 의미이다.

예전에 깃을 설치했다면 (master)라고 표시될 것이고 최근에 깃을 설치했다면 (main)이라고 표시될 것이다. 상관은 없다.

 

ls -la 명령으로 다시 한번 디렉터리 안의 내용을 확인해 보면 .git이라는 디렉터리가 생긴 것을 확인할 수 있다.

 

2. 버전 만들기

프로그램 개발에서는 수정 내용이 쌓이면 새로 번호를 붙여서 이전 상태와 구별하는데, 이렇게 번호 등을 통해 구별하는 것이 버전이라고 한다.

깃에서도 문서를 수정할 때마다 버전을 만들면서 이전 상태와 구별하는데, 깃에서 버전은 문서를 수정하고 저장할 때마다 생기는 것이라고 생각하면 쉽다.

 

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

스테이지 (스테이징 영역) : 버전으로 만들 파일이 대기하는 곳

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

스테이지와 저장소는 .git 디렉터리 안에 숨은 파일 형태로 존재하는 영역이라 눈에 보이지 않는다.

 

깃이 버전을 만드는 과정

  1. 작업 트리에서 문서 수정하기
  2. 수정한 파일을 스테이지에 올리기
  3. 스테이징 한 파일 커밋하기

1. 작업 트리에서 문서 수정하기

git status 명령으로 깃 상태를 확인한다.

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

No commits yet : 아직 커밋한 파일이 없다.

nothing to commit : 현재 커밋할 파일이 없다.

 

vim hello.txt 명령으로 파일을 만들어 빔 편집기를 열고 I or A를 눌러 입력모드로 바꾼다.

1을 입력하고 Esc를 눌러 ex 모드로 바꾼 뒤, :wq를 입력해 문서를 저장하고 빔 편집기를 종료한다.

 

ls -la 명령으로 다시 한번 디렉터리 안의 내용을 확인하면 hello.txt 파일이 생긴 것을 확인할 수 있다.

 

git status 명령으로 깃의 상태를 확인해 보면, Untracked files가 있다고 나온다.

깃에서 버전을 아직 한 번도 관리하지 않은 파일을 Untracked files라고 한다.

 

2. 수정한 파일을 스테이지에 올리기

스테이징, 스테이지에 올린다 : 작업 트리에서 파일을 만들거나 수정했다면 스테이지에 수정한 파일을 추가하는 것

 

git add : 깃에서 스테이징 할 때 사용하는 명령

git add hello.txt 명령으로 hello.txt 파일을 스테이징 한다.

이후 git status 명령으로 깃의 상태를 확인하면 Changes to be committed 문구로 바뀐 것을 볼 수 있다.

그리고 hello.txt 파일 앞에 new file 수식어가 나오는데, 이것은 새 파일 hello.txt를 커밋할 것이라는 의미이다.

 

여기서 warning이 발생하는 이유는 윈도우에서 텍스트 문서를 스테이지에 올렸기 때문이다.

윈도우의 줄 바꿈 문자(CR)와 리눅스의 줄 바꿈 문자(LF)가 다르기 때문이다.

 

3. 스테이징한 파일 커밋하기

git commit : 깃에서 파일을 커밋하는 명령

git commit -m "message1" 명령으로 파일을 커밋한다.

-m 옵션을 붙여 커밋과 함께 저장할 메시지를 적으면 해당 메시지가 함께 커밋된다.

결과 메시지를 보면 파일 1개가 변경되었고(1 file changed), 파일에 1개의 내용이 추가되었다(1 insertion(+))고 나타난다.

 

커밋한 후 git status 명령으로 깃의 상태를 확인하면 버전으로 만들 파일이 없고(nothing to commit), 작업 트리도 수정 사항 없이 깨끗하다(working tree clean)고 나타난다.

 

버전이 제대로 만들어졌는지 확인하기 위해 git log 명령으로 저장소에 저장된 버전을 확인한다.

방금 커밋한 버전을 설명하는 정보가 나타난다.

정보에는 커밋을 만든 사람시간, 커밋 메시지가 함께 나온다.

 

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

수정한 파일을 하나씩 스테이지에 올려 두었다가 한꺼번에 커밋할 수도 있지만, 수정한 내용을 스테이지에 올리는 동시에 커밋까지 처리할 수도 있다.

commit 명령에 -am 옵션을 사용하면 스테이징과 커밋을 한꺼번에 처리할 수 있다.

해당 방법은 한 번이라도 커밋한 적이 있는 파일을 다시 커밋할 때만 사용할 수 있다.

 

vim hello.txt 명령으로 빔 편집기에 hello.txt 파일을 열어 2를 추가한 후, 저장하고 편집기를 종료한다.

 

git commit -am "message2" 명령으로 message2 커밋 메시지를 가지고 스테이징과 커밋을 한꺼번에 처리한다.

이후 git log 명령으로 저장소에 저장된 버전을 확인하면 hello.txt의 버전이 2개가 나타나는데, 가장 최근 버전 정보가 맨 위에 보이는 것을 확인할 수 있다.

3. 커밋 내용 확인하기

git log : 커밋했던 기록을 살펴보는 명령

지금까지 만든 버전이 화면에 보이고 버전마다 설명도 함께 나타난다. (커밋 로그)

 

commit 뒤에 이어지는 영문과 숫자는 커밋 해시, 깃 해시라고 하는데, 커밋을 구별하는 아이디이다.

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

 

Author 항목에는 버전을 만든 사람에 대한 정보가, Date 항목에는 버전을 만든 날짜에 대한 정보가 나타난다.

가장 아래에는 작성자가 기록한 커밋 메시지가 나타난다.

 

hello.txt 파일에서 2를 two로 변경하고 git status 명령으로 깃의 상태를 확인해 보면 파일이 수정되었고, 아직 스테이징 상태가 아니라고 나온다.

 

git diff : 작업 트리에 있는 파일과 스테이지에 있는 파일을 비교하거나, 스테이지에 있는 파일과 저장소에 있는 최신 커밋을 비교해 수정한 파일을 커밋하기 전에 최종 검토할 수 있는 명령git diff 명령으로 방금 수정한 파일이 저장소에 있는 최신 버전의 파일과 어떻게 다른지 확인해 보면, 2가 삭제되었고(-2) two가 추가되었다는 것(+two)을 알 수 있다.

 

수정한 파일과 최신 버전을 비교한 후 수정한 내용으로 다시 버전을 만들려면 스테이지에 올린 후 커밋하고, 수정한 내용을 버리려면 git restore 명령으로 취소한다.

 

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

hello.txt 파일에 3을 추가하고, hello2.txt 파일을 만들어 a, b, c, d를 추가한다.

 

이후 git status 명령으로 깃의 상태를 보면 hello.txt 파일은 변경된 파일이 아직 스테이지에 올라가지 않은 상태로 나타나고, hello2.txt 파일은 untracked files로 한 번도 커밋하지 않은 파일이라 수정 내역을 추적하지 않는다.

hello.txt 파일처럼 한 번 커밋되어 깃이 수정 사항이 있는지 추적하고 있는 파일을 tracked 파일이라고 하고, hello2.txt 파일처럼 한 번도 커밋하지 않아서 수정 내역을 추적하지 않는 파일을 untracked 파일이라고 한다.

 

git add 명령으로 두 파일을 모두 스테이지에 올린 뒤, git status 명령으로 깃의 상태를 확인하면 마지막 버전 이후에 수정한 hello.txt 파일은 modified로 표시되고 한 번도 버전 관리를 하지 않은 hello2.txt 파일은 new file로 표시된다.

 

git commit 명령으로 커밋을 하고 git log 명령으로 커밋 로그를 확인해 보면 message3라는 메시지를 붙인 커밋을 볼 수 있다.

 

git log 명령에 --stat 옵션을 사용하면 커밋과 관련된 파일까지 함께 살펴볼 수 있다.

가장 최근 커밋부터 순서대로 커밋 메시지와 관련 파일이 나열된다.

message3는 hello.txt 파일에서 수정 내용 1개, hello2.txt 파일에서 수정 내용 4개 추가된 것을 볼 수 있다.

 

hello2.txt 파일을 수정하고 git status 명령으로 깃의 상태를 확인해 보면, hello2.txt 파일이 수정되었고 아직 스테이지에 올라가지 않은 파일이 수정만 된 modified 상태가 된다.

 

git add 명령으로 스테이지에 올리고 git status 명령으로 깃의 상태를 확인해 보면, 커밋할 변경사항이 있다고 나타나고 커밋 직전 단계인 staged 상태가 된다.

 

git commit 명령으로 스테이지에 있는 hello2.txt 파일을 커밋하고 git status 명령으로 깃의 상태를 확인해 보면, hello2.txt 파일의 상태는 수정하기 직전인 unmodified 상태로 돌아간다.

 

 

git commit 명령에 --amend 옵션을 사용하여 커밋 메시지를 수정할 수 있다.

반응형

5. 작업 되돌리기

hello.txt 파일을 수정하고 git status 명령으로 깃의 상태를 확인해 보면, 파일이 수정된 상태에서 스테이지에 올라가지 않았다. 그리고 해당 메시지를 보면 작업 디렉터리의 변경 사항을 취소하려면 restore 명령을 사용하라고 나와있다.

 

하여 git restore 명령을 사용해 hello.txt 파일의 수정 사항을 취소하고 해당 파일을 확인하면 파일이 수정하기 전 상태로 남아있는 것을 확인할 수 있다.

 

이번에는 hello2.txt 파일을 수정하고 git add 명령으로 스테이지에 올린다.

이후 git status 명령으로 깃의 상태를 확인하면 스테이지에서 내리려면 git restore --stage <file> 명령을 사용하라고 나와있다.

 

git restore -stage 명령으로 스테이지에 있는 hello2.txt 파일을 내린다.

파일을 내리고 git status 명령으로 깃의 상태를 확인하면 파일이 아직 스테이지에 올라가기 전 상태로 돌아온다.

 

hello2.txt 파일을 수정하고 git commit 명령으로 스테이징과 커밋을 함께 실행한다.

 

git log 명령으로 커밋되었는지 확인해 보면 마지막 커밋 메시지가 message4로 잘 커밋된 것을 볼 수 있다.

 

git reset 명령에 HEAD^(현재 HEAD가 가리키는 브랜치의 최신 커밋을 가리킴)를 붙여 실행하면 master의 최신 커밋도 취소되고 스테이지에서도 내려진다. 하여 작업 트리에만 파일이 남게 된다.

이후 git log 명령으로 커밋을 확인해 보면 message4 커밋이 사라진 것을 확인할 수 있다.

해당 방법으로 커밋을 취소하면 커밋 전에 했던 스테이징도 함께 취소된다.

 

git reset 명령의 옵션

  1. git reset --soft HEAD^ : 커밋을 취소하고 파일을 staged 상태로 작업 디렉터리에 보관한다.
  2. git reset --mixed HEAD^ : 커밋을 취소하고 파일을 unstaged 상태로 작업 디렉터리에 보관한다.
  3. git reset HEAD^ : 커밋을 취소하고 파일을 unstaged 상태로 작업 디렉터리에 보관한다.

rev.txt 파일을 만들어 a를 적고 rev.txt 파일을 스테이지에 올린 후, 커밋 메시지 R1을 붙여 커밋한다.

 

rev.txt 파일에 b를 추가해 커밋 메시지 R2를 붙여 커밋하고, c를 추가해 커밋 메시지 R3를 붙여 커밋하고, d를 추가해 커밋 메시지 R4를 붙여 커밋한다.

 

이후 지금까지 만든 커밋을 확인하면 순서대로 커밋이 4개가 있고 커밋마다 커밋 메시지가 함께 나타나는 것을 볼 수 있다.

 

되돌릴 커밋의 커밋 해시를 선택해 마우스 오른쪽 버튼을 눌러 Copy 한다.

 

git reset --hard 명령 뒤에 복사한 커밋 해시를 붙여 넣고 실행하면 복사해서 붙인 커밋 해시 위치로 HEAD가 옮겨졌다고 나타난다.

git log 명령으로 로그 목록을 확인해 보면 R4 커밋과 R3 커밋이 삭제되고 커밋 해시를 복사한 R2 커밋이 최신 커밋이 된 것을 확인할 수 있다.

 

또한 rev.txt 파일을 확인해 보면 a, b까지 남은 것을 보아 R2 커밋이 최신 커밋이 된 것을 확인할 수 있다.

 

rev.txt에 e를 추가하고 R5 메시지와 함께 커밋한다.

git log 명령으로 깃의 상태를 확인하면 R5 커밋이 가장 최근 버전이라는 것을 확인할 수 있다.

 

삭제할 커밋의 커밋 해시를 지정해 Copy 한다.

 

이후, git revert 명령 뒤에 복사한 커밋 해시를 붙여 실행하면 기본 편집기가 자동으로 나타나는데, 편집기에 해당 커밋 메시지를 입력하고 저장하면(닫으면) R5 버전이 revert 되었다는 메시지가 나온다.

git log 명령으로 실제 버전이 바뀐 것을 확인하면 R5에 revert 한 새로운 커밋이 생긴 것을 확인할 수 있다.

기존의 R5 버전을 지우는 대신 R5에서 변경했단 내용만 취소하고 R5를 취소했다는 커밋을 새로 만든 것이다.

 

취소한 R5 커밋은 e를 추가하는 것이므로 R5 커밋을 취소한 것이 rev.txt 파일에도 반영이 된 것을 확인할 수 있다.

revert 명령을 사용하면 커밋 자체를 삭제하지 않으면서도 변경한 이력을 취소할 수 있다.

 

git restore <file> : 작업 트리에서 <file> 수정 내용 취소

git restore --staged <file> : <file> 스테이징 취소

git reset HEAD^ : 가장 최근 커밋 취소

git reset 커밋 해시 : 지정한 커밋 해시로 이동하고 이후 커밋을 취소

git revert 커밋 해시 : 지정한 커밋 해시의 변경 이력 취소

 

해당 내용은 "Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문" 책을 바탕으로 학습한 내용을 정리한 것입니다.

728x90
반응형