오픈소스SW

오픈소스SW_Chapter04_커밋

강용민 2022. 10. 10. 18:31

개발자는 만일의 경우에 대비하여 중간에 코드 변경 과정을 기록하고 잘못된 동작을 발견했을 떄 특정 시점으로 되돌아 갈 수 있어야 개발에 불편함을 겪지 않는다.

깃은 커밋(commit)을 통해 개발 중인 코드의 이력을 만들 수 있다. 

개발 과정 중에서 개발자가 커밋을 하면 사용자가 변경사항을 일일이 기억할 필요가 없고 원하는 프로젝트의 이전 시점으로 쉽게 되돌아 갈 수 있다.

 

파일 관리 방법

깃의 커밋은 새로 변경된 부분만 추출하여 저장한다. 파일 이름을 변경하지 않고도 하나의 파일 이름으로 관리가 가능하다.

즉, 커밋은 시간에 따라 변화되는 내용만 관리하고, 코드가 변화된 시간 순서에 따라서 영구적으로 저장한다.

 

파일 등록 취소

스테이지 등록하는 것과 반대 과정으로 unstage 상태로 변경하려면 삭제(rm)나 리셋(reset) 명령어를 사용한다.

  • rm
    • 파일을 등록한 후 커밋하지 않고 바로 삭제할 떄 사용한다
    • 스테이지 영역에서만 등록된 파일을 삭제하려면 --cached 옵션을 함께 사용한다.
    • 파일이 untracked 상태가 되고, 스테이지 영역에서 파일이 삭제 처리된다.
  • reset
    • 한번이라도 커밋을 했다면 reset 명령어를 사용한다.

 

HEAD

깃에는 HEAD라는 포인터 개념이 있으며 이는 커밋을 가리키는 묵시적 참조 포인터이며 최종적으로 커밋한 작업의 위치를 가리킨다.

깃을 설치하고 처음 커밋할 때는 HEAD의 포인터는 없고 이후에 커밋을 하면 HEAD가 만들어진다.

HEAD는 커밋될 때마다 한 단계씩 이동하고 마지막 커밋 위치를 가리킨다. 즉 커밋이 변화한 최종 시점을 의미한다.

 

스냅샷

스냅샷 방식은 변화된 부분만 찾아서 저장을 하는 방식을 뜻하며, 커밋은 파일 변화를 깃 저장소에 영구적으로 기록한다.

파일을 복사하는 방식으로 수정본을 관리하면 같은 내용을 반복해서 저장하기에 많은 용량을 차지한다.

그렇기에 깃은 시스템적인 단점을 해결하기 위해 변경된 파일 전체를 저장하지 않고, 파일에서 변경된 부분을 찾아 수정된 내용만 저장한다.

 

파일 상태와 커밋

커밋은 변화된 내용을 영구적으로 깃 저장소에 기록한다.

새롭게 생성된 파일을 커밋하려면 반드시 tracked 상태로 변경해 주어야 한다. 

깃의 커밋은 HEAD와 스테이지 영역 간 차이를 비교하여 새로운 객체를 생성하고 생성된 객체를 깃 저장소에 기록한다.

 

커밋 메시지

커밋을 할 때 생성된 객체를 기록하는 것과 동시에 이를 구별할 수 있는 설명에 대한 메시지를 같이 작성 하는데 이 메시지를 커밋 메시지라 한다.

vi 에디터에서 커밋 메시지를 작성할 때는 요약 내용과 상세 내용을 분리하여 기록하는 것을 권장한다.

보통 첫째 줄에는 '제목'을 적고, 다음 줄에는 상세 내용을 작성한다. 제목과 상세내용을 빈 줄로 구분한다.

 

git commit -a

파일 등록과 커밋을 동시에 하는 방법

커밋을 하려면 반드시 워킹 디렉터리를 정리해야 한다.즉, add 명령어로 추가되거나 수정된 파일들을 스테이지 영역에 등록해야한다는 것이다.

commit 시 -a 옵션을 추가하면 이를 한 번에 해결할 수 있다.

 

git commit -m

커밋과 동시에 간단하게 한 줄 정도의 커밋 메시지를 작성할 수 있다.

-a와 함꼐 사용 시 파일 등록과 짧은 커밋 메시지 등록을 동시에 처리할 수 있다.

 

git commit --allow-empty-message

커밋을 할 때는 반드시 커밋 메시지를 같이 작성해야 하지만 의미가 없는 커밋은 커밋 메시지를 생략할 수 있다.

 

수정된 파일 되돌리기

깃에서 아래의 명령어로 수정한 파일을 커밋 전 마지막 내용으로쉽게 되돌릴 수 있다.

git checkout -- 수정파일이름

수정 파일을 되돌리면 이전 커밋 이후에 작업한 수정 내역은 모두 삭제된다.

 

커밋 아이디

git log를 이용해서 로그 정보를 볼 수 있는데 각 커밋에는 aa9247d... 같은 문자가 있는데 이를 커밋 아이디라 한다.

커밋 아이디는 특정 커밋을 가리키는 절대적 이름이고, 명시적 참조 값이다.

 

SHA1

커밋 아이디는 SHA1라는 해시 알고리즘을 사용하기에 복잡한 문자열을 갖는다.

그렇기에 중복되지 않은 고유의 키를 생성할 수 있는 장점을 가지고, 콘텐츠 추적과 분산형 저장 관리를 운영하면서 기록 간에 충돌을 방지한다.

해시의 앞쪽 7자만으로도 중복을 방지하면서 전체 키 값을 사용할 수 있다.

 

로그

--pretty=short

커밋 메시지를 여러 줄 작성했다면 로그 정보가 복잡해진다. 

그렇기에 로그 옵션 중에서 --pretty=short를 사용하면 로그를 출력할 때 첫 번째 줄의 커밋 메시지만 출력한다.

 

show

git show 커밋ID

위 명령어를 통해 특정 커밋의 상세 정보를 확인할 수 있다.

 

diff

diff는 커밋 간 차이나 각 영역의 차이를 확인하는 명령어이다.

깃은 커밋을 기준으로 이러한 파일들의 수정 이력을 비교해 볼 수 있는 diff 기능을 제공하기 때문에 파일의 수정 및 변경 내역을 쉽게 파악할 수 있다.

 

문제

깃의 커밋은 커밋 시 모든 파일을 다시 새로 저장한다. 맞는가 틀린가. 만약 아니라면 그 이유는 무엇인가?

아니다. 커밋은 새로 변경된 부분만 추출하여 저장한다.

 

깃의 커밋은 시간 순서에 상관없이 변화된 내용만 관리 및 저장한다. 맞는가?

아니다. 시간 순서에 따라 변화된 내용을 관리 및 저장한다.

 

rm명령어와 reset명령어의 차이는 무엇인가

파일 등록 후 커밋하지 않았다면 rm을 커밋을 했다면 reset을 사용한다.

 

깃에서 HEAD는 무엇인가?

커밋을 가리키는 묵시적 참조 포인터이며 최종적으로 커밋한 작업의 위치를 가리킨다.

 

처음 커밋하면 HEAD 포인터가 생기지 않는다. 맞는가?

그렇다. HEAD포인터는 처음 커밋 이후에 커밋을 하면 HEAD가 만들어진다.

 

수정한 파일을 커밋 전 마지막 내용으로 돌리고 싶으면 어떤 명령어를 사용해야하는가?

git checkout --수정파일이름

 

커밋할때 파일 등록과 짧은 커밋 메시지를 등록을 동시에 처리하고 싶을때 어떤 명령어를 사용해야 하는가?

git commit -am "커밋메시지"