들어가기 앞서

깃을 사용 하는 프로젝트를 마주했을때, 저는 작아질 수 밖에 없었습니다.
잘 알지 못했기에, “실수하면 어쩌지” 부터 시작해 걱정들이 생겨났기 때문이죠.

이 상황을 해결하기 위해, 혼자 작업했던 과정들을 소개하고 알게된 개념을 공유 드립니다.



작업 과정

막막한 상황을 해결하기 위해, 눈에 보이는 것들을 다 적었습니다.

pull, push, commit, fetch, branch, merge, checkout, cherryPick, stash, rebase, revert, reset.

각각이 뭘 뜻 하는지 모르면 어렵기에 하나씩 개념들을 찾아보았고
임시 저장소를 만들고 브랜치를 만들며 갖고 놀았습니다.

작업 기록

충돌나게 만들고, 브랜치를 따서 작성도 해보고, 체크아웃도 해보고, 체리픽도 해보고.

그러면서 차차 깨닫게 되었고 막막함을 걷어낼 수 있었습니다.



Git 소개

제가 이해하게 된 Git은 정말 매력적인 도구였습니다.

혼자 프로젝트를 만들다가, 의도대로 안되면 Ctrl + Z를 누르며 과거로 돌아가곤 했는데
브랜치를 따고 개발하다 과거 버전으로 체크아웃하면 해결될 일이였습니다.

이래서 Git을 버전 관리 시스템 이라고 부르나 봅니다.

Git 에는 기본적으로 알아야할 단어들과 추가적으로 알면 좋은 단어들이 있습니다.



기본적으로 알아야할 단어

pull, push, commit, fetch, branch, merge, checkout

각 단어들에 대해 알아보기 전, Git의 큰 틀 부터 이해해봅시다.

Git에는 저장소가 존재합니다. 열심히 만든 작업물이 저장되는 곳으로
로컬 저장소와 원격 저장소가 있습니다. 로컬 저장소는 제 PC를 뜻하고,
원격 저장소는 Github 사이트나 BitBucket사이트 처럼 원격지에 있는 저장소를 뜻합니다.


Working Directory - Staging Area - Git Repository
초기 Working Directory상태에서 코드를 수정하면 Staging Area에 올라가고,
커밋시 Local Git Repository에 올라갑니다.
Local Git Repository에 커밋한 파일을 push 하면 Remote Git Repository에 올라갑니다.

큰 틀은 알았으니 이제 세부적인 단어들을 살펴보겠습니다.

pull

pull 뜻이 “당기다” 인 것처럼, 원격 저장소에 업데이트된 내용을 로컬 저장소로 당기는(가져오는) 행위를 뜻합니다. 내용을 가져와서 Git이 알아서 로컬 내용과 비교해 합쳐(merge)주는데, 이 과정에서 충돌(conflict)이 나기도 합니다.

push

push 뜻이 “밀다” 인 것처럼, 로컬 저장소에 커밋된 내용들을 원격 저장소로 밀어내는(업로드하는) 행위를 뜻합니다. 원격 저장소에 변경된 사항이 있는데 pull을 하지않고 push 한다면 아래 사진처럼 상황에 따라 충돌(conflict)이 나기도 합니다. push reject

commit

작업 내용을 기록하는 행위를 뜻합니다. 기록된 내용들을 토대로 특정 커밋 시점으로 돌아갈 수도 있습니다.

fetch

원격 저장소의 업데이트 내역을 확인하는 행위를 뜻합니다. pull과 다르게 원격 저장소 업데이트 내역만 확인하고, 합치지(merge) 않습니다.

branch

branch 뜻이 “나뭇가지. 갈라지다.” 인 것처럼 기존 작업흐름에서 벗어나 새로운 작업 흐름을 만들고 싶을때 사용하는 기능입니다.

이 branch를 활용한 Git flow 개념도 존재합니다.

  • Git flow [브랜치를 목적에 따라 나눠놓고, 운영해나가는 개념]
    ex) master branch 는 실제 배포용 / hotfix branch 는 버그 긴급 수정용 /
    dev branch개발용 / release branch배포전 QA용

merge

merge 뜻이 “병합하다. 합치다” 인 것처럼 원격 저장소에서 가져온 내용과 로컬 저장소의 내용을 합치는 걸 뜻합니다. 합칠때 Conflit이 나기도 합니다.

  • Conflict
    철수랑 민수가 메모장에 써있는 hi라는 글자를 바꿨습니다. 철수는 hi를 hello로, 민수는 hi를 bye로.
    merge를 할때 둘 중 무엇으로 바꾸게 될까요? 당연 판단할 수 없기에 충돌이 나고, 사용자가 직접 수정할 수 있게 안내하는 것입니다.

checkout

checkout 은 특정 커밋 시점 혹은 특정 브랜치로 작업 상황을 바꿔주는 기능입니다.
예를 들어, 열심히 dev 브랜치에서 작업하고 있다가 master 브랜치로 이동해야한다면 checkout을 사용합니다. Intellij에서 checkout



추가적으로 알면 좋은 단어

cherryPick, stash, rebase, revert, reset.

기본적으로 알아야할 단어들에 대해 이해했다면, Git을 좀 더 활용하기 위해 위 단어들에 대해서 알아봅시다.

cherryPick

cherry-pick 뜻이 “선별하다” 인 것처럼, 커밋을 선별해서 내꺼에 적용하고 싶을때 사용합니다.
Intellij에서 cherrypick

stash

stash 뜻이 “넣어두다, 챙겨놓다” 인 것처럼, 잠시 작업하던걸 스택에 보관할 수 있습니다.

열심히 개발하는 중에, 다른 개발 요청이 들어왔습니다. 특정 시점으로 체크아웃을 하거나 브랜치를 바꿔야 하는 상황인데 기존 작업물들은 어떻게 해야 할까요? 아직 커밋을 하기에는 미완성 단계여서 애매합니다. 이럴때 쓰는게 stash입니다. stash하게 될 경우 스택에 저장되고, unstash로 다시 꺼내올 수 있습니다.

Intellij에서 Stash

rebase

rebase 뜻이 “새로운 기준을 설정하다” 인 것처럼, merge와 다르게 합칠때 commit이력의 가지가 원래부터 하나였던 것처럼 깔끔히 보이게 만들어줍니다. 혼자 작업하다가 두갈래로 나뉘었고, 굳이 merge이력이 히스토리에 남을 필요가 없다면 rebase를 이용해 깔끔하게 만들어 줄 수 있습니다. Intellij에서 rebase Intellij에서 merge

revert

revert 뜻이 “돌아가다” 인 것처럼, 특정 커밋 시점으로 돌아가되, ‘되돌렸다’ 라는 이력까지 남기고 싶다면 사용하는게 revert입니다. Intellij에서 revert

reset

reset 뜻이 “다시 맞추다, 초기화 시키다” 인 것처럼, 특정 커밋 시점으로 돌아가되 PUSH된 Commit 이력들을 다 없애버립니다. revert는 이력이 남아있는 반면 reset은 커밋 시점까지의 이력들이 사라지게 됩니다. Intellij에서 reset



마무리

Git을 이해하기 위해 노력한 과정과 기능 몇가지들을 알아보았습니다.

버전 관리 도구 Git. 처음 접하신 분들께 이 글이 도움 되었으면 좋겠습니다. 읽어주셔서 감사합니다.

rman's profile image

rman

2021-09-01 23:00

rman 님이 작성하신 글 더 보기