describug
← 기록
개발 용어

초안_260416_v1.1 — 깃과 커밋

첫 앱을 만들고 하루 만에 파일 절반이 갈렸는데, 그 하루에서 남은 커밋은 하나입니다.

git버전관리회고

Summary

과제
고치고 또 고쳤는데 무엇을 어떻게 고쳤는지가 남지 않아, 앞 버전으로 돌아갈 수가 없었다.
수단
깃으로 커밋하면 그 시점의 폴더 전체가 이력에 등재되어, 언제든 그 상태를 그대로 꺼낼 수 있다.

DETAILED DESCRIPTION

수습 변리사가 청구항 1항을 씁니다. 마음에 들지 않아 지우고 다시 씁니다. 쓰다 보니 방금 지운 쪽이 더 나았던 것 같은데 기억이 안 납니다.

어제 쓴 파일을 엽니다. 역시 마음에 안 들어 다시 쓰고 저장합니다. 다음 날 열어보니 처음에 쓴 게 그나마 나았습니다. 그 처음은 이제 없습니다.

다들 방법이 하나씩 있다

그래서 각자 방법을 만듭니다.

  • 초안 → 수정안 → 최종안 → 최종안2 → 진짜최종
  • v1.0 → v1.1 → v1.2
  • 파일명에 날짜를 박는 방식 — 260412
  • 무엇을 손봤는지 적는 방식 — 「1실시예 수정」 「실시예 추가」 「도 3 수정」

마지막이 제일 낫습니다. 열어보지 않고도 무엇이 든 파일인지 아니까요. 그런데 네 방식이 똑같이 무너지는 자리가 둘 있습니다.

어느 조합이 한 세트인지 모릅니다. 명세서는 「실시예 추가」까지 갔고 도면은 「도 3 수정」까지 갔는데, 이 둘이 같은 시점의 짝인지는 이름만 봐서는 알 수 없습니다.

중간에 한 수정이 최종본에서 빠집니다. 「실시예 추가」를 만들어두고 그날 급한 일로 앞 파일을 열어 이어 쓰면, 추가한 실시예는 그 파일에만 남습니다. 나중에 없어진 걸 알아채도 어느 파일에 있었는지부터 찾아야 합니다.

깃과 깃허브

개발 쪽은 같은 문제를 훨씬 크게 겪었다고 합니다. 파일이 수백 개고, 여럿이 같은 파일을 동시에 고치니까요. 거기서 나온 게 버전 관리 시스템이고, 지금은 깃(Git) 입니다.

발상은 이렇습니다. 파일 이름은 처음부터 끝까지 하나로 둡니다. 대신 이력을 파일 밖에 쌓습니다. 작업 폴더 안에 .git 이라는 숨은 폴더가 생기고, 그 폴더가 지나온 모든 상태가 거기 들어갑니다. 그래서 index.html 은 하나뿐인데 4월 11일자도 오늘자도 꺼내 볼 수 있습니다.

  • 깃 — 내 컴퓨터에서 도는 프로그램입니다. 인터넷이 없어도 됩니다
  • 깃허브(GitHub) — 그 이력을 인터넷에 올려두는 서비스입니다. 깃과 다른 것입니다

커밋은 저장이 아니라 등재입니다

깃에서 「저장」에 해당하는 말이 커밋(commit) 입니다. 그런데 덮어쓰기 저장과 다릅니다. 저장은 직전 상태를 지우고, 커밋은 되돌아갈 수 있는 자리를 하나 만듭니다. 커밋하지 않은 순간은 나중에 존재하지 않았던 것이 됩니다.

커밋 한 개에 담기는 것:

  • 그 순간 폴더 전체의 상태 — 파일 하나가 아닙니다
  • 누가, 언제
  • 직전 커밋이 무엇인지 — 그래서 이력이 목록이 아니라 계보가 됩니다
  • 한 줄짜리 이름표 — 커밋 메시지

명세서와 도면과 요약서를 함께 고쳤으면 셋을 한 커밋에 담습니다. 한 봉투에 넣고 봉하는 것에 가깝고, 그래서 되돌릴 때도 한 세트로 돌아옵니다. 앞 파일에만 남고 최종본에서 빠지는 일이 구조적으로 생기지 않습니다.

이름표가 필요한 이유도 여기 있습니다. 되돌아갈 자리가 열 개인데 이름이 열 개 다 같으면, 어디로 돌아갈지 고를 수가 없습니다.

그럼 푸시는 무엇인가

커밋은 내 컴퓨터 안의 이력에 등재하는 일입니다. 인터넷이 필요 없습니다. 푸시(push) 는 그렇게 쌓인 이력을 깃허브로 올려보내는 일입니다.

그래서 커밋 열 번 하고 푸시는 한 번만 할 수 있습니다. 반대로 푸시를 안 하면 내 컴퓨터에는 이력이 다 있는데 깃허브에는 아무것도 없습니다.

앱 개발 최초의 기록

4월 11일 밤 11시 3분에 깃허브 계정을 만들고, 11분 뒤에 첫 커밋을 했습니다. 기한 관리를 올려둘 데가 필요해서 만든 계정이니 계정과 앱이 같은 밤에 생겼습니다.

이때는 클로드 코드가 아니라 채팅창이었습니다. 무엇을 만들지 말로 시키고, 돌아온 파일을 통째로 받아 깃허브 화면에 붙여넣는 식이었습니다. 그러니 커밋은 제가 이력을 남기려고 찍은 게 아니라 붙여넣는 순간에만 우연히 생긴 것입니다.

그 뒤 닷새의 이력입니다.

04-11 23:14  Initial commit
04-11 23:18  Create index.html
04-12 18:45  Update index.html      331줄 추가, 190줄 삭제
04-16 10:34  Update index.html      238줄 추가, 159줄 삭제
04-16 10:38 ~ 12:59                 일곱 개 더, 전부 Update index.html

4월 12일 저녁의 한 개가 이 글의 요점입니다. 331줄이 들어오고 190줄이 나갔습니다. 하루 사이에 파일 절반 넘게 갈린 건데, 남은 건 커밋 하나입니다.

줄 수가 많은 게 잘못은 아닙니다. 파일을 통째로 새로 받아 붙여넣으면 줄 수는 원래 크게 잡힙니다. 문제는 그 하루치 시도가 통으로 뭉쳐 있다는 것입니다. 그날 몇 번을 고치고 몇 번을 되돌렸는지, 중간에 어떤 화면이었는지는 한 줄도 없습니다. 돌아갈 수 있는 자리는 하루 전과 하루 뒤, 둘뿐입니다.

이 저장소의 나머지 커밋은 중앙값이 23줄입니다. 그 하나만 스무 배가 넘습니다.

13일부터 15일까지는 아예 비어 있습니다. 사흘 동안 아무것도 안 했을 리는 없으니 그동안의 중간 상태도 같이 없어졌습니다.

"방금 지운 쪽이 나았던 것 같은데"가 코드에서도 똑같이 일어났을 텐데, 그때 돌아갈 자리가 없었습니다.

남는 생각

지금은 커밋을 클로드 코드가 대신 칩니다. 그래서 되돌아갈 자리는 이제 알아서 쌓입니다. 4월의 저와 지금의 저 사이에 달라진 건 제 습관이 아니라 쓰는 도구입니다.

그건 그것대로 다행인데, 그 자리마다 붙은 이름표를 제가 읽지 않는다는 문제가 따로 남습니다. 무엇을 고쳤는지는 이제 남는데, 왜 고쳤는지는 여전히 아무 데도 없습니다.