◽ Git

[Git] patch (타 저장소 커밋 적용)


git patch

  원래 같은 저장소 내에 브런치가 여러 개 있다는 상황에서는 cherry-pick으로 전에 정리했던 글(2021.12.30 - [◽ Git] - [Git] cherry-pick(체리 픽) 예제, 사용 방법 정리 [패치 적용 시 사용])이 있는데 여기에서 소개한 cherry-pick을 사용했었는데, 하지만 조건이 있다. 같은 저장소 내에서만 적용이 가능하다. 다시 말하면 타 저장소는 참고할 수가 없다.

 

  그래서 찾아보니 diff로 변경사항을 파일로 만들어서, 타 저장소에서 패치로 적용하는 방법이 있어 정리하려고 한다. 이게 gui로 제공하는 소스트리나 ide에 내장된 git은 이러한 기능을 제대로 제공하지 않기 때문에 bash로 직접 사용해야 한다. 소스트리에는 이런 비슷한 역할을 하는 기능인 "패치"가 있긴 하지만 파일을 생성할 뿐, import가 제공되지 않는다.


 

1. 패치 파일 만들기 - diff

  먼저 패치 파일을 만들기 위해서는 git bash에서 커밋 아이디와 diff 명령어를 이용하여 패치파일을 생성한다.

"$ git diff {start commit id} {end commit id} > {patch.diff path}"와 같이 명령어를 입력해 생성한다.

예시) $ git diff f5582b0 17504b3 > "C:\Users\1234\Desktop\desktopFolder\patch.diff"

 

 

2. diff file

  위의 명령어를 수행하면 아래와 같이 지정된 diff 파일이 생긴다.

 

 

 

 

 

3. diff 파일 적용

  이제 파일을 적용하기 전에 알아야할 사항은 타 저장소이기 때문에 diff 파일에 파일명과 경로까지 저장되어 있다는 점을 알아야 한다. 아래와 같이 "ImageJavaDocComment.java"만 있는 것이 아니라 앞에 경로가 있다는 점을 참고해야 한다. 물론 패치파일을 생성할 때 --name-only와 같은 옵션으로 파일명만 만들 수도 있다. 하지만 default값 기준으로 patch시 나타나는 오류를 설명하기 위해서 알아두어야하는 사항이다.

 

 diff파일을 적용하기 위해서는 "$ patch -p1 < 'C:\Users\1234\Desktop\desktopFolder\patch.diff'"와 같이 수행하면 되고 -p옵션은 "ImageJavaDocComment.java"앞에 경로를 하나씩 뺄 수 있는 옵션이다. p1이면 맨 앞에 생략된 "/b"가 제거된다. p2로 수행하면 "/b/src"가 제거된다.

 

 

 

  별다른 충돌이 없다면 그대로 적용이 될 것인데, 아래와 같이 오류같은 하나의 과정이 더 나오게 되는데, 이 이유는 경로가 없거나, 적용할 파일이 없기 때문이다. 그래서"File to patch:"가 나타난다. 이를 해결하기 위해서는 경로를 지정하거나 지정된 경로로 이동하는 방법이 있고, 가장 깔끔한 것은 현재 위치를 지정된 경로로 이동해주는 것이 가장 깔끔하다. 

 

 

 

 

 

아래는 별다른 충돌없이 바로 적용된 모습.

 

 


참고 :

- https://stackoverflow.com/questions/37781357/avoiding-patch-command-to-ask-for-file-to-patch

- https://codechacha.com/ko/git-patch/


 

푸터바