1. 程式人生 > >如何使用git 生成patch 和打入patch

如何使用git 生成patch 和打入patch

平時我們在使用git 管理專案的時候,會遇到這樣一種情況,那就是客戶使用git 生成patch 給到我們,那我們就需要把客戶給到patch 打入到我們的project ,基於這樣一個場景,我把git 如何生成patch 和如何打入patch 做總結

生成patch 的方法:(我這裡描述的生成patch 是根據commit 記錄生成的)

1.例如首先先通過git log 檢視有哪一些commit

2.把第一次commit 提交以後的(不包括第一次提交)都生成patch 

如上圖所示:使用命令:git format-patche795fefabc

然後生成的patch 檔案如下圖所示

打入patch 的方法:

把生成的patch 檔案copy 到一個資料夾中來(這裡我建立了patch 資料夾)。如下圖所示

由於這些patch顯然是用git format-patch來生成的,所以用git的工具應該就可以很好的做好。git am 就是作這件事情。

在使用git am之前, 你要首先git am --abort 一次,來放棄掉以前的am資訊,這樣才可以進行一次全新的am。
不然會遇到這樣的錯誤。
                .git/rebase-apply still exists but mbox given.

git am 可以一次合併一個檔案,或者一個目錄下所有的patch,如下圖所示:

1 使用git format-patch生成所需要的patch:
當前分支所有超前master的提交:
git format-patch -M master
某次提交以後的所有patch:
git format-patch 4e16 --4e16指的是commit名
從根到指定提交的所有patch:
git format-patch --root 4e16
某兩次提交之間的所有patch:
git format-patch 365a..4e16 --365a和4e16分別對應兩次提交的名稱
某次提交(含)之前的幾次提交:
git format-patch –n 07fe --n指patch數,07fe對應提交的名稱
故,單次提交即為:
git format-patch -1 07fe
git format-patch生成的補丁檔案預設從1開始順序編號,並使用對應提交資訊中的第一行作為檔名。如果使用了-- numbered-files選項,則檔名只有編號,不包含提交資訊;如果指定了--stdout選項,可指定輸出位置,如當所有patch輸出到一個檔案;可指定-o <dir>指定patch的存放目錄;


2應用patch:


先檢查patch檔案:git apply --stat newpatch.patch
檢查能否應用成功:git apply --check newpatch.patch
打補丁:git am --signoff < newpatch.patch

(使用-s或--signoff選項,可以commit資訊中加入Signed-off-by資訊)

如果應用patch出現問題:

比如,一個典型的git am失敗,可能是這樣的:

$ git am PATCH

Applying: PACTH DESCRIPTION

error: patch failed: file.c:137

error: file.c: patch does not apply

error: patch failed: Makefile:24

error: libavfilter/Makefile: patch does not apply

Patch failed at 0001 PATCH DESCRIPTION

When you have resolved this problem run "git am --resolved".

If you would prefer to skip this patch, instead run "git am --skip".

To restore the original branch and stop patching run "git am --abort".

正如你所見,如果衝突發生,git只是輸出上述資訊,然後就停下來。一個小衝突會導致整個patch都不會被整合。

處理這種問題的最簡單方法是先使用 git am --abort,然後手動的新增此patch, patch -p1 < PATCH,手動解決掉程式碼衝突,最後使用 git commit -a 提交程式碼。但是這樣做有個問題就是你會失去PATCH中原本包含的commit資訊(比如From,Date,Subject,Signed-off-by等)。應該有一種更聰明的方法。

在 .git/rebase-apply 目錄下,存放著相應的補丁檔案,名字是“0001” (在更新的git版本中,存放補丁檔案的目錄名有所改變,這裡使用的git版本是 1.7.4.1)。

事實上,你可以使用 git apply 命令打patch(git apply 是git中的patch命令)。如同使用 patch -p1 命令時一樣,然後手動解決程式碼衝突(檢視生成的 .rej 檔案,與衝突檔案比較,修改衝突內容,並最終把檔案加入到index中):

$ git apply PATCH --reject

$ edit edit edit

(譯註:根據.rej檔案手動解決所有衝突)

$ git add FIXED_FILES

$ git am --resolved

就這麼簡單!

想多一些解釋,好吧。git am 並不改變index,你需要使用 git apply --reject 打patch(儲存在 .git/rebase-apply),手動解決程式碼衝突,(譯註:使用 git status 列出所有涉及檔案),把所有檔案(不僅僅是引起衝突的檔案)新增到(git add)index,最後告訴 git am 你已經解決(--resolved)了問題。這樣做的好處是你不需要重新編輯commit資訊。而且,如果你正在打的是一系列patch(就是說你在打的是多個patch,比如 git am *.patch)你不需要使用 git am --abort,然後又 git am。

參考資料:

相關推薦

如何使用git 生成patch 打入patch

平時我們在使用git 管理專案的時候,會遇到這樣一種情況,那就是客戶使用git 生成patch 給到我們,那我們就需要把客戶給到patch 打入到我們的project ,基於這樣一個場景,我把git 如何生成patch 和如何打入patch 做總結 生成patch 的方法:

Git基礎-生成Patch使用Patch

.com push gerrit man log sts rep ger 項目目錄 1.生成Patch(俗稱快照) 先來看看repo manifest 的用法 <1>cd /工作目錄/項目目錄/.repo/manifests <2>repo ma

git 生成patch使用patch

 FROM:http://blog.csdn.net/maybe_windleave/article/details/8703778 囉嗦下:發現自己的blog被轉載了,不過沒有註明出處,有點痛並快樂著的感覺。這裡正式申明下:轉載請註明出處,感謝。如有商用目的請務必知會

linux下生成patchpatch

1 patch 的生成 使用diff指令生成補丁檔案 1.1 單個檔案的生成指令 diff -up 檔案1 檔案2 > patch_test.patch 引數解釋: u: 顯示有差異行的前後幾行(上下文), 預設是前後各3行 p: 顯示程式碼所在的c函式的資訊 1.2 兩個資料夾的生成指令

IDEA生成patch使用patch

工作中用到的補丁大致可以分為兩種,一種是patch檔案,即補丁檔案拿過來利用某些命令將這個補丁打入當前程式碼中,另外一種是修改前和修改後的檔案對比包,這個對比包可以讓我們快速檢視到修改點的同時看到

利用 git format-patch git send-email 把修改的 patch 文件發送給 ffmpeg-devel

stop pass format class num false rpo orm auth 1. 下載源碼git clone https://git.ffmpeg.org/ffmpeg.git 2. 設置 git 用戶的郵箱和姓名git config --global us

如何使用git 生成patch

1,下載程式碼 git clone git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-next-2.6.git cd bluetooth-next-2.6 2,修改程式碼 vi drivers/b

git生成patch,應用到rpmbuild 打補丁

git diff > test.patch git format-patch 不要再用diff命令 對比生成patch了,太土 centos下 rpm製作 執行環境 [root@localhost myrpm_build]# u

git 怎麼用命令傳送patch補丁、send-email下載配置

本文是在Ubunt 12.04環境下測試的。 1、安裝必要的軟體 # apt-get install git git-core git-email 2、配置send-email的環境,主要是設定本地email的客戶端,用msmtp vim ~/.msmtprc   # default a

git 生成 patch的命令

個人理解: patch就是打補丁,通過git工具把程式碼的差分,生成patch檔案, 然後通過git工具可以直接把patch檔案的內容,merge到程式碼裡面。 生成patch的命令 git dif

git-am format-patch 的使用

git format-patch:當你想給一個開源專案(例如Rails)提交一段程式碼的時候,或者你想給小組成員展示一段你並不想提交的程式碼,那麼你還是需要 patch的,Git的'format-patch'命令良好的支援了這個功能。我來基本描述一下使用這個命令的步驟和方法:

如何用git建立應用patch

首先,用git clone 將遠端的庫克隆到本地: git clone url name_of_your_local_directory cd name_of_your_local_directory 在本地的master建立一個分支 git checkout -b

git am PATCH_FILE_NAME自動打patch失敗後的操作方法

操作方法 reverse git 信息 合並 沖突 失敗 根據 操作 1.找到打入patch不成功的patch 從打入patch的失敗信息可以找到 2.根據patch的index重新打入 patch,將可以合並的內容合並,沖突的部分單獨生成文件 比如出問題patch的ind

理解requests中的PATCHPUT的區別

假設URL位置有一組資料UserInfo,包括UserID、UserName等20個欄位 需求:使用者修改了UserName,其他不變     •   採用PATCH,僅向URL提交UserName的區域性更新請求     • 

PSUBundle Patch安裝概要

PSU是linux下的說法 Bundle Patch是windows下的說法 dataguard 備機的話只需要下面1、4和5中opatch apply這一個步驟 1.升級OPatch軟體 mv OPatch OPatch.old; unzip p6880880_11200

隨想錄(rt-patchlinux)

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】       因為linux本身不是rtos系統,所以用linux來完成一些對實時性有要求的工作,這本身就是很複雜的一項工作。但是,後來開源社群

用ASP.NET Core 2.0 建立規範的 REST API -- DELETE, UPDATE, PATCH Log

之前一篇文章介紹了POST和GET,這篇要介紹建立Richardson成熟度2級的DELETE, PUT, PATCH. DELETE 刪除資源 這個很簡單,以刪除City為例: 首先查詢Country,沒找到就返回404 Not Found;然後查詢City,沒找到也返回 404 No

svn生成patch與應用patch

在b分支的Settings目錄做了一些修改,需要合併到a分支的Settings目錄裡。 先進入b分支工作目錄的Settings目錄。svn diff -r 421:438 > r421_438.patch 複製r421_438.patch到a分支工作目錄的Settin

GIt的備份恢復

gitlab備份 恢復 1、GItlab備份Gitlab默認的備份路徑都是在配置文件中指定的,所以我們可以去配置文件中查看vim /etc/gitlab/gitlab.rb# gitlab_rails[‘manage_backup_path‘] = true # gitlab_rails[‘backu

git 的安裝使用

實用 指定 a10 而且 最新 lang 處理 get help 安裝Git 下載並安裝 mysysgit下載並安裝 git windows版本號 配置Git 設置你的名字和郵箱 git config --global user.name "xxxx" git