Devops/Git

[Git] patch 파일로 변경 사항 관리하기

J4J 2024. 5. 9. 23:48
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 patch 파일로 변경 사항 관리하는 방법에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

Git Patch 파일이란?

 

git patch 파일은 소스 코드 작업으로 인해 발생된 변경 사항을 저장 및 관리하는 용도로 사용되는 파일입니다.

 

단순하게 얘기했을 때 "git diff" 명령어를 이용하여 commit들 사이에 발생된 변경 사항을 저장하는 파일이라고 이해해볼 수 있습니다.

 

 

 

변경 사항에 대해 확인하고 싶을 때 "git diff" 명령어를 이용하면 다음과 같은 결과들을 볼 수 있습니다.

 

그리고 patch 파일은 출력되는 다음 내용들을 그대로 저장하고 있다고 생각해 주시면 됩니다.

 

diff --git a/src/App.tsx b/src/App.tsx
index b61a540..27c4240 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,8 +1,22 @@
+import { useEffect, useState } from 'react';
+
 export default function App() {
+    const [messages, setMessages] = useState<string[]>([]);
+
+    useEffect(() => {
+        setMessages(['git', 'diff', 'patch']);
+    }, []);
+
     return (
-        <div>
-            <h2>eslint + prettier로 포매팅 자동화하기</h2>
-            <p>저장을 해야만 에러가 사라집니다...</p>
-        </div>
+        <main>
+            <h2>git diff로 patch 파일 생성하기</h2>
+            <div>
+                <ul>
+                    {messages.map((message, index) => (
+                        <li key={index}>{message}</li>
+                    ))}
+                </ul>
+            </div>
+        </main>
     );
 }

 

 

반응형

 

 

Git Patch 파일 사용 용도

 

git patch 파일의 사용 용도는 다음과 같습니다.

 

  • 코드 변경 사항들을 다른 팀원들에게 공유할 때 사용
  • 코드 변경 사항들을 서로 다른 프로젝트 환경에 동일하게 적용하기 위해 사용
  • 변경 사항에 대한 백업
  • 버전 관리

 

 

 

개인적으로 git patch 파일을 사용하고 있는 용도로는 두 번째가 해당됩니다.

 

재 사용되는 코드들을 관리하고 있는 boilerplate 프로젝트를 기반으로 다양한 서비스들을 개발하고 있는데, boilerplate에 변경 점이 발생되고 해당 내용이 모든 서비스에 적용되어야 할 때 patch 파일을 활용하고 있습니다.

 

만약 patch 파일을 활용하지 않았다면 각 서비스마다 동일한 변경 사항을 모두 적용해줘야 합니다.

 

이 과정에서 휴먼 에러가 발생될 수 있고 또한 적용해야 되는 서비스가 많아질수록 작업량도 많아집니다.

 

 

 

그러나 patch 파일을 활용하고 있기 때문에 휴먼 에러의 발생 빈도와 작업량은 모두 줄어들게 되었습니다.

 

기능 별 patch 파일을 생성하여 관리하고 필요한 서비스마다 쉽게 적용할 수 있기 때문에 저와 같은 상황에서 활용하신다면 많은 도움이 될 수 있습니다.

 

 

 

 

Git Patch 파일 생성 방법

 

git patch 파일을 생성하는 방법은 위에서 얘기한 대로 "git diff" 명령어를 활용하면 됩니다.

 

간단한 예시로 제가 patch 파일을 활용하고 있는 상황을 만들어보겠습니다.

 

다음과 같이 동일한 구조를 기반으로 만들어진 프로젝트가 각각 있다고 가정하겠습니다.

 

patch 파일 관리 프로젝트 구조

 

 

 

여기서 src/App.tsx 파일을 확인해 보면 처음에는 다음과 같이 코드가 존재합니다.

 

// app.tsx (변경 전)
export default function App() {
    return (
        <div>
            <h2>eslint + prettier로 포매팅 자동화하기</h2>
            <p>저장을 해야만 에러가 사라집니다...</p>
        </div>
    );
}

 

 

 

 

해당 파일 내부 소스 코드를 다음과 같이 변경해 보겠습니다.

 

// app.tsx (변경 후)
import { useEffect, useState } from 'react';

export default function App() {
    const [messages, setMessages] = useState<string[]>([]);

    useEffect(() => {
        setMessages(['git', 'diff', 'patch']);
    }, []);

    return (
        <main>
            <h2>git diff로 patch 파일 생성하기</h2>
            <div>
                <ul>
                    {messages.map((message, index) => (
                        <li key={index}>{message}</li>
                    ))}
                </ul>
            </div>
        </main>
    );
}

 

 

 

그러면 git에서는 다음과 같이 변경 사항이 확인되고 commit 이력을 남겨보겠습니다.

 

git status / add / commit

 

 

 

commit 이력을 남겼다면 "git log" 명령어를 이용하여 이력을 확인해 보겠습니다.

 

git log

 

 

 

 

"git diff" 명령어를 사용하는 방법은 다음과 같습니다.

 

$ git diff {변경 전 commit id} {변경 후 commit id}

 

 

 

즉, 방금 변경된 코드에 대해 변경 사항을 확인하고 싶다면 다음과 같이 명령어를 입력하여 확인할 수 있습니다.

 

만약 commit 이력이 더 많이 있다면 commit id 값의 범위를 넓혀서도 사용해볼 수 있습니다.

 

git diff

 

 

 

위의 상황까지 확인이 된다면 이제 patch 파일을 만드는 방법은 간단합니다.

 

다음 명령어를 입력하면 patch 파일이 프로젝트 내부에 만들어져 있는 것을 확인할 수 있습니다.

 

$ git diff {변경 전 commit id} {변경 후 commit id} > {파일 이름}.patch

 

patch 파일 생성

 

 

 

 

Git Patch 파일 적용 방법

 

위에서 생성한 patch 파일 내용을 확인해 보면 다음과 같이 git diff의 결과가 그대로 담겨있습니다.

 

// git-diff-patch.patch
diff --git a/src/App.tsx b/src/App.tsx
index b61a540..27c4240 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,8 +1,22 @@
+import { useEffect, useState } from 'react';
+
 export default function App() {
+    const [messages, setMessages] = useState<string[]>([]);
+
+    useEffect(() => {
+        setMessages(['git', 'diff', 'patch']);
+    }, []);
+
     return (
-        <div>
-            <h2>eslint + prettier로 포매팅 자동화하기</h2>
-            <p>저장을 해야만 에러가 사라집니다...</p>
-        </div>
+        <main>
+            <h2>git diff로 patch 파일 생성하기</h2>
+            <div>
+                <ul>
+                    {messages.map((message, index) => (
+                        <li key={index}>{message}</li>
+                    ))}
+                </ul>
+            </div>
+        </main>
     );
 }

 

 

 

이렇게 변경 사항이 확인되는 patch 파일을 동일한 구조를 기반으로 만들어져 있는 patch-b 프로젝트에 적용해 보겠습니다.

 

 

 

 

하지만 적용하기 전 이해하고 넘어가야 되는 부분이 있습니다.

 

patch 파일의 내용을 확인해 보면 다음과 같이 파일 경로가 기존 프로젝트 경로 앞에 a, b 등이 추가되어 생성된 것을 볼 수 있습니다.

 

--- a/src/App.tsx
+++ b/src/App.tsx

 

 

 

patch 파일을 적용하기 위해서는 "git diff"에 의해 생성된 a, b 등의 추가 경로를 삭제하며 적용해줘야 합니다.

 

삭제하는 방법은 patch 파일 적용 명령어에 "-p" 옵션 값을 추가해 주시면 됩니다.

 

경로 1개를 삭제하고 싶다면 "-p1", 경로 2개를 삭제하고 싶다면 "-p2"와 같이 적용해 볼 수 있습니다.

 

 

 

"-p1"을 적용하면 위의 경로들은 다음과 같이 변경되어 적용됩니다.

 

--- src/App.tsx
+++ src/App.tsx

 

 

 

만약 "-p2"를 적용한다면 위의 경로들은 다음과 같이 변경되어 적용됩니다.

 

--- App.tsx
+++ App.tsx

 

 

 

상황에 따라 달리 적용해볼 수 있지만 일반적으로 "-p1" 옵션을 사용해 주시면 됩니다.

 

 

 

 

이제 patch 파일을 patch-b 프로젝트에 옮겨서 변경 사항들을 그대로 적용해 보겠습니다.

 

patch-b를 확인해 보면 다음과 같이 patch-a 프로젝트에서 코드가 변경되기 전 내용과 동일한 것을 볼 수 있습니다.

 

patch-b app.tsx 소스 코드

 

 

 

해당 상황에서 다음 명령어를 이용하여 patch 파일을 적용해 보겠습니다.

 

$ patch -p{삭제할 디렉토리 경로 개수} < {파일 이름}.patch

 

patch 파일 적용

 

 

 

그러면 patch 파일이 가지고 있는 변경 사항들이 patch-b 프로젝트에도 동일하게 적용된 것을 확인할 수 있습니다.

 

patch 파일 적용 내용 확인

 

 

 

 

 

 

 

 

이상으로 patch 파일로 변경 사항 관리하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형