Git 사용법 익히기 1

3870 단어 TILgitTIL


조만간 항해99를 시작하면 바로 프로젝트에 들어가야 할텐데 아직 사전준비 자료를 받지 못해서 어떤걸 공부해야 할까 찾아보다가 협업에 필수적인 Git 툴을 게임처럼 사용해보면서 쉽게 배울 수 있는 웹사이트를 발견했다.

https://learngitbranching.js.org/?locale=ko

여러개의 레벨로 나누어져 있는데 오늘은 Level1을 풀어보면서 기본적인 사용법을 복습했다.

1. Commit

커밋은 Git에서 가장 많이 사용하는 명령어이다. 데이터베이스에서 변경한 사항을 확정하는 일을 커밋이라고 한다. 우리가 Git 명령어를 통해 조작하고자 데이터베이스는 Git 저장소이기 때문에 해당 Git 저장소에서의 '변경사항'을 확정한다고 생각하면 된다. Git은 기능을 엄청 가볍게 만들어서 빠르게 실행할 수 있는데 그 이유가 변경내역(delta)만 저장하기 때문이다.

스냅샷을 기록한다고도 표현하는데 같은 배경으로 사진을 여러장 찍었다고 할때 없었던 사람이 생기고 있던 사람이 사라지고 하는 이런 변경내역만 저장한다.

사용법

아주 간단하다.

git commit

커밋을 여러번 했을 경우, 마지막 커밋의 부모는 그 바로 전 커밋이다. 그 전 커밋을 기반으로 변경사항을 저장했기 때문이다.

2. Branch

다들 알다시피 브랜치는 나뭇가지를 뜻한다. 하나의 큰 프로젝트를 진행할때 여러가지 기능이나 버그수정등의 작업을 수행해야 하는데 그러한 새로운 기능들을 독립된 저장소에서 개발하기 위한 기능이다. 브랜치는 마찬가지로 아주 가벼워서 아무리 많이 만들어도 메모리에 부담이 없어서 최대한 상세하게 작은 단위로 여러개 만드는게 좋다.

사용법

기본적으로 두가지 명령어가 있다. 우선 브랜치에서 작업을 하려면 브랜치를 만들어야 한다. 명령어는 다음과 같다.

git branch [브랜치명]

만들었으면 이동을 해야한다.

git checkout [브랜치명]

checkout 명령어를 사용하면 main(master) 브랜치 등 여러가지 브랜치를 왔다갔다 이동할 수 있다.

3. Merge

여러가지 브랜치들을 만드는 건 좋은데, 결국엔 하나의 프로젝트로 완성해야 하기 때문에 목표를 달성한 브랜치는 메인 브랜치로 합쳐줘야한다. 그 기능을 하는 것이 Merge 명령어이다. Merge 명령어를 사용하면 두 개의 부모(합칠 브랜치랑 합쳐질 브랜치)를 가리키는 특별한 커밋을 만들어 낸다.

사용법

new라는 새로운 브랜치에서 변경사항을 만들어 커밋을 했고 이제 머지를 할 차례라고 가정한다. 일단 checkout 명령어를 통해 브랜치를 메인 브랜치로 변경을 한다.

git checkout main

현재 메인 브랜치에는 new 브랜치에서 만든 변경사항이 저장되어 있지 않다. 변경사항들을 이전하기 위해서 머지를 실행한다.

git merge new

여기서 생각해볼 점이 있다. 내가 브랜치에서 작업을 하는 사이에 누군가가 어떤 작업사항을 끝내고 메인 브랜치에 머지를 했다면 어떨까? 예를 들어서 나는 C2라는 커밋에서 new 브랜치를 만들었는데 그 사이에 메인 브랜치가 커밋을 해서 이미 C3가 존재할 수 있다.

그래서 머지는 두 가지 경우로 나뉜다. Fast foward 방식과 merge commit 방식이다. Fast foward 방식은 내가 new 브랜치에서 작업하는 동안 메인 브랜치가 커밋을 하지 않아서 같은 커밋에 머지할 경우이다. 이 경우엔 새로운 커밋을 만들 필요 없이 메인 브랜치 커밋을 새로운 브랜치 커밋으로 이동시키기만 하면 된다. 따라서 fast forward 방식은 두 브랜치를 병합하기 위해서 새로운 커밋을 만들 필요가 없다.

반면에 위의 예시처럼 내가 브랜치에서 작업하고 있는 사이에 메인 브랜치가 변경되는 경우에는 새로운 커밋을 만들게 된다. 메인 브랜치의 마지막 커밋과 새로운 브랜치의 커밋이라는 두 개의 서로 다른 상태에 있는 브랜치들을 머지하기 위해서 새로운 커밋을 만들게 되는 경우merge commit 이라고 한다.

4. Rebase

리베이스는 머지와 비슷하게 작업들을 병합하는데 사용된다. Rebase 라는 단어의 뜻은 베이스를 바꾼다 라는 뜻이다. 우리가 브랜치에서 작업할 때 브랜치의 베이스는 브랜치를 만들 당시 메인 브랜치의 최신 커밋이다. 예를 들어 메인 브랜치의 C2 커밋에서 new 브랜치를 만들었으면, new 브랜치의 베이스는 C2 커밋이다. 이 베이스를 바꾸겠다는 뜻이다. 핸드폰 바꿀때처럼 가장 최신 커밋으로.

Rebase의 장점은 커밋 로그와 이력이 깔끔해진다. merge 같은 경우에는 히스토리를 보면 왔다갔다한 기록들이 다 남아있는데, rebase는 병합을 하고나서 기존 기록들을 삭제해 버려서 깨끗~하다. 나중에 다시 배울 것 같으니 일단은 여기까지만 알아도 문제없을 것 같다.

사용법

여기까지만 알기로 했으니 간단하게 설명해보겠다.

git rebase main

일단 new 라는 브랜치에서 rebase 명령어를 실행하면 new 브랜치에서 만든 커밋들을 임시저장소에 넣는다. new 브랜치가 메인 브랜치의 최신 커밋을 가리키도록 베이스를 바꿔버리고(rebase) 이때 new 브랜치는 비어있다. (임시 저장소에 커밋들을 넣어놨기 때문에) 이제 임시저장소에서 하나씩 꺼내고 이걸 fetch 라고 부른다. fetch를 메인 브랜치의 최신 커밋과 병합시키고 fetch 를 지운다. new 브랜치는 방금 병합하면서 새롭게 만들어진 커밋을 가리키게 된다. 임시저장소가 빌 때까지 과정을 반복한다.

git rebase new

위의 코드는 fast forward 라고 생각하면 된다. 메인 브랜치가 new 브랜치의 부모쪽에 있었기 때문에, new 브랜치의 최신 커밋을 가리킬 수 있도록 이동시켜 준 것이다. 이제 두 브랜치가 완전히 같은 커밋을 가리키고 있다. 병합됐다는 뜻이다.

좋은 웹페이지 즐겨찾기