brunch

매거진 Git과 Github

You can make anything
by writing

C.S.Lewis

by anonymDev Feb 24. 2019

1. Git 시작해보기

git init & commit 

0. 되돌아보기


지난 글에서 Git과 Github, 버전 관리를 간단하게 소개했다. 조별 과제를 사례로 공동 작업할 때 불편한 점 네 가지를 언급했다.


여러 개의 파일 버전을 일관되게 관리할 수가 없다.

누가/무엇을/어떻게 변경했는지 기록하고 내용물을 공유하기 어렵다.

변경 내용 이전 상태로 보구하기 번거롭다.

의도치 않게 서로의 변경 내역을 덮어쓰거나 지울 수 있다.

취합은 사람을 사람이 한다.


혼자 작업 할 때도 크게 다를 건 없다. 필자는 개인 프로젝트하면서도 혼자서 (북 치고 장구 치고) 버전 관리 잘하는 편이다. 처음에는 의미 없어 보여도 작업량과 기간이 늘어나기 시작하면 유용해진다. 3개월 전에 하다가 중단한 프로젝트를 다시 시작하려면 본인의 작업물이어도 어디까지 했는지 기억이 나지 않는다

지금 혼자 Git을 사용해서 버전 관리하는 법을 배워보자.


참고:
 이 글은 Git에 대한 원리를 설명하고 파헤치는 글이 아니다. Git을 활용해서 어떻게 버전 관리를 하는지를 다루는 글이다. 진행하면서 이해가 안가는 개념이나 원리가 있다면 우선 써보면서 차차 알아가는 방식으로 접근하길 바란다. 원리를 완벽히 이해 못했다고해서 Git을 사용하는데 문제가 되지 않는다.




1. Git 혼자 사용해보기


Git 저장소 만들기


내가 버전 관리하고 싶은 파일들을 모아둘 my-git-project 폴더를 만들었다.

$git init 명령어를 사용해서 my-git-project를 Git저장소로 만들자.


~$ mkdir my-git-project

~$ cd my-git-project

~/my-git-project$ git init

초기화: 빈 깃 저장소, 위치 ~/my-git-project/. git/


##현재 저장소의 사용자 이름과 이메일도 등록하자. (없으면 커밋이 안됨)

~/my-git-project$ git config --global user.name <username> 

~/my-git-project$ git config --global user.email <mailaddress> init


my-git-project 폴더 안에서 파일 추가/삭제/변경하면서 git을 사용할 수 있다. 간혹 다른 폴더에 들어가서 git 명령어 입력하고는 안된다는 사람들이 있다.




커밋(Commit)이란


영어 사전에서 Commit의 정의를 살펴보자

Commit
10. [타동사][VN] ~ sth to paper/writing ~을 적어 두다
<출처: 네이버 영어사전>

10번 정의에 '~을 적어 두다'라는 뜻이 있다. 이 정의가 Git의 커밋과 일맥상통한다. Git에서는 파일을 변경/추가/삭제하면 커밋을 해서 변경 기록과 내용을 적어둔다. 직전 버전 기준으로 변경한 부분만 기록한다. 전체 파일을 새로 기록해서 백업본을 만드는 게 아니다.


커밋을 하면 아래 예시처럼 기록이 생기는데 이를 커밋 로그라고 한다.(Commit log: 변경 내용, 작성자, 변경 일시에 대한 정보를 갖고 있다.)


'홈페이지 만들어보기 프로젝트' 커밋로그


c456 title 작성(anonymous dev)   작성자: 김갑수 작성일: 2019년 1월

c123 빈파일 만들기(index.html) 작성자: 김갑수 작성일: 2019년 1월



만약 메인 이미지를 추가해서 변경 내용을 커밋 했다면?


c789 메인 이미지 추가(트와이스) 작성자: 김갑수 작성일: 2019년 1월

c456 title 작성(anonymous dev)   작성자: 김갑수 작성일: 2019년 1월

c123 홈페이지 메인 만들기 index.html 작성자: 김갑수 작성일: 2019년 1월


커밋로그 c789가 맨 위에 추가된 걸 볼 수 있다. (참고: 가장 최근에 작성된 커밋로그를 HEAD라고 함)




커밋 해보기


위에서 my-git-project 폴더에서 깃 저장소를 초기화 했다. 아직 빈 폴더이기 때문에 커밋할 변경사항이 없다.

$git status 로 my-git-project의 상태를 확인해보자.


~/my-git-project $ git status

현재 브랜치 master

커밋할 사항 없음 (파일을 만들거나 복사하고 "git add"를 사용하면 추적합니다)


커밋할 사항 없음이라고 나오는걸 확인할 수 있다. 그렇다면 Git에서 파일은 어떻게 변경되고 Commit 되는 걸까?



출처: https://git-scm.com
Git에서 파일은 크게 4가지 라이프사이클(Life Cycle)을 갖는다 (고한다).


아... 너무 복잡하다. File Status Life Cycle은 필요하면 따로 공부해보기로 하고 여기서는 집어치우기로 한다. 여기서 굳이 이론적인 라이프사이클까지 언급하면서 설명할 이유도 필요도 없다. 매일 같이 Git 명령어를 입력하면서 지내지만 File Status Life Cycle 있다는 걸 이번에 처음 알았다. 사실 위에 라이프 사이클대로 설명하려고 했지만 머리만 더 복잡해져서 지워버렸다.



파일 수정(추가/변경/삭제)하고 스테이징해서 커밋 하면 된다.


스테이징(Staging) 

 커밋하려는 파일을 목록에 추가하는거다. 스테이징 된 파일만 커밋 대상이 된다.
(단어 그대로 커밋하고 싶은 애들 무대에 올리는 거다. 무대에 못 올라가는 파일들은 커밋이 안된다.)



간단한 커밋 사이클: 수정 -> 스테이징 -> 커밋


막상 작업 시작하면 본능적으로(생각 없이) 명령어 입력할 정도로 단순한 작업이다. 중간중간에 $git status를 수시로 칠텐데 추가/변경/삭제된 게 있는지, 커밋이 잘됐는지 확인하기 위해서다. 여러분도 git을 사용하다 보면 git status를 주구장창 치게 될 것이다. 




1. 수정

index.html 파일을 만든다. ($ cat > index.html)

 <html></html>


폴더의 상태를 확인해보자.  추적하지 않는 파일에 index.html이 보이는 걸 확인할 수 있다. index.html파일이 아직 스테이징되지 않았다.


~/my-git-project $ git status

현재 브랜치 master

추적하지 않는 파일:

 (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)

index.html





2. 스테이징


커밋을 하기 위해서 index.html을 스테이징 하자.

위에서 알려준 대로 $git add를 사용 해보자.(커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)


~/my-git-project $ git add index.html

~/my-git-project $ git status

현재 브랜치 master

커밋할 변경 사항:

  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)

index.html


추적하지 않는 파일 대신에 커밋할 변경 사항index.html 이 올라갔다. index.html이 스테이징 됐다는 의미다.




3. 커밋


이제 스테이징 된 index.html을 커밋 해보자. $git commit -m "<메시지>"를 실행하면 메시지와 함께 스테이징된 파일(index.html)이 커밋된다.


~/my-git-project $ git commit -m "Add index.html"

[master (최상위-커밋) b02e0ff] Add index.html

 1 file changed, 1 insertions(+)

 create mode 100644 index.html



"Add index.html"짧은 메시지와 함께 index.html을 커밋 했다. commit 한 결과가 출력됐다.  

1 file changed, 1 insertions(+)  
= 1개 파일이 변경되고 1줄이 추가됐다.



커밋이 잘 됐는지 커밋로그를 확인해보자. 

$git log 
커밋로그를 보여준다.  --oneline 옵션을 주면 커밋로그가 한줄로 나온다.

~/my-git-project $ git log --oneline 

b02e0ff Add index.html


~/my-git-project $ git status

현재 브랜치 master

커밋할 사항 없음, 작업 폴더 깨끗함


커밋로그가 잘들어갔다.  b02e0ff Add index.html 

모든 변경 사항이 커밋돼서 작업폴더도 깨끗해졌다. (커밋할 사항 없음, 작업 폴더 깨끗함)



3. 추가 실습


아래 그림처럼 커밋을 추가로 해보자.


3-1

1. 홈페이지의 제목을 추가하고 커밋 (<head>트와이스 홈페이지</head>)

2. 트와이스 사진 추가해서 커밋 (<div>트와이스 사진</div>)





Q. 커밋 메시지를 어떻게 작성해야 하나요?


A. 커밋메시지를 작성하는 방법에 정답은 없다. 한문장으로 "무엇을 어떻게 변경했다"의 내용을 포함하면 된다. 문장이 일정 길이를 넘어가면 뒤에가 짤린다. 간결하게 함축적으로 작성하기 바란다. 



Q. 변경 부분을 커밋하는 단위는 어느정도가 좋은가요?


A. 보통 한 문장으로 표현할 수 있는 단위가 적절하다. 한 문장으로 표현이 안되거나 문장이 길어서 짤린다면 커밋하는 단위를 분리해봐라. 1 커밋 1변경이 이상적인 커밋 단위이다.



Q. 커밋로그 열심히 써놓긴 했는데 어디다 써먹나요?


A. 커밋 후에 생기는 이슈에 대응하기 위해서 커밋로그가 필요하다. 오류를 추적과 사후복구가 커밋로그가 존재하는 가장 중요한 이유다. 그 외에도 커밋로그를 활용해서 동료들과 변경 내용에 대해서 리뷰를 한다던가 활용하는 방법은 다양하다. 글을 진행하면서 커밋의 역할에 대해서 중간 중간에 언급하기로 하겠다.


커밋로그를 응용하는 내용은 다른 글에서 따로 다뤘다. 커밋로그 응용하기(Commit 응용편)





4. 마무리

 (설명이 길었지만) 이거만 가지고 가자.

커밋 사이클: 
파일 변경/추가/삭제 -> $git add index.html -> git commit (끝)


Q. 이거만 알면 git을 쓸 수 있는 거 맞아? 

A. 응 맞아. Git을 사용하는 대부분의 시간을 커밋 사이클을 반복하는데 할애한다.


이번 글에서는 'Commit이 무엇이고 어떻게 작성하는지' 까지만 다뤄봤다. 다음 글에서는 브랜치(Branch)에 대해서 다뤄보자.



다음 글: Git&Github은 왜 사용하는 걸까 3 Branch 편 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari