git diff & patch 적용

2021. 11. 30. 07:45Env/Tools

    목차
반응형

1. diff 생성

1) diff을 뜨기 위한 위치로 이동한다. 

2) patch file을 생성한다.

~$ git diff > patch_file

or

~$ git diff --no-prefix > patch_file

  • no-prefix option
    • 출력된 차이 정보에 파일 경로의 접두사를 포함하지 않는 옵션입니다.
    • 보통 src/main.c 와 같이 src라는 경로가 포함되나, 이 옵션을 사용하면 main.c만 보이게 됩니다.
    • 보다 간결한 출력을 얻고자 하는 경우에 사용합니다.
  • 하위 폴더
    • 기본적으로 git diff > patch를 하게되면 하위 폴더들에 대해 모두 재귀적으로 차이를 생성합니다.
    • 만일 특정 폴더에서만 수행하고 싶다면, git diff src/ > patch와 같이 diff을 얻고자 하는 폴더를 지정하여 git diff을 수행합니다.

 

2. patch 적용

1) patch를 적용할 위치로 이동한다. 

~$ cd path

2) patch를 적용한다.

~$ patch -p1 < patch_file

or

~$ patch -p0 < patch_file

  • -p1
    • 파일 경로에서 경로 구성 요소를 제거하는데 사용하는 옵션입니다. 
    • git에서 생성한 patch file에는 보통 (no-prefix를 주지 않을 경우) 파일에 전체 경로가 포함되어 있습니다. 
    • 이 patch를 특정 경로부터 시작하는 하위 경로에 적용하고자 할때 -p1 옵션을 사용합니다.
    • -p1은 경로 구성 요소 중 첫 번째 요소를 제거하는 것을 의미합니다.
    • 즉, a/src/main.c의 경우 -p1을 주면, src/main.c와 같이 가장 앞의 a/를 제거하여 patch file을 적용합니다.
    • 만약 a/src 둘 다 제거하고 적용하고자 한다면, -p2를 주면 되겠습니다. 
    • -p0은 파일 경로에 아무 변경을 주지 않고 처리하는 옵션입니다. 즉, patch 파일 내 경로를 그대로 적용해 파일을 찾고 patch를 적용합니다.

 

3. 적용 예

project
   +- src
   |     +- main.c
   |     +- util.c

 

프로젝트가 위와 같이 구성된 경우 main.c의 내용을 수정합니다. 이제 diff을 수행합니다.

 

git diff > patch_file

--- a/src/main.c
+++ b/src/main.c

...

현재 directory의 위치가 이니라, 기준이 되는 것에 a/를 붙이고, 수정 부분에 b/를 붙입니다.

(그래서 patch 적용 시 -p1을 지정할 필요는 없습니다)

 

이제 patch_file을 적용할 때, project가 다른 위치에 있을 수 있습니다. (만약 위와 같이 a/, b/로 처리되지 않은 경우)

그래서 -p1 옵션을 사용해서 경로의 첫 번째 구성 요소를 제거하고 patch_file을 적용하면 편리합니다. 

 

patch -p1 < patch_file

 

그러나 patch_file 내 경로의 시작이 a/, b/ 처럼 git이 임의로 지정한 위치로 구성된 경우라면, -p1을 지정하지 않아도 됩니다.

반응형

'Env > Tools' 카테고리의 다른 글

VirtualBox Ubuntu 메뉴가 안보일 때 (no menu)  (0) 2021.12.13
Markdown grammar  (0) 2021.12.05
tmux 사용법  (0) 2021.11.30
iTunes에 앱 별 파일 넣기  (0) 2021.11.30
VirtualBox Ubuntu 메뉴가 안보일 때 (no menu)  (0) 2021.10.09