오픈소스에 대한 이해를 만화로 쉽게 할 수 있도록 작성한 컨텐츠를 원작자 님의 허락을 얻고 공유하고 있습니다.
원작자 : https://joone.net/
“diff와 patch는 무슨 툴인가?”
잠깐 사용 방법을 소개하면,
hello_v1과 hello_v2 디렉토리에는 같은 hello.c라는 파일이 있지만, hello_v2에는 변경한 코드가 있습니다.
~/foss-comics-code/47.git/diff$ cat hello_v1/hello.c /* gcc hello.c -o hello */ #include <stdio.h> int main() { printf("Hello World"); return 0; } ~/foss-comics-code/47.git/diff$ cat hello_v2/hello.c /* gcc hello.c -o hello */ #include <stdio.h> int main() { printf("Hello World\n"); return 0; }
두 hello.c파일을 비교할 때, diff라는 툴을 사용합니다.
~/foss-comics-code/47.git/diff$ diff -u hello_v1 hello_v2 diff -u hello_v1/hello.c hello_v2/hello.c --- hello_v1/hello.c 2022-09-05 18:37:24.894542803 -0700 +++ hello_v2/hello.c 2022-09-05 18:38:58.740332080 -0700 @@ -4,7 +4,7 @@ int main() { - printf("Hello World"); + printf("Hello World\n"); return 0; }
위와 같이 두 파일을 차이를 쉽게 볼 수 있습니다. 자, 이제 이를 파일로 만들어서 hello.c를 만든 사람에 전달해봅시다.
~/foss-comics-code/47.git/diff$ diff -u hello_v1 hello_v2 > diff.patch ~/foss-comics-code/47.git/diff$ cat diff.patch diff -u hello_v1/hello.c hello_v2/hello.c --- hello_v1/hello.c 2022-09-05 17:25:53.992894733 -0700 +++ hello_v2/hello.c 2022-09-05 17:27:51.091147715 -0700 @@ -4,7 +4,7 @@ int main() { - printf("Hello World"); + printf("Hello World\n"); return 0; }
diff.patch라는 파일이 만들어졌습니다. 이제 이를 hello_v1/hello.c에 적용해봅니다.
~/foss-comics-code/47.git/diff$ patch -d hello_v1/ -p1 < diff.patch
이렇게 하면 hello_v1/hello.c와 hello_v2/hello.c이 같아야 합니다. 확인해보겠습니다.
~/foss-comics-code/47.git/diff$ diff -u hello_v1 hello_v2 ~/foss-comics-code/47.git/diff$
diff 명령어 결과가 없는 것으로 보아 두 파일이 같다는 것을 알 수 있습니다.
참고로, diff 명령어는 1970년대 초기에 벨랩에서 Unix 운영체제를 개발할 당시에 만들어진 툴입니다.
직접 diff와 patch 명령어를 사용해보세요!
https://github.com/joone/foss-comics-code/tree/main/47.git/diff
참고: diff와 patch 프로그램을 사용하는 방법 (https://kldp.org/node/28938)