前言
Git patch是一種描述文件,它記錄了一系列的文件變更(如新增、修改、刪除)以及變更的具體內容。通過使用patch文件,可以將這些變更應用到其他代碼庫中,從而實現代碼的同步和更新。
Git 提供了兩種補丁方案,一是用git diff生成的UNIX標準補丁.diff文件,二是git format-patch生成的Git專用.patch 文件。
.diff文件只是記錄文件改變的內容,不帶有commit記錄信息,多個commit可以合并成一個diff文件。
.patch文件帶有記錄文件改變的內容,也帶有commit記錄信息,每個commit對應一個patch文件。
生成
創建patch和diff
從某次提交(含)之前的幾次提交創建Patch文件:
git format-patch <commit_sha1_id> -n
這個命令會從指定的提交開始往前數,生成指定數量的Patch文件。-n 參數表示生成的Patch文件數量,從指定提交開始往前數。
示例:
git format-patch 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 -2
這個命令將生成從提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 開始往前數的兩個Patch文件。
創建某個提交的Patch文件:
git format-patch <commit_sha1_id> -1
這個命令會生成指定提交的Patch文件。
示例:
git format-patch 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 -1
這個命令將生成提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 對應的Patch文件。
創建某兩次提交之間的所有Patch:
git format-patch <commit_sha1_id1>..<commit_sha1_id2>
這個命令會生成指定兩次提交之間的所有Patch文件。
示例:
git format-patch 2a2fb4539925bfa4a141fe492d9828d030f7c8a8..89aebfcc73bdac8054be1a242598610d8ed5f3c8
這個命令將生成從提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 到提交 89aebfcc73bdac8054be1a242598610d8ed5f3c8 之間的所有Patch文件。
創建Diff文件的常用方法:
使用 git diff 命令可以生成Diff文件。
git diff <commit_sha1_id1> <commit_sha1_id2> > <diff_file_name>
這個命令會生成兩次提交之間的所有差異,并將其保存到指定的Diff文件中。
示例:
git diff 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 89aebfcc73bdac8054be1a242598610d8ed5f3c8 > patch.diff
這個命令將生成提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 和 89aebfcc73bdac8054be1a242598610d8ed5f3c8 之間的所有差異,并保存到名為 patch.diff 的文件中。
使用Patch文件
現在有一個【0001-.patch】文件,需要把它應用到項目里面。
1.先把文件放在項目里面(隨便找一個位置都可以,但是也不要太搞了,記住文件的位置絕對路徑)
2.使用這個文件
git apply xxx.patch
比如
git apply D:\Android\AndroidProject\FormalProject\xxx\xxxxxxx-ad\xxxxxx\\debug\0001-.patch
這里面我把這個文件放在我的debug文件目錄下面了,這個都隨便放的,但是要記得位置就好了
要是沒啥問題的話,這一步之后其實就完事了,代碼就合并了,但是我們遇到了代碼沖突問題
比如
D:\Android\AndroidProject\FormalProject\xxxx\xxx-ad>git apply D:\Android\AndroidProject\FormalProject\xxxx\xxx-ad\qqqqq\eeee\debug\0001-.patch
error: patch failed: xxxx/src/main/java/com/wer/xxxx/work/newwork/MyActivity.java:35
error: xxxx/src/main/java/com/southgnss/xxxx/work/newwork/MyActivity.java: patch does not apply
error: patch failed: xxxx/src/main/res/layout/fragment_sample.xml:56
error: xxxx/src/main/res/layout/fragment_sample.xml: patch does not apply
通過這個錯誤可以看出,有兩個地方存在了沖突,需要解決這兩個沖突才可以合并下去。
解決沖突
首先我們先把不沖突的文件合并
git apply --reject xxx.patch
比如
D:\Android\AndroidProject\FormalProject\xxx\xxxxx-ad>git apply --reject D:\Android\AndroidProject\FormalProject\xxx\xxxxx-ad\xxx\qqq\debug\0001-.patch
經過這個之后,現在不沖突的代碼已經被合并了,但是沖突的代碼還在,沖突的代碼會生成【.rej】文件,這個文件去哪里找呢?
就在同名文件下面
比如
上面我們有兩個文件沖突,其中一個文件是【MyActivity】這個文件沖突,在執行了【git apply --reject】之后,找到這個文件【MyActivity】所在的文件夾,此時在這個文件下面會有一個同名文件【MyActivity.java.rej】。
打開這個文件然后對照【MyActivity】文件進行沖突的解決。
當所有沖突文件解決之后,就可以刪除【.rej】文件了,然后把之前的那個【0001-.patch】文件也可以刪除了
最后再檢查一下代碼,沒問題了就可以正常的使用git提交代碼了