증상
매일 도는 자동 커밋·푸시가 어느 날부터 원격에 반영되지 않는다. 로그도 알림도 없다. 자동푸시를 붙인 첫날 실제로 발생했다.
원인
다른 세션·다른 기기가 원격에 커밋 하나만 올려두면 그때부터 non-fast-forward 거부가 난다. 실패를 삼키는 스크립트는 그 거부도 같이 삼킨다.
해법 — 순서가 중요하다
add → commit → pull --rebase origin main → push
★ pull --rebase를 commit 앞에 두면 안 된다. 방금 쓴 파일 때문에 워킹트리가 더러워 "unstaged changes"로 거부된다.
리베이스가 충돌로 멈춘 채 남으면 다음 회차가 통째로 막히므로 폴백을 둔다.
for st in rebase-merge rebase-apply; do
[ -d ".git/$st" ] && git rebase --abort && break
done
폴백의 한계 — 정직하게
-X theirs 자동해결은 다른 기기에서 손으로 고친 내용을 말없이 덮는다. 그래서 충돌 나면 그 회차는 포기가 정답이다. 단 이 폴백은 레포를 지키지만 작업을 지키지는 않는다. 충돌이 났다는 사실 자체가 남지 않는다.
검증
같은 파일을 여러 주체가 건드리는 날에는 push 후 git log --oneline -3으로 내 커밋이 실렸는지 확인한다.
중복 의심 시 — 초안끼리 대조하지 않는다
채팅에 뿌린 초안과 실제 푸시본은 다를 수 있다(푸시 직전 규약에 맞춰 고쳐 쓰는 경우). 초안끼리 대조하면 "다른 세션이 더 채워서 올렸다"는 오탐이 난다. 판정은 실물로 한다.
git log --format='%h|%s' origin/main -- '<파일경로>'
커밋이 하나뿐이고 그게 내 것이면 중복이 아니다.