일반 개발자는 소프트웨어 저장소에서 코드를 복제한 다음 코드를 작성하고 패치를 만든 다음 이메일을 통해 Linux로 보냅니다. 커널 관리자가 좋을 것입니다. Git은 원래 Linux 버전 제어 도구로 사용되어 투명하고 완전하며 안정적인 패치 기능을 제공했습니다.
패치(Patch)가 무엇인지 먼저 소개하겠습니다. 소프트웨어에 새 버전이 있는 경우 컴파일 및 설치를 위해 새 버전의 코드를 완전히 다운로드할 수 있습니다. 하지만 리눅스처럼 커널과 같은 대규모 프로젝트의 경우 코드를 압축하더라도 새로 다운로드할 때마다 비용이 상당히 많이 듭니다. 그러나 각 업데이트는 1MB 이상의 코드를 변경할 수 없으므로 두 가지 버전의 코드에 대한 차이점 데이터를 가지려면 매우 저렴한 비용으로 프로그램을 업데이트할 수 있어야 합니다. 그러므로 래리는 Wall은 패치라는 도구를 개발했습니다. diff 파일을 기반으로 버전 업데이트를 수행할 수 있습니다.
그러나 git에서는 diff와 patch를 직접 사용하여 패치를 만들 필요가 없습니다. 그렇게 하는 것은 위험하고 번거롭습니다. Git은 두 가지 간단한 패치 솔루션을 제공합니다. 하나는 git을 사용하는 것입니다. diff로 생성된 표준 패치이고, 두 번째는 git format-patch로 생성된 Git 전용 패치입니다.
1. git diff로 생성된 표준 패치
먼저 git diff로 패치를 만들 수 있습니다. 처음에는 이 문서의 예제 작업 디렉터리에 a 파일이 있고 내용은 "이 파일은 다음과 같습니다. a."가 마스터 브랜치에 배치됩니다. 코드를 수정하기 위한 일반적인 접근 방식은 새 브랜치를 생성하는 것입니다:
sweetdum@sweetdum-ASUS:~/GitEx$ git Branch
Fix
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix
브랜치로 전환됨
'Fix'
다음으로 파일 a에 한 줄을 추가한 다음 git diff를 실행합니다.
sweetdum@sweetdum-ASUS:~/GitEx$ 에코
'수정!!!'>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git diff
diff --git a/a
b/a
index 4add65f..0d295ac 100644
--- a/a
+++ b/a
@@ -1 +1,2
@@
a파일입니다.
+Fix!!!
Git를 봤습니다
diff의 출력은 매우 일반적인 패치 diff입니다. 이런 방식으로 이 출력을 패치로 직접 변환할 수 있습니다.
sweetdum@sweetdum-ASUS:~/GitEx$
git commit -a -m "Fix"
[Fix b88c46b] 수정
1개 파일 변경, 1개 삽입(+),
0개 삭제(-)
sweetdum@sweetdum-ASUS:~/GitEx$ git diff master >
패치
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
다음으로 전환됨
'master' 분기
이제 패치 파일이 있고 마스터를 체크아웃했습니다. 다음으로 git을 사용할 수 있습니다. 이 패치를 적용하려면 적용하세요. 물론 실제 애플리케이션에서는 한 브랜치에서 패치를 빌드하고 다른 브랜치에 적용하지는 않을 것입니다. 병합만 하면 되기 때문입니다. 우리는 지금 해당 Fix 분기가 없습니다. 일반적인 상황에서는 마스터를 보호하기 위해 특별히 새로 제출된 패치를 처리하기 위한 브랜치를 설정할 것입니다:
sweetdum@sweetdum-ASUS:~/GitEx$ git Branch
PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
다음으로 전환됨
브랜치 'PATCH'
sweetdum@sweetdum-ASUS:~/GitEx$ git apply
패치
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "패치
적용"
[PATCH 9740af8] 패치 적용
파일 변경 1개, 삽입(+) 1개, 0개
삭제(-)
이제 이 패치를 PATCH 분기에 적용했습니다. PATCH 분기와 Fix 분기를 비교할 수 있습니다. 결과는 확실히 아무것도 아니며 PATCH 분기와 Fix 분기가 있음을 나타냅니다. 정확히 똑같습니다. 패치가 성공적으로 적용되었습니다. 파일이 여러개 있어도 git diff는 패치를 생성할 수도 있습니다.
2.git format-patch로 생성된 git 전용 패치입니다.
위 예제의 작업 디렉터리도 사용합니다. 이번에는 Fix 분기의 a에 새 줄을 추가한 후 git을 사용합니다.
format-patch는 패치를 생성합니다.
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout
Fix
'Fix' 분기로 전환
sweetdum@sweetdum-ASUS:~/GitEx$ echo
'수정!!!'>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m
"Fix1"
[Fix 6991743] Fix1
파일 1개 변경, 삽입(+) 1개, 0개
삭제(-)
sweetdum@sweetdum-ASUS:~/GitEx$ git format-patch -M
master
0001-Fix1.patch
git format-patch의 -M 옵션은 이 패치를 해당 브랜치와 비교해야 함을 나타냅니다. 이제 패치 파일이 생성됩니다. 파일이 무엇인지 살펴보겠습니다.
sweetdum@sweetdum-ASUS:~/GitEx$ cat 0001-Fix1.patch
From
6991743354857c9a6909a253e859e886165b0d90 9월 17일 월요일 2001년 00:00:00
시작:
Sweetdumplings
날짜: 2011년 8월 29일 월요일 14:06:12
+0800
제목: [PATCH] Fix1
---
a | 1 +
파일 1개 변경, 삽입 1개(+), 삭제 0개(-)
diff --git a/a b/a
index 4add65f..0d295ac 100644
--- a/a
+++
b/a
@@ -1 +1,2 @@
a 파일입니다.
+Fix!!!
--
1.7.4.1
보세요, 이번에는 diff 정보뿐만 아니라 제출자, 시간 등 더 많은 것들이 있습니다. 자세히 보면 이것이 E-mail 파일이라는 것을 알 수 있으며 직접 보낼 수 있습니다! 이런 종류의 패치를 위해서는 git을 사용해야 합니다. 신청하러 갑니다.
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
브랜치로 전환됨
'마스터'
sweetdum@sweetdum-ASUS:~/GitEx$ git Branch
패치
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout
패치
sweetdum@sweetdum-ASUS:~/GitEx$ git am 0001-Fix1.patch
적용:
Fix1
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "PATCH apply"
패치를 제출한 후 파일 a의 현재 상황을 살펴볼 수 있습니다.
sweetdum@sweetdum-ASUS:~/GitEx$ cat a
a 파일입니다.
Fix!!!
물론, Fix가 하나 더 있습니다!!!
그러나 마스터와 Fix 브랜치 사이에 여러 개의 제출물이 있는 경우 제출할 때마다 패치가 생성된다는 점에 유의해야 합니다.
3. 두 패치의 비교:
호환성: 분명히 git diff로 생성된 패치는 강력한 호환성을 가지고 있습니다. 수정 중인 코드의 공식 저장소가 Git 관리 저장소가 아닌 경우 git을 사용해야 합니다. diff로 생성된 패치를 사용하면 프로젝트 관리자가 코드를 승인할 수 있습니다.
디버깅 기능: git diff로 생성된 패치의 경우 git apply --check를 사용하여 git의 경우 패치가 현재 브랜치에 깔끔하고 원활하게 적용될 수 있는지 확인할 수 있습니다. format-patch로 생성된 패치는 현재 브랜치에 적용할 수 없습니다. git am은 프롬프트를 표시하고 패치 작업을 완료하는 데 도움을 줍니다. git am을 사용할 수도 있습니다. -3 3자 병합을 수행합니다. 자세한 방법은 git 매뉴얼이나 "Progit"을 참조하세요. 이러한 관점에서 보면 두 가지 디버깅 기능 모두 매우 강력합니다.
저장소 정보: git으로 인해 format-patch로 생성된 패치에는 패치 개발자의 이름이 포함되어 있으므로 패치가 적용되면 이 이름이 저장소에 기록되는 것은 당연합니다. 따라서 현재 Git을 사용하는 오픈 소스 커뮤니티에서는 모든 사람이 format-patch를 사용하여 패치를 생성할 것을 권장하는 경우가 많습니다.