danbibibi
article thumbnail

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
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로