본문 바로가기
git & github

git Patch 생성과 적용

by spare8433 2025. 1. 3.

Patch 생성

git diff 와 git format-patch 명령어들로 패치 파일을 생성할 수 있습니다. 이 파일은 다른 사람에게 변경 사항을 전달하거나 나중에 적용할 때 사용됩니다.




git patch 라는 명령어가 있는 것이 아니다.




1. git diff

현재 작업 중인 변경 사항을 비교하고, 그 차이를 패치 형식으로 출력합니다. git diff > patch.diff 명령을 사용하면, 현재 작업 디렉토리에서의 변경 사항을 patch.diff라는 파일로 저장할 수 있습니다.



git diff > patch.diff



※ diff 형식

  • 두 파일 간의 차이를 나타내는 파일입니다.
  • 커밋 메시지나 작성자 정보와 같은 메타데이터는 포함되지 않습니다.



ex)

--- old_file.txt
+++ new_file.txt
@@ -1,4 +1,4 @@
 This is a sample file.
-It has some content.
+It has some updated content.
 There are several lines here.
 The last line stays the same.




2. git format-patch

git format-patch <커밋 해시>..



특정 커밋을 기준으로 패치를 생성하며 mbox 형식의 패치 파일을 생성합니다.


주로 이메일로 다른 개발자에게 패치를 보내거나 다른 브랜치에 변경 사항을 적용하려고 할 때 사용됩니다. 예를 들어, git format-patch HEAD~3 명령은 최근 3개의 커밋을 패치 파일로 생성합니다.



※ mbox 형식

  • Git에서는 패치 파일을 이메일로 보내거나 적용할 때 이 형식을 사용
  • mbox는 여러 개의 패치를 하나의 파일에 포함시키는 형식
  • 헤더 정보(작성자, 날짜, 커밋 메시지 등) + 변경 내용

ex)

From <commit_hash> <date>
From: Author Name <author@example.com>
Date: Thu, 3 Jan 2025 12:00:00 +0000
Subject: [PATCH] Commit message

---
 file.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/file.txt b/file.txt
index 5d8f3d9..1d3f7d9 100644
--- a/file.txt
+++ b/file.txt
@@ -1,3 +1,2 @@
 line 1
 line 2
-line 3
+line 3 updated
-- 
2.34.1




Patch 적용

git applygit am 으로 패치 파일을 적용할 수 있습니다.



1. git apply

패치 파일에 저장된 변경 사항을 현재 작업 디렉토리로 적용



실제로 커밋하지 않고, 단지 워킹 디렉토리와 인덱스(Staging Area)에 변경을 적용하는 데 사용됩니다.


git apply patch.diff



주요 옵션

  • --3way 옵션: 충돌 발생 시 3-way merge 를 시도.

      git apply --3way patch.diff
  • -R 옵션: 패치를 되돌리는 데 사용.

      git apply -R patch.diff



2. git am

git am < patch.mbox

이메일 형식으로 작성된 패치 파일을 읽어 변경 사항을 워킹 디렉토리에 적용하며 패치 파일에 포함된 메타데이터(커밋 메시지, 작성자, 날짜 등)를 사용해커밋을 자동으로 생성합니다.



주요 옵션

  • --3way 옵션: 충돌 발생 시 3-way merge 를 시도.

      git am --3way < patch.mbox
  • --abort 옵션: 패치 적용을 취소하고 원래 상태로 되돌림

     git am --abort




참고

https://hanmailco34.tistory.com/148
https://git-scm.com/docs/git-diff
https://git-scm.com/docs/git-format-patch
https://git-scm.com/docs/git-apply
https://git-scm.com/docs/git-am