GitHub 잔디가 비었을 때, 백데이트 커밋으로 채우는 법 (정직하게)
잔디 한두 칸이 비면 왜 그렇게 신경 쓰일까
GitHub 프로필의 contribution graph, 흔히 "잔디"라고 부르는 그 초록 칸들. 꾸준히 커밋하다 보면 어느 날 중간에 하얗게 빈 칸 두어 개가 보일 때가 있다. 나도 블로그(backtodev) 작업을 하다가 6월 28·29일이 텅 빈 걸 발견했다.
분명 그 이틀에도 작업을 했는데 왜 비었을까? 확인해 보니 그날 저장소에 일어난 건 GitHub Actions 봇이 만든 자동 커밋뿐이었다. 봇 커밋은 내 잔디에 안 잡힌다. 실제로 한 작업(블로그 초안 작성)은 git 커밋으로 안 남아 있었던 거다.
그래서 "이미 한 작업을 그 날짜로 기록하는" 방법을 찾아봤다. 결론부터 말하면 git은 커밋 날짜를 마음대로 지정할 수 있다. 다만 이걸 어떻게 쓰느냐에 따라 "정직한 기록"이 될 수도, "잔디 조작"이 될 수도 있다. 그 경계까지 같이 정리한다.
먼저: 잔디는 어떻게 계산될까
채우는 법을 알기 전에, 왜 비는지부터 알아야 한다. GitHub가 어떤 커밋을 "내 기여"로 세는지는 조건이 명확하다.
| 조건 | 설명 |
|---|---|
| 커밋 이메일 | 커밋의 author 이메일이 내 GitHub 계정에 등록된 이메일이어야 함 |
| 브랜치 | 기본 브랜치(main 등) 또는 gh-pages |
| 저장소 | 내가 권한을 가진 저장소, fork가 아님 |
| 날짜 | 너무 먼 과거나 미래가 아닐 것 |
빈 칸의 원인은 대부분 이 중 하나가 어긋난 경우다. 내 경우는 "봇이 커밋했고, 내 이메일이 아니라서" 안 잡힌 케이스였다.
💡 자주 하는 실수: 회사 노트북과 개인 노트북의
git config user.email이 다른 경우. 한쪽 이메일이 GitHub에 등록 안 돼 있으면 그 기기에서 한 커밋은 잔디에 안 뜬다.git config user.email로 먼저 확인하자.
Step 1. 내 커밋 이메일부터 확인
백데이트를 하든 안 하든, 이메일이 안 맞으면 헛수고다. 먼저 확인한다.
git config user.email
여기 나온 이메일이 GitHub 계정(Settings → Emails)에 등록돼 있어야 한다. 안 맞으면 바로잡는다.
git config user.email "you@example.com"
Step 2. 과거 날짜로 커밋 만들기
git에는 날짜가 두 종류 있다. 이게 핵심이다.
- Author date: 코드를 "작성한" 날짜
- Committer date: 커밋이 "기록된" 날짜
잔디는 이 둘을 함께 본다. 그래서 둘 다 지정해야 원하는 날짜에 찍힌다. 환경변수로 넘긴다.
GIT_AUTHOR_DATE="2026-06-28T14:20:00" \
GIT_COMMITTER_DATE="2026-06-28T14:20:00" \
git commit -m "post: 예약 포스트 등록"
GIT_COMMITTER_DATE를 빼먹으면 오늘 날짜로 찍혀서 잔디가 엉뚱한 칸에 들어간다. 둘을 같은 값으로 맞추는 게 포인트다.
푸시하면 끝이다.
git push origin main
잠깐 기다리면(보통 몇 분) 프로필 잔디에 그 날짜 칸이 초록으로 바뀐다.
Step 3. 내가 실제로 한 방법 — 진짜 작업을 그 날짜로
여기서부터가 이 글에서 제일 하고 싶은 이야기다. 나는 빈 칸을 채우려고 의미 없는 빈 커밋을 만들지 않았다. 대신 28·29일에 실제로 한 작업을 그 날짜로 나눠 기록했다.
그 이틀에 한 일은 블로그 초안 19개를 예약 발행 폴더로 등록하는 작업이었다. 그래서 이걸 두 묶음으로 나눠, 각각 28일·29일자로 커밋했다.
# 28일: 첫 묶음 등록
git add content/scheduled/post-a.md content/scheduled/post-b.md ...
GIT_AUTHOR_DATE="2026-06-28T14:20:00" \
GIT_COMMITTER_DATE="2026-06-28T14:20:00" \
git commit -m "post: 예약 포스트 10개 등록"
# 29일: 둘째 묶음 등록
git add content/scheduled/post-k.md ...
GIT_AUTHOR_DATE="2026-06-29T15:40:00" \
GIT_COMMITTER_DATE="2026-06-29T15:40:00" \
git commit -m "post: 예약 포스트 9개 등록"
결과적으로 잔디는 채워졌지만, 그건 없는 활동을 지어낸 게 아니라 실제 한 작업을 뒤늦게 git에 기록한 것이다. 이 차이가 중요하다.
빈 커밋으로 채우는 법 (참고만)
물론 기술적으로는 아무 내용 없는 빈 커밋으로도 칸을 채울 수 있다.
GIT_AUTHOR_DATE="2026-06-28T12:00:00" \
GIT_COMMITTER_DATE="2026-06-28T12:00:00" \
git commit --allow-empty -m "chore: keep streak"
--allow-empty는 변경 사항이 없어도 커밋을 만들게 해준다. 하지만 이건 추천하지 않는다. 저장소 히스토리에 의미 없는 커밋이 쌓이고, 무엇보다 잔디 본래의 의미(실제 활동 기록)를 스스로 무너뜨리는 일이다.
한 발 물러서서: 굳이 채워야 할까
솔직히 말하면, 잔디 한두 칸 비는 건 전혀 문제가 아니다. 매일 빈틈없이 초록인 프로필이 오히려 부자연스럽기도 하다. 채용 담당자도 잔디 색칠 빈도보다 "무엇을 만들었는지"를 본다.
그래서 내 기준은 이렇게 정리됐다.
| 상황 | 판단 |
|---|---|
| 그날 실제로 한 작업이 git에 안 남았다 | 백데이트로 기록하는 건 합리적 |
| 그날 아무 작업도 안 했다 | 빈 커밋으로 채우는 건 자기기만 |
| 그냥 streak 숫자가 아까울 뿐 | 안 채우는 게 낫다 |
기술은 같지만, 동기가 "기록"이냐 "조작"이냐가 갈림길이다.
트러블슈팅
| 증상 | 원인 | 해결 |
|---|---|---|
| 백데이트했는데 잔디에 안 뜸 | 커밋 이메일이 GitHub 미등록 | git config user.email → GitHub Emails에 등록 |
| 오늘 날짜로 찍힘 | GIT_COMMITTER_DATE 누락 | author/committer 둘 다 지정 |
| fork 저장소라 안 잡힘 | fork의 커밋은 기여로 안 셈 | 원본 저장소나 내 저장소에서 커밋 |
| 봇/Actions 커밋이 잔디에 없음 | author가 내 이메일이 아님 | 정상 동작. 봇 커밋은 원래 안 잡힘 |
| 며칠 지나도 반영 안 됨 | 반영 지연 또는 이메일 불일치 | 프로필에서 해당 커밋의 author 확인 |
정리
- 잔디 인정 조건: 내 이메일 + 기본 브랜치 + fork 아님
- 과거 날짜 커밋:
GIT_AUTHOR_DATE와GIT_COMMITTER_DATE를 둘 다 지정 - GitHub Actions 봇 커밋은 내 잔디에 안 잡힌다 (author가 내가 아니므로)
- 빈 커밋(
--allow-empty)으로도 채울 순 있지만 권장하지 않음 - 가장 좋은 건 실제로 한 작업을 그 날짜로 기록하는 것
나는 잔디를 "꾸미는" 도구가 아니라 "정확히 기록하는" 도구로 쓰기로 했다. 빈 칸을 보고 조급해하기보다, 그날 한 일이 git에 제대로 남았는지를 챙기는 편이 결국 더 떳떳하다.
backtodev
40대 PM, 다시 개발자로 돌아갑니다. 실패하고 배우며 성장하는 기록.