Git patch

http://blog.csdn.net/flyingqr/article/details/6656862
패 치:
git-format-patch x..y
x y 는 해시 값 으로 x 에서 y 까지 순서대로 patch 를 칩 니 다.
커밋 패 치 만 생 성 한다 면 git - format - patch - 1 commt 를 사용 할 수 있 습 니 다.
과거 기록 부터 commt 를 git - format - patch -- root commt 로 시작 하려 면
 
제출 한 로그, 작성 자, 날짜 등 정보 가 담 겨 있다.당신 이 하고 싶 은 일 은 이 패 치 를 코드 라 이브 러 리 에 도입 하 는 것 입 니 다. 로그 도 도입 하여 나중에 유지 할 수 있 도록 하 는 것 이 좋 습 니 다.전통 적 인 패 치 방식 은...
patch -p1 < 0001--JFFS2-community-fix-with-not-use-OOB.patch

이렇게 패 치 를 치지 만 유용 한 정 보 를 잃 어 버 릴 수 있 습 니 다.
이 패 치 들 은 git format - patch 로 만들어 진 것 이 분명 하기 때문에 git 도구 로 잘 할 수 있 을 것 입 니 다.
git - am 은 바로 이 일 을 하 는 것 이다.
git - am 을 사용 하기 전에 먼저 git am – abort 를 한 번 사용 하여 이전의 am 정 보 를 포기 해 야 새로운 am 을 진행 할 수 있 습 니 다.그렇지 않 으 면 이런 실 수 를 당 할 것 이다..git/rebase-apply still exists but mbox given.
git - am 은 한 번 에 파일 이나 한 디 렉 터 리 에 있 는 모든 패 치, 또는 메 일 디 렉 터 리 에 있 는 패 치 를 합 칠 수 있 습 니 다.
다음은 두 가지 예 를 들 자.
  • 당신 은 지금 code base: small - src 가 있 습 니 다. 당신 의 patch 파일 은 ~ / patch / 0001 - trival - patch. patch
  • 에 놓 여 있 습 니 다.
    cd small-src
    git-am ~/patch/0001-trival-patch.patch

    패 치 에 성공 하면 차 한잔 하 러 갈 수 있 습 니 다.
    실패 하면 git 에서 오 류 를 알려 줍 니 다. 예 를 들 어:
    error: patch failed: android/mediascanner.cpp:452
    error: android/mediascanner.cpp: patch does not apply

    그러면 패 치 를 먼저 보고 잘못된 파일 을 고 쳐 서 패 치 를 올 릴 수 있 도록 해 야 합 니 다.
  • 당신 은 패 치 한 무 더 기 를 가지 고 있 습 니 다. 이름 은 위 에서 언급 한 패 치 입 니 다. 그들 을 ~ / patch - set / 디 렉 터 리 에 놓 으 세 요 (경로 마음대로)
  • cd opencore
    git am ~/patch-set/*.patch

    (여기 git 는 파일 이름 순 으로 am 이 patch 들) 모든 것 이 잘 되면 모든 patch 가 OK 되 고 당신 은 또 Lucky 가 됩 니 다.
    그러나 순 조 롭 지 못 할 때 는 십중팔구 입 니 다. git am 중간 에 patch 를 만나면 am 은 이 patch 를 치 는 곳 에 멈 춰 서 어느 patch 가 안 되 는 지 알려 드 립 니 다.
    예 를 들 어 저 는 지금 파일 file 이 하나 있 고 patch. file 의 내용 은?
    the text
    
    more text

    두 패 치 는 각각:
    0001-add-line.patch:
    From 48869ccbced494e05738090afa5a54f2a261df0f Mon Sep 17 00:00:00 2001
    From: zhangjiejing <zhangjiejing@zhangjiejing-desktop.(none)>
    Date: Thu, 22 Apr 2010 13:04:34 +0800
    Subject: [PATCH 1/2] add line
    
    ---
     file |    2 ++
     1 files changed, 2 insertions(+), 0 deletions(-)
    
    diff --git a/file b/file
    index 067780e..685f0fa 100644
    --- a/file
    +++ b/file
    @@ -3,3 +3,5 @@ file:
     some text
    
     more text
    +
    +add line
    --
    1.6.3.3

    0002-change-line.patch:
    From f756e1b3a87c216b7e0afea9d15badd033171578 Mon Sep 17 00:00:00 2001
    From: zhangjiejing <zhangjiejing@zhangjiejing-desktop.(none)>
    Date: Thu, 22 Apr 2010 13:05:19 +0800
    Subject: [PATCH 2/2] change line
    
    ---
     file |    2 +-
     1 files changed, 1 insertions(+), 1 deletions(-)
    
    diff --git a/file b/file
    index 685f0fa..7af7852 100644
    --- a/file
    +++ b/file
    @@ -1,6 +1,6 @@
     file:
    
    -some text
    +Change line text
    
     more text
    
    --
    1.6.3.3

    git am *. patch 실행
    자, merge 이 patch, 오류 보고, Patch failed at 0001 add line 이렇게 우 리 는 0001 이 patch 를 보 았 습 니 다. 원래 patch 에 필요 한 것 은 some text 이 고, file 안에 the text 가 있 기 때문에 편집기 로 이 줄 을 some text 로 바 꾸 었 습 니 다.
    vi file
    git apply 0001-add-line.patch
    git add file
    git am --resolved

    충돌 을 해결 한 후에, 예 를 들 어 git add 로 git 가 충돌 을 해결 했다 는 것 을 알 게 합 니 다.
  • 이 충돌 이 해결 되 지 않 는 다 는 것 을 발견 하면 am 전 체 를 취소 해 야 합 니 다. git am – abort 를 실행 할 수 있 습 니 다.
  • 이 패 치 만 무시 하고 싶다 면 git am – skip 을 실행 하여 이 패 치 를 건 너 뛸 수 있 습 니 다.
  • http://sweetdum.com/wordpress/?p=153
    git 에 서 는 diff 와 patch 를 직접 사용 하여 패 치 를 만 들 필요 가 없습니다. 위험 하고 번 거 롭 습 니 다. git 는 두 가지 간단 한 patch 방안 을 제공 합 니 다. 하 나 는 git diff 로 만 든 표준 patch 이 고, 다른 하 나 는 git format - patch 로 만 든 Git 전용 Patch 입 니 다.
    1. git diff 생 성 표준 patch
    우 리 는 먼저 git diff 로 patch 를 만 들 수 있 습 니 다. 이 예제 의 작업 디 렉 터 리 에는 "This is the file a" 라 는 내용 이 있 습 니 다. master 분기 에 놓 여 있 습 니 다. 코드 를 수정 하기 위해 서 는 새로운 가 지 를 만 드 는 것 이 일반적인 방법 입 니 다.
    sweetdum@sweetdum-ASUS:~/GitEx$ git branch Fix sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix Switched to branch 'Fix'
    다음 에 우 리 는 a 파일 에 한 줄 을 추가 한 후에 git diff 를 실행 합 니 다.sweetdum@sweetdum-ASUS:~/GitEx$ echo 'Fix!!!'>>a sweetdum@sweetdum-ASUS:~/GitEx$ git diff diff --git a/a b/a index 4add65f..0d295ac 100644 --- a/a +++ b/a @@ -1 +1,2 @@ This is the file a. +Fix!!!
    Git diff 의 출력 을 보 았 습 니 다. 이것 은 매우 전형 적 인 Patch 식 diff 입 니 다. 그러면 우 리 는 이 출력 을 Patch 로 직접 바 꿀 수 있 습 니 다.sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "Fix" [Fix b88c46b] Fix 1 files changed, 1 insertions(+), 0 deletions(-) sweetdum@sweetdum-ASUS:~/GitEx$ git diff master > patch sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master Switched to branch 'master'
    우 리 는 현재 패 치 파일 이 하나 있 고 master 에 서명 하 였 습 니 다. 그 다음 에 git apply 를 사용 하여 이 패 치 를 응용 할 수 있 습 니 다. 물론 실제 응용 에서 우 리 는 이렇게 한 지점 에 패 치 를 만 들 지 않 고 다른 지점 에 응용 하지 않 습 니 다. merge 만 있 으 면 되 기 때 문 입 니 다. 우 리 는 지금 이 Fix 지점 이 없 는 것 으로 간주 합 니 다. 일반적인 상황 에서 master 를 보호 하기 위해 서, 우 리 는 master 를 사용 할 것 입 니 다.새로 제출 한 패 치 를 전문 적 으로 처리 하 는 지점 을 만 듭 니 다:
    sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH Switched to branch 'PATCH' sweetdum@sweetdum-ASUS:~/GitEx$ git apply patch sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "Patch Apply" [PATCH 9740af8] Patch Apply 1 files changed, 1 insertions(+), 0 deletions(-)
    보 세 요. 현재 PATCH 분기 에 이 패 치 를 적용 하고 있 습 니 다. PATCH 분기 와 Fix 를 비교 해 볼 수 있 습 니 다. 결 과 는 아무것도 없 을 것 입 니 다. PATCH 분기 와 Fix 분기 가 똑 같 음 을 설명 합 니 다. patch 응용 에 성공 하 였 습 니 다. 여러 파일 이 있 더 라 도 git diff 는 하나의 patch 를 만 들 수 있 습 니 다.
    2. git format - patch 에서 생 성 된 git 전용 패 치 입 니 다.
    우 리 는 똑 같이 위의 예 를 들 어 작업 디 렉 터 리 를 사용 합 니 다. 이번 에는 Fix 분기 의 a 에 새 줄 을 추가 한 후에 git format - patch 로 patch 를 만 듭 니 다.sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix Switched to branch 'Fix' sweetdum@sweetdum-ASUS:~/GitEx$ echo 'Fix!!!'>>a sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "Fix1" [Fix 6991743] Fix1 1 files changed, 1 insertions(+), 0 deletions(-) sweetdum@sweetdum-ASUS:~/GitEx$ git format-patch -M master 0001-Fix1.patch
    git format - patch 의 - M 옵션 은 이 patch 가 그 분기 와 비교 해 야 한 다 는 것 을 표시 합 니 다. 현재 patch 파일 이 생 성 되 었 습 니 다. 그것 이 무엇 인지 봅 시다.
    sweetdum@sweetdum-ASUS:~/GitEx$ cat 0001-Fix1.patch From 6991743354857c9a6909a253e859e886165b0d90 Mon Sep 17 00:00:00 2001 From: Sweetdumplings Date: Mon, 29 Aug 2011 14:06:12 +0800 Subject: [PATCH] Fix1
    --- a |    1 + 1 files changed, 1 insertions(+), 0 deletions(-)
    diff --git a/a b/a index 4add65f..0d295ac 100644 --- a/a +++ b/a @@ -1 +1,2 @@ This is the file a. +Fix!!! -- 1.7.4.1
    보 세 요. 이번에 많은 것 이 많아 졌 습 니 다. diff 의 정보 뿐만 아니 라 제출 자, 시간 등 도 있 습 니 다. 자세히 보면 이것 은 E - mail 의 파일 입 니 다. 직접 보 내 셔 도 됩 니 다. 이런 patch 는 git am 으로 응용 해 야 합 니 다.
    sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master Switched to branch 'master' sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH sweetdum@sweetdum-ASUS:~/GitEx$ git am 0001-Fix1.patch Applying: Fix1 sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "PATCH apply"
    패 치 를 제출 한 후에 현재 파일 a 의 상황 을 다시 볼 수 있 습 니 다.
    sweetdum@sweetdum-ASUS:~/GitEx$ cat a This is the file a. Fix!!!
    역시, 픽 스 가 하나 더 생 겼 어!!
    그러나 주의해 야 할 것 은 master 와 Fix 분기 사이 에 여러 번 제출 하면 제출 할 때마다 patch 를 생 성 합 니 다.
    3. 두 패 치 의 비교:
    호환성: git diff 에서 생 성 된 Patch 호환성 이 뚜렷 합 니 다. 수 정 된 코드 의 공식 버 전 라 이브 러 리 가 Git 에서 관리 하 는 버 전 라 이브 러 리 가 아니라면 git diff 에서 생 성 된 patch 를 사용 해 야 프로젝트 관리자 가 코드 를 받 아들 일 수 있 습 니 다. 오류 제거 기능: git diff 에서 생 성 된 패 치 에 대해 서 는 git apply -- check 으로 패 치가 현재 분기 에 깨끗 하고 순조롭게 적용 되 는 지 확인 할 수 있 습 니 다. git format - patch 에서 생 성 된 패 치가 현재 분기 에 연결 되 지 않 으 면 git am 에서 힌트 를 주 고 패 치 작업 을 완성 하 는 데 도움 을 줄 수 있 습 니 다. git am - 3 을 사용 하여 3 자 합병 을 할 수 있 습 니 다. 자세 한 방법 은 git 손 을 참고 할 수 있 습 니 다.책 이나 Progit. 그런 점 에서 둘 다 잘못 나 누 는 기능 이 강하 다. 버 전 라 이브 러 리 정보: git format - patch 에서 생 성 된 패 치 에 이 패 치 개발 자의 이름 이 포함 되 어 있 기 때문에 패 치 를 사용 할 때 이 이름 은 버 전 라 이브 러 리 에 기 록 됩 니 다. 분명 적절 합 니 다. 따라서 현재 Git 을 사용 하 는 오픈 소스 커 뮤 니 티 에 서 는 format - patch 로 패 치 를 생 성 하 는 것 을 권장 합 니 다.

    좋은 웹페이지 즐겨찾기