git format-patch로 커밋을 patch 파일로 공유하기
개요
커밋을 다른 사람과 공유하거나, 다른 저장소에 동일하게 적용하고 싶을 때 git format-patch를 쓰면 커밋 메시지·작성자·날짜·diff까지 모두 담긴 patch 파일을 만들 수 있다. 이메일로 patch를 주고받던 시절부터 내려온 표준 포맷이라, 받는 쪽에서 git am 한 줄이면 그대로 복원된다.
기본 사용법
# 특정 커밋 1개를 patch로 만들기 (-1 = 1개 커밋)
git format-patch -1 <commit-hash>
# 출력 디렉토리 지정
git format-patch -1 <commit-hash> -o ./patches/
실행하면 커밋 subject가 슬러그화된 이름의 파일이 생성된다:
0001-fix-null-check-in-user-service.patch
자주 쓰는 옵션
# HEAD 기준 최근 N개 커밋 (0001, 0002, ... 순번이 자동으로 붙음)
git format-patch -3 HEAD
# 특정 브랜치 이후로 갈라진 모든 커밋
git format-patch main..HEAD
git format-patch <base-commit>..HEAD
# 파일 안 만들고 stdout으로만 확인
git format-patch -1 <hash> --stdout
받는 쪽에서 적용하기
# 커밋 메시지·작성자·날짜까지 그대로 복원하면서 적용
git am 0001-fix-null-check-in-user-service.patch
# 여러 개를 한 번에
git am *.patch
# diff만 적용 (커밋은 직접 만들고 싶을 때)
git apply 0001-fix-null-check-in-user-service.patch
파일 안에 뭐가 들어있나
patch 파일을 열어보면 이런 구조다:
From <commit-hash> Mon Sep 17 00:00:00 2001
From: 작성자 <email>
Date: 작성 날짜
Subject: [PATCH] 커밋 제목
커밋 본문 (있다면)
---
변경된 파일들...
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git ...
(실제 diff 내용)
--
2.34.1
파일명 앞의 0001
여러 커밋을 한 번에 시리즈로 뽑을 때 적용 순서를 보장하기 위한 시리얼 번호. 커밋 1개만 뽑아도 항상 0001부터 시작한다.
파일 끝의 -- \n2.34.1
patch를 만든 git의 버전 정보. 이메일 형식의 signature delimiter(--)와 같은 모양이라, git am이 본문 끝을 인식할 때 사용한다. 적용에는 영향이 없다.
git diff > x.patch와 뭐가 다른가
| 항목 | `git diff > x.patch` | `git format-patch` |
| diff | O | O |
| 커밋 메시지 | X | O |
| 작성자/날짜 | X | O |
| git am으로 커밋 복원 | X | O |
| 여러 커밋 시리즈 지원 | X | O |
단순 변경사항만 옮기고 싶으면 git diff로 충분하지만,
“이 커밋을 그대로 다른 곳에 적용해줘” 라는 시나리오에서는 git format-patch + git am 조합이 표준이다.
정리
- 커밋 → patch: git format-patch -1 <hash>
- patch → 커밋: git am <file>.patch
- 여러 커밋 시리즈: git format-patch <base>..HEAD → git am *.patch
오픈소스 프로젝트에 메일링 리스트로 patch를 보내거나, 내부에서 보안상 직접 push가 어려운 환경에서 코드 변경을 공유할 때 유용하다.
'DevOps' 카테고리의 다른 글
| [Git] Worktree (0) | 2026.04.09 |
|---|---|
| [Git] Rebase 란? (0) | 2025.04.02 |
| [Git] git commit --amend , 가장 최신 커밋 수정 (0) | 2024.12.18 |
| [Jenkins] git branch 설정방법 (0) | 2024.11.28 |
| [Jenkins] ERROR: Error cloning remote repo 'origin' 해결 방법 (1) | 2024.11.15 |
