git patch 功能


概括

  git 有兩種生成 patch 的方式,以下分別舉實例說明用法。

  • 以下兩個實例都需要首先創建一個 master 分支
    $ touch a
    $ echo "This is a file" > a
    $ git init
    $ git add a
    $ git commit -m "init"
    $ git branch
    * master

git diff生成的標准patch

  • 生成標准patch
    $ git branch Fix             #建立一個分支
    $ git checkout Fix           #切換到Fix分支中
    Switched to branch 'Fix'       
    $ git branch
    * Fix
      master $ echo "This is a Fix" >> a  #修改分支內容 $ git diff diff --git a/a b/a index 0637880..ea52879 100644 --- a/a +++ b/a @@ -1 +1,2 @@ This is a file +This is a Fix $ git commit -a -m "Fix" [Fix d6e40c5] Fix 1 file changed, 1 insertion(+) $ git diff master > patch #生成patch
  • 給master打patch
    $ git checkout master        #切換到master分支
    Switched to branch 'master'
    $ git apply patch              #打patch
    $ cat a                        #查看文件 a 內容發現改變了
    This is a file
    This is a Fix
    $ git commit -a -m "apply Fix patch"    #提交

git format-patch生成的git專用補丁

  •  生成git專用patch
    $ git branch Fix             #建立一個分支
    $ git checkout Fix           #切換到Fix分支中
    Switched to branch 'Fix'       
    $ git branch
    * Fix
      master
    $ echo "This is a Fix" >> a  #修改分支內容
    $ git commit -a -m "Fix"
    [Fix 00fca27] Fix
     1 file changed, 1 insertion(+)
    $ git format-patch -M master #生成patch
    0001-Fix.patch

    $ cat 0001-Fix.patch
    From 00fca2756999112ebfbd357bfa114ea07bae2de6 Mon Sep 17 00:00:00 2001
    From: rivsidn <rivsidn@163.com>
    Date: Wed, 29 May 2019 20:43:17 +0800
    Subject: [PATCH] Fix

    ---
     a | 1 +
     1 file changed, 1 insertion(+)

    diff --git a/a b/a
    index 0637880..86e7879 100644
    --- a/a
    +++ b/a
    @@ -1 +1,2 @@
     This is a file
    +This is a Fix  
    --
    2.7.4

  • 打patch
    $ git checkout master              #切換到master分支
    Switched to branch 'master'

    $ git am 0001-Fix.patch           #打patch
    Applying: Fix
    rivsidn@rivsidn:~/test$ cat a
    This is a file
    This is a Fix

總結

  • 兼容性:很明顯,git diff生成的Patch兼容性強。如果你在修改的代碼的官方版本庫不是Git管理的版本庫,那么你必須使用git diff生成的patch才能讓你的代碼被項目的維護人接受。
  • 除錯功能:對於git diff生成的patch,你可以用git apply --check 查看補丁是否能夠干凈順利地應用到當前分支中;如果git format-patch 生成的補丁不能打到當前分支,git am會給出提示,並協助你完成打補丁工作,你也可以使用git am -3進行三方合並,詳細的做法可以參考git手冊或者《Progit》。從這一點上看,兩者除錯功能都很強。
  • 版本庫信息:由於git format-patch生成的補丁中含有這個補丁開發者的名字,因此在應用補丁時,這個名字會被記錄進版本庫,顯然,這樣做是恰當的。因此,目前使用Git的開源社區往往建議大家使用format-patch生成補丁。

注意事項

  • 一般情況下,為了保護master,我們會建立一個專門處理新交來的patch的分支
  • 實際應用中,我們不會在一個分支建patch,到另一個分支去應用,因為只有merge一下就好了,此處僅僅是做演示用。

參考資料

  • https://www.cnblogs.com/y041039/articles/2411600.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM