나는 무엇을 하는 사람일까
날이 많이 차갑습니다. 이번 주도 분명 많은 것을 했습니다. 하지만 여전히 손에 잡히는 것은 없어 보입니다. 여러분은 어떠신가요? 프로가 되는 과정은 생각보다 어렵습니다. 취미라면 이렇게까지 공부를 할 필요는 없을 겁니다. 하지만 누군가를 위한 서비스를 만드는 사람이 되기 위해서 많은 시간을 사용해서 공부를 하는 것은 당연합니다. 혼자서만 생활 할 때는 별다른 생각 없이 이 과정을 겪어 나갑니다. 그런데 가끔 사람들이 저에게 당신은 무엇을 하는 사람이냐고 물어 볼 때 어떻게 대답해야하는지 망설여집니다. 취준생이라고 해야할지 웹 프로그래머라고 해야할지 갈등을 겪습니다. 이럴 때는 나를 어떤 사람이라고 소개해야 할까 고민을 하게 됩니다. 물론 사람들에게 "구직 활동 중입니다."라고 이야기를 하면 사람들은 으레로 "무엇을 구하고 계신가요?"라고 물어봅니다. 하지만 이런 쓸모 없어 보이는 고민을 하게 된 이유는 취업 준비 생이라고 하는 것이 과연 '무엇을 하는 사람'에 속하는 것인지 고민이 되었기 때문입니다. 좋게 말하면 직업을 구하는 중에 있는 사람을 부르는 말이지만 사실 다르게 말하면 그냥 백수입니다. 이 단어는 많은 것을 포장하는 포장지입니다. 그만큼 취업이 어렵기 때문에 장기간 구직 활동 중에 있는 사람들이 많아 졌기 때문일 수도 있습니다. 또 다른 생각은 아마도 백수 중에서 한량과 무엇을 하고 있는 백수로 나누기 위해서 그런 것이 아닐까 생각해봤습니다. 저는 특정 분야의 지식인은 아니기 때문에 생각의 물꼬를 막으려고 합니다. 호기심은 있으나 시간이 없습니다. 그냥 일상에서 겪은 생각이니 거기에서 그치는 것이 현명한 방법일 것입니다.
주간 코딩
eslint
이번주는 eslint를 커스터 마이징 해서 사용해보는 시간을 가졌습니다. 처음에 그냥 멘토가 설정한 값을 복사 붙여 넣기를 했습니다. 하지만 그 규칙을 그대로 따를 수가 없었습니다. 그래서 eslint를 저 나름대로 커스터 마이징 해보았습니다.
위의 rules에 추가된 부분은 기능적인 부분을 이해하고 집어 넣은 것은 아닙니다. 다만 eslint가 "error"로 알려주는 rules를 끄거나 경고 표시로 변경하였습니다. React가 import 될 필요가 없는데 import 되어야한다고 알려주거나 children이 prop으로 들어갔으면 좋겠는데 안된다거나 하는 룰을 그냥 꺼버렸습니다. 그밖에 비어있는 interface를 쓰면 안된다는 등의 typescript rule도 경고로 표시하거나 끄게 되었습니다.
eslint는 코드 포맷팅 규칙입니다. 개인이 코드 작업을 하는데 법이 아니라면 다른 사람이 정한 삶의 원칙이나 규칙을 반드시 따를 필요는 없습니다. 오히려 규칙은 두 사람 이상이 모여 있을 때 필요합니다. 하지만 사람은 규칙을 잘 따르지 않습니다. 다른 사람과 한 집에서 살아봤다면 내가 호스트의 규칙을 잘 따르지 않는 다는 것을 알고 있을 것입니다. 그럴 때 eslint는 호스트 처럼 갑자기 나타나서 정해진 룰에 따라 옳고 그름을 판가름 합니다. 월세 내고 사는 입장에서 불평과 불만을 늘어 놓을 수 있지만 결국 룰을 따라야 합니다. eslint는 그런 느낌이랄까요?
git 역사 편찬을 위한 도구: Interactive Rebase 사용하기
경고!
git rebase, git cherry-pick에 관한 내용을 담고 있습니다.
다음 아티클은 함께 작업하는 레포지토리에 혼자 생각으로 적용하지 마십시오. 팀 원과 논의 후에 진행해야합니다.
깃이 익숙하지 않은 상태에서 개인 레포지토리에 적용하고 싶다면 레포지토리 복사본을 만들고 진행할 것을 추천합니다. 이 글은 이미 원격 저장소의 main(또는 master)브렌치의 commit history를 변경하는 이야기입니다. PR 이전에 rebase나 cherry pick을 진행하는 것은 비슷하나 다를 수도 있습니다.
이번주는 git history를 정리하고 싶었습니다. 그동안 git Fast-forward merge만 사용했는데 deploy를 하다보니 master 브랜치가 엉망이었습니다. 자동화를 테스트하기 위해서 어지럽게 추가된 commit을 하나로 묶고 싶어졌습니다. 문제는 이 모든 것들이 merge가 되기 전에 정리되지 않은 commit이었습니다.
git cherry-pick(실패한 방법)
참고 자료
[10분 테코톡] 오리&코린의 Merge, Rebase, Cherry pick
cherry-pick을 조금 쉽게 이해해볼 수 있습니다.
먼저 cherry-pick으로 원하는 commit을 불러온 다음에 rebase를 한 뒤에 merge를 다시 하면 될 것 같았습니다. 그런데 이 방법은 그냥 실패를 했습니다. 왜냐하면 말 그대로 가지를 선택해서 가져와 붙인 다음에 rebase를 설정하면 그냥 이전에 커밋은 그래로 남아있는 상태에서 cherry-pick으로 선택한 가지들만 다시 무성하게 자라나기 때문입니다.
'한번 기록된 git commit의 역사는 변경될 수 없구나'
좀 실망을 했다라고 해야하나요. 물론 있는 그대로의 역사를 유지하는 것은 매우 중요합니다. 하지만 역사는 결국 선택되서 기록되어진 것입니다. 역사를 어떻게 바라볼 것인가의 관점이 중요한 것이 아닐까요? 기록을 수정한다고 해서 그 안의 진실까지 사라지는 것은 아닙니다. 저의 git 사관을 바탕으로 본다면 rebase는 복잡한 기록들을 한데 묶어 다른 사람들이 git 역사를 조금 더 명확하게 바라볼 수 있도록 도와주는 역할일 것입니다.
interactive rebase로 깃 히스토리 편집하기
그래서 여러 방법을 시도하던 끝에 저는 interactive rebase를 사용해서 원래 있는 역사를 편집할 수 있었습니다. 저의 commit history는 중간 중간에 편집을 하고 싶은 것들이 끼어있었습니다. 예를 들면 이런 것들입니다.
합치고 싶은 부분을 보면 기록이 하나만 존재해도 좋은데 여러번 commit 되있습니다. 그런데 중간 중간에 저런 것들이 묶여있습니다. 변경하고 싶은 부분이 포함되어있는 commit hash에서 가장 끝에 있는 부분을 hash를 지정하면 처음부터 모든 commit history가 로딩이 됩니다. 위의 예제같은 경우는 1f4dec2입니다. 그럼 처음 커밋부터 '94f39b6 Editor 멀티파트 이미지 변경' 커밋까지 전부 불러오게 됩니다.
여기에서 sqush는 보고있는 문서를 기준으로 아래서 줄에서 윗 줄로 진행됩니다. pick에서 s로 바꾼 줄은 그 윗 줄의 pick으로 되어있는 것과 합쳐집니다.
===squash====와 ===^^^^^^====는 제가 임의로 넣은 문자열입니다.
위와 같이 변경했다고 한다면 ===^^^^^^====에서 ===squash====아래 pick commit까지 squash가 진행됩니다. 저는 네 부분으로 squash가 나뉘어 있기 때문에 commit 메시지를 합지는 동작을 4번 하게 됩니다. 이렇게 하면 commit 메시지를 통합해서 history를 정리할 수 있습니다.
마무리를 하게 되면 터미널에서 충돌이 된다거나 --continue 명령어가 필요하다거나 하는 취소하려면 --abort를 넣으라는 등의 메시지를 터미널에 출력합니다. 적절하게 명령어를 넣어서 rebase를 완료하면 성공적으로 rebase가 되었다는 메시지를 볼 수 있습니다.
여기에서 저는 원격 저장소와 로컬 저장소의 commit history가 다르기 때문에 강제로 push를 진행했습니다.
원격 저장소의 commit이 변경되어있는 것을 확인할 수 있었습니다.
interactive rebase의 주의 할 점
주의 할 점은 혼자 사용하는 레포지토리는 이 방법으로 commit history를 변경할 수 있습니다. 하지만 여러명이 사용하는 레포지토리는 이렇게 변경하게 되면 오히려 history가 중복 생성되거나 꼬여버릴 가능성이 높습니다. 그리고 개인 레포지토리라도 반드시 새로운 레포지토리에 복사를 한 뒤에 모의 테스트를 진행해보는 것을 추천드립니다. 만약 원격과 로컬 레포지토리의 commit history가 둘다 꼬이면 복구할 방법이 없습니다.(다른 컴퓨터에 남아있지 않는 한) 그리고 혼자 작업하더라도 rebase를 진행한 컴퓨터가 아닌 컴퓨터에 로컬 저장소가 있다면 지우고 clone을 해서 진행하는 것이 좋아 보입니다.(보험으로 파일 이름만 변경해서 백업으로 남겨놔도 될 듯합니다.)
한 주를 마무리 하면서
일요일부터 어제까지 정신 없는 한 주였습니다. 새로운 것을 주입하는 속도를 소화하는 속도가 따라가지 못해서 걱정입니다. 사실 해야할 것은 산더미인데 정신이 따라가지 못하는 주간도 있습니다. 하지만 저를 달래가면서 그냥 계속 시간을 투자하는 수 밖에는 달리 방법이 없어 보입니다. git rebase와 cherry-pick을 공부하다 집으로 갈 때 '내가 하루 종일 뭘 한거지?'라는 생각에 현타가 왔었습니다. 하지만 원하는 것을 결국 하고 나면 기분이 많이 좋아집니다.
마치 이 과정이 달리기를 하는 과정과 비슷해 보입니다. 30분간 달리기를 할 때 그냥 그만두고 싶은 생각으로 가득차게 됩니다. 팔꿈치가 저려오고 햄스트링과 종아리, 아킬레스건이 찌릿찌릿합니다. 20분이 지날 때 쯤에는 세상의 공기를 다 마실 듯이 숨을 헐떡입니다. 하지만 30분 달리기를 완주하게 되면 완주했다는 생각에 기쁨으로 가득해집니다. 저에게 지금은 달리기와 비슷합니다. 느리더라도 꾸준히 뛰다보면 "당신은 무엇을 하는 사람입니까" 묻는 질문에 "저는 웹 프로그래머입니다."라고 대답할 수 있을 것 같네요.