본문 바로가기
IT 기술/컴퓨터관리 팁

[git] git am 실패한 경우 처리하기

by 땅뚱 2016. 3. 31.

출처 : http://is.gd/CdaEFG

git am

git 을 사용하면서 format-patch 를 사용하는 경우가 있다.

 

내 경우에는 여러 개의 패치를 자동으로 적용하려고 할 때, 자주 사용한다. 여러 개의 패치에 대해서 format-patch 를 적용하면 순서대로 번호를 붙여서 patch 파일을 만들어주기도 하고, 적용할 때도 한번의 명령으로 패치를 적용할 수도 있기 때문이다.

 

> git format-patch <commit>

 

0001-xxxxxxxxxx.patch
0002-xxxxxxxxxx.patch
0003-xxxxxxxxxx.patch
0004-xxxxxxxxxx.patch

 

위와 같이 commit 에 해당하는 patch 까지 순서대로 패치 파일을 만들어준다.

이렇게 만들어진 patch 파일을 적용하기 위해서는 git apply 또는 git am 명령을 사용할 수 있다.(http://is.gd/zGCKYU)

 

git apply 는 기존의 patch 파일 또는 format-patch 로 만든 patch 파일을 모두 사용할 수 있다. 하지만, am 명령은 format-patch 로 만든 patch 파일에 대해서만 적용이 가능하다.

 

git am 의 장점은 여러 개의 패치파일에 대해서 문제가 없다면 한번에 적용이 가능하다는 것이다.

 

하지만, 인생이 그렇듯이 항상 우리가 원하는 대로 적용이 잘 되지 않는다는게 함정이다. 아래는 참조사이트에서 인용한 예제이다.

referenced by http://is.gd/CdaEFG

> git am PATCH

Applying: PACTH DESCRIPTION error: patch failed: file.c:137 error: file.c: patch does not apply error: patch failed: Makefile:24 error: libavfilter/Makefile: patch does not apply Patch failed at 0001 PATCH DESCRIPTION When you have resolved this problem run "git am --resolved". If you would prefer to skip this patch, instead run "git am --skip". To restore the original branch and stop patching run "git am --abort".


 

참조사이트를 찾아서 생각해 본 해결방법 2가지를 소개해 본다.

첫번째 방법

git am 의 경우 어떤 문제가 생겼는지 patch 처럼 알려주지를 않는다.

패치 적용이 잘 안되는 경우에 가장 간단한 방법은 git am 을 취소하고 직접 patch 를 적용하는 방법이다.

$ git am PATCH
(fail)

$ git am --abort

$ patch -p1 < PATCH
(fix)

$ git add FIXED_FILES

$ git commit -a

이렇게 문제를 해결할 경우에는 commit 에 대한 commit message 를 다시 작성해야하고, git am 의 대상이 되는 patch 가 여러개일 경우, 매 패치마다 git am --abort > patch > git add > git commit > commit 메시지 작성등의 작업을 해주어야 한다.

무척 귀찮은 작업이라 적용할 패치가 여러 개인 경우에 좀 더 좋은 방법은 git apply 명령을 활용하는 것이다.

두번째 방법

$ git am PATCH
(fail)

$ git apply PATCH --reject
(fail, .rej 파일 생성됨)

(fix)

$ git am --continue (or --resolved)

(반복)

apply 명령의 --reject 옵션은 patch 명령과 동일하게 rej 파일이 생성되도록 해준다.

이렇게 apply 명령을 활용하면 commit 메시지를 다시 작성할 필요도 없고, 최초에 patch 를 만들었던 author 등 기존 commit 메시지의 정보를 활용하여 반영해준다.

 

반영을 해주었다면, merge / rebase 등 confilict 이 발생했을 때와 동일하게 수정한 파일을 추가하고, am 을 계속 진행하면 된다.

$ git add <manual modified file>

$ git am --continue

첫번째 방법은 수동으로 하는 방식으로 쉽다고 느낄 수 있으나, 새로 commit 메시지 작업을 해주어야 하고, format-patch 등으로 기존 commit message 를 얻어오는 장점등을 활용할 수 없다.

 

두번째 방법은 안되면 git am --abort 로 git am 이전으로 돌아갈 수도 있고, 다양한 시도를 해볼 수 있어서 익혀두면 좋은 방법이라고 생각한다.