20221011
깃헙 특강 by 이고잉
생활코딩의 이고잉! 내가 42서울에서 서버 관련 공부를 했을 때 php 영상을 찾으면서 알게 된 강사. 느릿느릿 차근차근 나긋나긋한 목소리로 강의를 해주는지라 수많은 이들의 수면 세포를 자극하는 한편 내용은 또 탄탄하게 집어줘서 나도 내 재생목록에 추가해서 들었던 기억이 나는데, 이번 주와 다음 주 3일에 걸쳐서 깃 사용법 특강을 해준다고 한다. 오늘이 첫 날이었고, 다음 주 화요일과 목요일이 또 특강인데 안타깝게도 다음주 목요일은 내가 예비군으로 없을 예정이다. 아무튼 이전에 이미 알고 있던 사람이 강의를 해주니까 되게 새로운 느낌이었다.
그리고 무엇보다 강의내용이 역시 알찼다. 나야 깃이라 하면 클론과 푸쉬하는 게 전부였고 내용은 대충만 이해하고 있던지라 솔직히 브랜치를 사용하는 법이라던가, 버전을 관리하는 법은 하나도 모르고 사용했었는데 이번 기회에 조금 개념을 탄탄하게 잡게 되어 좋았다. 다만 완전 초심자를 기준으로 설명을 해주는 지라 진도는 매우 느리게 나갔다. 6시간 동안 배운 명령어가 init, add, commit, log, status, reflog(이건 진짜 신기했다), branch, checkout 정도가 전부였으니 이미 깃을 어느 정도 알고 있는 사람이라면 크게 도움이 안 될 것 같다는 생각이 들었다. 이하는 내용 정리. 내가 새로 알게 된 것들 위주로!
사실 깃이 혜성처럼 등장한 버전관리 툴은 아니다. 이전에는 SVN(SubVersioN)이라 하여 3세대 버전 관리 툴이 있었는데, 4세대로서, 그리고 정말 혁신적으로 브랜치 기능을 들고 나타난 것이 바로 깃이었다. 현재 협업을 위해 많이 쓰이고 있는데, 일단 그 기본은 어디까지나 버전 관리를 위한 툴이다. 그러니 그것부터 살펴본다.
git add, git commit 이 정도는 당연히 알고 있다. 허구헌 날 써대는데 뭐.. 다만 그냥 터미널에 CLI로만 해봤지 한번도 vscode로 해본 적이 없는데 이번 기회에 방법을 알게 됐다.
간단하게 버전이 만들어지는 과정을 보자. 먼저 우리가 작업하고 가지고 노는 공간은 working tree라고 부른다. 우리는 이러한 장소에 init과 같은 방식을 통해 .git파일을 생성하고 해당 장소를 깃으로 관리하는 것이다. 우리는 이 작업 공간을 버전으로 만들어 관리하고 싶은데, 이는 커밋의 과정을 통해 이뤄진다. 일단 그전에 내가 커밋으로 올리고 싶은 것들을 올리는 공간이 따로 있어 그것을 stage area라고 한다. 내가 현재 쓰고 있는 디렉터리의 모든 것을 버전으로 기록하고 싶은 것은 아닐 수도 있잖냐. 그래서 내가 올리고 싶은 것들만 올리는 작업대가 먼저 필요한 것이다. 이는 add의 과정을 통해 이뤄진다. 그래서 내가 올릴 것이 정해졌다면? 그럼 이제 commit을 통해 버전을 만드는 것이다! 커밋을 하면 비로소 내 stage에 있던 작업물들은 버전으로서 기록이 되는 것이다. 이때 commit id가 생성된다. 이것은 해쉬로 만들어지며 각 버전마다 고유한 id를 가진다.
마스터는 메인 브랜치이다. 브랜치는 가지를 쳐서 버전을 분리한 단위를 말한다. 메인 브랜치라면? 줄기가 되는 브랜치라는 것. 이와 더불어 헤드라는 개념도 있는데, 헤드는 현재 내가 관리하고 있는 버전을 의미한다. 내가 이전에 커밋한 버전을 이용하고 싶을 수도 있잖냐? 그럴 때 checkout이란 명령어를 통해 헤드를 옮길 수 있는 것이다. 그렇게 되면 각 버전이 만들어진 시점의 stage의 스냅샷을 불러와 이전 버전의 상태로 넘어가게 되는 것이다.
이때 checkout의 두 가지 용법을 구분해야 한다. 일단 첫번째로 commit id를 통해 헤드를 옮길 수 있다(detached head). 두번째로 브랜치 이름을 통해 헤드를 옮길 수도 있다(attached head). 이 헤드는 일종의 포인터같은 개념으로 생각하면 편하다. 아니 그냥 사실 포인터다.. 보통 버전을 새로 커밋을 하게 되면 헤드는 무조건 새로 만들어진 버전을 바라보게 된다. 이때 id로 했다면 브랜치는 따라가지 않은 채 헤드만 이동하게 되고, 브랜치로 했다면 브랜치도 더 이어지면서 헤드가 브랜치를 가리키는 상태가 된다. 이걸 잘 알아야 나중에 생고생을 하지 않는다! 되도록 이전 버전을 마구 관리하다 최신 버전으로 가고 싶다면, checkout master를 해주도록 하자.
지금의 사진에서 보면 나는 지금 헤드를 옮겨 시간여행을 하고 있다! 마스터 브랜치의 끝자락은 work3이지만, 현재 work 1 시절에 머무르고 있는 것. 참고로 이때 git log는 -all을 붙여야 헤드 기준 이후의 커밋도 볼 수 있다.
예상치 못하게 이렇게 브랜치를 만드는 경우가 있다. 이럴 때 자칫하다가 master로 버전을 옮기게 되면? 자칫하면 work 4-1은 내가 볼 수 없는 곳으로 사라져버릴 수도 있다.. 이럴 때는 reflog를 통해 헤드가 움직인 기록 전반을 추적하여 사라진 (것 같은) 브랜치를 벗어난 버전을 찾을 수 있는데, 웬만해서 이런 실수가 나지 않도록 하자.
브랜치를 본격적으로 써보자.
우리는 실험을 하기 위해 브랜치를 따로 파서 실험을 마구 했다. 이때 실험을 성공해서 마스터에 다른 브랜치를 업데이트 하고 싶다면?
master가 exp를 병합한다. => 실험이 끝났다.
exp가 master를 병합한다 => master를 업데이트 한다.
마스터에 병합하려면, 일단 헤드가 마스터에있어야 한다. 헤드가 주체가 된다고 생각하라. 그 주체에 맞춰 병합을 하는 것이다.
이렇게 되면 새로운 커밋이 생긴다. 그리고 그 버전의 부모는 두 개 다 해당된다.
exp에서 master를 병합한다는 것은 실험을 하면서 나중에 실험을 마스터에 병합할 때 문제가 생기지 않게 미리미리 exp의 버전을 업데이트해준다는 것이다.
잘못 꼬으면 아주 복잡해진다.. 이렇게 봐도 못 알아보겠는데 CLI 환경이었다면..?
같은 줄에 다른 코드가 작성되는 일이 있을 것이다. 이런 경우 이렇게 충돌이 일어난다 하여 병합 이전에 해결할 것을 요구한다. 다행이 이것도 GUI로 쉽게 만질 수 있다.
피어세션
원래 30분 이전에 모여서 진행하는 코테는 특강 때문에 진행할 수 없었다. 그래서 아쉬운대로 피어세션 시간을 빌려서 코테를 진행했다. 문제는 브루트포스 문제였는데, 조금 더 개선시킬 방법이 있을 것 같아서 고민하다가 30분이 지나버렸다. 잘 모르겠으면 일단 완전 탐색하는 게 일순위다, 기억하자! 일단 그렇게 내고나서 이후의 생각을 하는 거다.
이후에는 남은 시간이 얼마 없었다. 원래는 심화 과제 리뷰도 진행을 해야 하나 보니까 아무도 해오지 않아서 결국 진행할 수 없었다. 하기사 나도 대충 빈 칸 채우는 데에 그쳤으니 할 말이 없다. 주말에 적당히 놀았어야지..! 아무튼 그래서 별 것 하지 않고 피어세션은 종료. 이번에 들을 강의가 많아 피어세션에 모각공을 하자는 의견이 나오던데, 글쎄. 나는 그다지 좋은 방향은 아니라고 이전에도 어필했던 것 같은데, 팀원들은 바라는 눈치라 이제는 그냥 내가 눈치 없는 놈인 것 같기도 해서 내가 모더레이터가 아닌 이상 그냥 따라갈까 싶다. 질문거리 몇 개 또 준비해왔는데 흠.
공부
내일은 스몰톡을 진행하며, 또한 오프라인으로 가는 것에 내가 선착순으로 당첨이 되어서 강의장에 직접 가게 됐다. 근데 강의장에서 정해진 학습 시간 동안은 머무르고 있어야 하기에, 10시 이전에 가서 19시 이후에나 나올 수 있다. 그리고 나는 당장 가지고 다닐 기기가 태블릿 뿐이니 태블릿을 통해 할 수 있는 것을 준비해가야만 한다. 그리 생각이 미치자, 공부한 내용을 정리하는 것은 힘들 것이라 판단, 강의를 듣고 과제를 진행하는 방향으로 해야겠다는 생각이 들었다. 강의를 들으면서 정리를 할 수는 없을 것이기에, 오늘 강의를 미리 조금이라도 들어서 내용을 친숙하게 한 이후 내일 다시 들으면서 내 것으로 만들어야겠다고 판단, 오늘은 강의를 빠르게 들었다. 지금 5강까지는 들어뒀는데, 내용이 word2vec 관련이 나와서 저번 주에 진행한 스터디의 내용이 도움이 조금 됐다. 확실히 밑러닝은 도움이 되는 책이긴 한 것 같다.
회고 및 다짐
주말에 그리 쉬었으니 이제 다시 달릴 시간이다. 원래 하려던 많은 예정들이 다 무산된 지금, 그것을 전부 되돌릴 수는 없고 당장 내 눈 앞에 닥친 것들부터 해결할 심산이다. 안 하고 넘어가는 것들, 그것이 언젠가 다시 돌아올 것이란 것을 알지만 이제 그것은 남는 자투리를 활용해 해야 할 일로 넘겨졌다. 마침 이번 주에도 시각화 강의는 있으니 이것을 기회로 삼으면 될 것 같다.
내일 스몰톡에 가서 발표할 생각은 그다지 없는데, 모두에게 시키는 것은 아니겠지? 사실 기왕이면 오프라인으로 사람들을 보는 게 좋겠다 생각해서 나가는 거지 확실한 포부와 기대를 품고 가는 것은 아니다. 말을 잘 못 붙여서 사람들에게 친근감 있게 다가갈 수 있을지 모르겠다. 모쪼록 가서 사람들과 소통하면서 나와 함께 할 팀을 물색하게 될 텐데, 좋은 결과가 있기를 바라본다.