들어가며

먼저 고백을 하나 하자면, 나는 개발자 출신이 아니다. 학부에서는 기계공학을 전공했고, 컴퓨터공학을 따로 배운 적은 없다. 대학원에 들어와서야 C++을 본격적으로 만졌고, 지금도 git의 모든 기능을 능숙하게 쓴다고는 못한다. 다만 “비개발자 출신 대학원생이 git에서 어디에서 헤매는지” 정도는 누구보다 잘 안다고 자신한다. 이 시리즈를 시작하는 이유는 단순하다. 과거의 나와 같이 코딩/협업 경험이 그리 많지 않은 비슷한 처지의 후배 대학원생들에게 매번 같은 조언을 구두로 반복하지 말고 기록으로 남기고자 이렇게 몇 자 써본다. 무튼 빠르게 연구에 도움이 되는 patch 기반 마인드셋을 가지는 데 이 시리즈가 작은 도움이 됐으면 한다.


첫 번째 메시지: 백업, 백업, 백업

소설가 김영하는 소설 쓰기에 제일 중요한거 하나만 알려달라는 학생의 질문에 ‘무조건 백업하라’라고 알쓸신잡에서 말한 일화가 있다. 컴퓨터가 한 번 죽었을 때 원고를 잃어본 사람만 그 무게를 안다. 그래서 그는 클라우드에도 올리고, 외장하드에도 복제하고, 자기 자신에게 메일로도 보내둔다고 했다. 한 번 사라진 글을 “다시 쓴다”는 건 사실상 불가능하다는 걸 본인이 직접 겪어봤기 때문이다.

대학원생들이 흔히 하는 실수

연구실에서 쓰는 코드도 정확히 같다. 한 번 날아간 코드는 날아갔다는 그 자체로도 적잖이 충격을 주지만 다시 복구해야 한다는 것이 더 큰 막막함을 준다. 사실 CS background의 후배들은 이 Git을 잘 사용하는 거 같은데, 생각보다 많은 대학원생이 코드를 자기 노트북 또는 워크스테이션에만 둔다.

그렇게 되면

  • 내 로컬 컴퓨터에만 있는 코드
  • ssh로 학교 서버에 접속해 짜놓은 코드
  • 외장하드에만 백업해 둔 데이터셋 처리 스크립트
  • “어차피 나만 쓸 거니까”라며 GitHub에 올리지 않은 실험 코드

이 모든 게 단 한 번의 실수 및 사고로 사라진다. 생각보다 어제까지는 잘 동작하던 데스크탑이 오늘 출근해서는 동작하지 않는 상황을 대학원 과정 내내 많이 목격했다.

세어보니 대학원 6년 동안 Ubuntu 셋업/포맷을 어림잡아 10번 정도 했다.

  • 박사 입학 직후 워크스테이션 처음 셋업
  • nvidia driver가 꼬여서 두세 번 다시 깖
  • NAVER LABS 인턴 가서 새 컴퓨터 셋업
  • StachnissLab(University of Bonn) visiting scholar로 가서 새 desktop 셋업
  • 졸업하고 MIT에 postdoc으로 와서 또 셋업

그때마다 “이건 자잘한 거니까 굳이 안 올려도 되겠지” 했던 코드들이 사라졌다. 지금 와서 다시 짜면 더 잘 짜기야 하겠지만, 아무리 그래도 사라진 코드는 사라진 시간이다. 같은 시행착오를 두 번 겪는 비용은 결코 작지 않다.

그래서 git을 쓴다

git은 결국 타임머신이자 보험이다.

  • git commit: 변경 내용을 한 번의 snapshot으로 저장한다.
  • git push: 그 snapshot을 원격 서버(GitHub)에 백업한다.

이 두 줄을 습관으로 만들기만 해도 위에 나열한 사고들 중 절반 이상은 “극복 가능한 일”로 끝난다.

하지만 git add .는 인생에서 지워라

git commitgit push가 핵심이지만, 커맨드라인에서 매번 git add 파일명, git commit -m "...", git push를 손으로 치는 루틴이 몸에 배기 전까지는 번거롭게 느껴지는 게 사실이다. 아마 처음 git을 배운 이는 git add .로 add를 주로 할텐데, 이 명령어는 부디 잊기 바란다. 현재 디렉토리의 모든 변경 파일을 한꺼번에 stage한다는 의미인데, 대용량 바이너리, 실험용 임시 파일 등이 통째로 묶여 올라가는 사고의 시작점이다.

그 대신자기 손에 맞는 git client를 하나 찾아서 코드의 수정된 부분만 add할 수 있는 방법을 구축하는 것이 중요하다. 나는 lazygit을 쓴다(Vim user여서 편함). 터미널 안에서 돌아가는 TUI 클라이언트로, 파일 단위 혹은 hunk 단위로 stage할 대상을 눈으로 골라서 commit → push까지 한 화면에 끝낼 수 있다. GUI가 편하다면 GitKraken 같은 선택지도 있다.

어느 쪽이든 핵심은 같다. 커밋 대상을 한 파일씩 눈으로 확인하고 올리는 습관이다. git add .는 앞으로는 쓰지 말자.


정리

  • 코드는 노트북이 아니라 GitHub에 업로드하자. 노트북은 그저 임시 작업 공간이다.
  • 사고는 예고 없이 온다. SSD 사망, 도난, 포맷, rm -rf 한 번이면 끝이다.
  • 김영하 작가가 원고를 위해 백업에 강박을 가졌듯, 연구자도 코드를 위해 commitpush에 강박을 가져야 한다.
  • git ≠ 코드 공개. private repo로도 충분하다.
  • 일단 git commit, git push. 이 두 줄만으로도 보험에 든 셈이다.
  • git add .는 쓰지 마라. 커밋 대상은 항상 눈으로 골라서 올려라.
  • lazygit(TUI) 또는 GitKraken(GUI) 같은 client 하나를 손에 익혀두면 습관화가 훨씬 빠르다.

다음 글에서는 git이 단순한 보험을 넘어 메신저로 작동하는 방식, 그리고 그게 본인의 연구에 어떤 의미를 갖는지를 다룬다.

화재시 행동 요령 밈: git commit, git push, 그리고 대피

불 났을 때 행동 요령:

  1. git commit
  2. git push
  3. 건물에서 나간다

진지한 화재 대처법이 아니다. 이 밈이 진짜로 말하는 건 화재가 아니라 습관이다. 평소에 commitpush가 얼마나 자주, 얼마나 반사적으로 일어나야 하면 “불나면 그것부터 한다”는 농담이 가능할까. 당장 내일 컴퓨터가 망가지더라도 어제까지 작업한 내용은 어딘가에 살아남아 있어야 한다. 이 시리즈의 첫 글이 전하고 싶은 메시지가 딱 그것이다.


대학원생을 위한 Git 시리즈입니다.

  1. 대학원생을 위한 Git - 1. Introduction
  2. 대학원생을 위한 Git - 2. Git은 메신저다
  3. 대학원생을 위한 Git - 3. Patch적으로 사고하기