[Git] Commit, Branch에 대해 알아보자

Rae-eun Yang·2022년 9월 23일
0

Git

목록 보기
2/2
post-thumbnail

Git?

git은 개발을 하는 사람이라면 꼭 알아야 하는 요소라고 생각한다. 특히 협업으로 개발을 한다면 필수적이다. git을 사용하면 코드 관리를 훨씬 편리하게 할 수 있다는 점이 가장 큰 이유일 것이다.

git의 기본적인 명령어들에는 pull, fetch, add, push, commit, branch, merge, rebase, cherry-pick, reset, revert 등이 있는데 이 포스팅에서는 commit과 branch에 대해 알아보겠다.


Commit? 커밋은 무엇인가!

git에 대한 오해..

나는 지금까지 git을 어떻게 사용해왔냐면,

git status
git add .
git status
git commit -m "커밋메세지"
git push origin <branch>

git add .을 하면 바구니에 내가 수정한 파일들이 모두 담겨지고, git commit -m "커밋메세지"를 하면 파일들이 들어 있는 바구니에 메세지를 남길 수 있고, git push origin <branch>를 하면 원격 저장소에 바구니 안의 파일들이 전송되는.. 대충 그런 원리로 생각해왔다.

하지만 Learn git Branching에서 그동안 내가 정말 잘못생각해왔구나를 크게 느꼈다. git의 원리를 쉽게 익히고 싶은 분은 정말 강력추천합니다..!

그래서 commit이 뭔데

commit은 Git 저장소(원격 저장소)에 우리의 디렉토리(로컬 저장소)에 있는 모든 파일에 대한 스냅샷을 기록하는 것이다. 모든 파일에 대한 스냅샷이라고 하면 자칫 무거워 보일 수 있는데 사실 커밋은 엄청나게 가볍고 커밋 사이의 전환도 매우 빠르다!

commit의 구조 (커밋 전과 후)

커밋의 구조를 알아가면서 들었던 생각은 git의 전체적인 동작 원리가 마치 ArrayList의 동작 원리 같았다는 것이다!

이렇게 커밋을 하면 할수록 우리의 코드 변경 사항을 가지고 있는 기록들이 부모 노드(전 커밋)를 가리키며 늘어난다. 브랜치가 main으로 설정되어 있으므로 main이 가리켰던 노드를 새로운 노드가 가리키고 새로운 노드를 다시 main이 가리키는 그런 원리였다!


Branch? 브랜치는 무엇인가!

branch는 그저 commit 노드를 참조하는 것이다. 위 commit의 구조를 나타내는 이미지에서 branch는 main이다. main 브랜치가 커밋 노드인 C1을 참조하고 있다가, 커밋을 한 후 생긴 C2 노드를 새로 참조하고 있는 이미지라고 다시 설명해볼 수 있겠다. Learn Git Branching에서는 branch를 "하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역"라고 정의하고 있다.

branch를 생성하는 법

간단하다.

git branch <branch>
git checkout <branch>

git branch <branch>로 원하는 branch를 생성한 뒤, git checkout <branch>로 사용할 branch를 선택할 수 있다.

git checkout -b <branch>

위 명령어를 사용하면 한 줄만으로 branch 생성, 선택이 동시에 가능하다.

branch 생성 예시

newImage라는 branch를 생성한 예시이다.
이 상황에서 commit을 한다면?

이렇게 커밋 노드가 하나 생기고 main branch가 새로 생긴 노드를 가리키는 구조가 만들어진다. 이는 커밋했을때 선택되었던 브랜치가 main이기 때문에 main이 새 커밋 노드를 가리키게 된다. (현재 선택된 branch는 *로 표현한다)

branch를 바꾸고 싶다면 checkout 명령어를 사용하면 된다.

git checkout <branch>

로 원하는 브랜치를 선택할 수 있다.

git checkout newImage를 한 결과이다.

그렇다면 이 상태에서 커밋을 하게되면 어떻게 될까?
브랜치라는 이름대로 가지를 칠 수 있다.

이렇게 branch를 여러개 만들면
혼자 개발하는 경우에는, 여러 가지 위험한 시도들을 branch를 만들어서 따로 개발하거나 관리할 수 있고
협업을 할 경우에는, 각자 맡은 일을 각자의 branch를 만들어 해결할 수 있다!
그 외에도 이 기능은 여러 가지 상황에서 도움이 될 거라고 생각한다...!

profile
개발자 지망생의 벨로그

0개의 댓글