git 生成patch和使用patch
囉嗦下:發現自己的blog被轉載了,不過沒有註明出處,有點痛並快樂著的感覺。這裡正式申明下:轉載請註明出處,感謝。如有商用目的請務必知會本人。
在android大環境下工作,遲早都會接觸到git工具,這裡說一下本地獲取修改補丁的幾種方式。
工作中用到的補丁大致可以分為兩種,一種是patch檔案,即補丁檔案拿過來利用某些命令將這個補丁打入當前程式碼中,另外一種是修改前和修改後的檔案對比包,這個對比包可以讓我們快速檢視到修改點的同時看到修改的上下文。先說說獲取修改前和修改後檔案的兩種常用方法。第一種:除錯完成程式碼之後,在當前倉庫下執行如下語句:
git stash;
就能恢復到修改前的狀態,得到修改檔案之後,再執行:
git stash pop;
這又恢復了修改之後的狀態了。如果你有多個倉庫需要管理,可以使用repo forall命令幫助執行。
再說說另外一種方法。有時候修改完程式碼之後,不想馬上就提交,可以另外其一個分支,在這個分支上提交,結束之後再切回原來的分支。一般常用命令如下:
repo start name . (注意name之後有一個".",表示當前工程。或者使用git checkout -b name 遠端分支名稱)
git commit -a
git checkout name (或者在新建一個分支)
這兩種方法一般本地團隊使用比較好。如果涉及到跨公司跨地域的交流,建議還是用下面的patch檔案方式。
個人理解android開發接觸到的patch,一般可以分為兩種,一種是UNIX下的patch,可以使用git diff或者其他UNIX的diff命令生成(本人只用過git diff命令,後面的看書有提到過但是自己木有用過),一種是git 工具生成的patch,也可以說是git專用的patch,使用git format-patch命令生成。先來看看git diff生成patch的過程。一般常用命令如下:
git diff > patch
git diff --cached > patch
git diff branchname --cached > patch
這個時候當前目錄下就會有一個patch檔案,這是一個非git環境也可以使用的patch。對於這種patch,在git上使用要用git apply命令,如下:
git apply patch
由於這是一個類似UNIX下更新檔案的操作,所以執行完上述操作之後,實際上是等於手動修改了檔案,還要做一些git commit之類的操作。另外請注意,git apply 是一個事務性操作的命令,也就是說,要麼所有補丁都打上去,要麼全部放棄。ProGit上說明在實際打補丁之前,可以先用git apply --check 檢視補丁是否能夠乾淨順利地應用到當前分支中:git apply --check patch,如果執行完該命令之後沒有任何輸出,表示我們可以順利採納該補丁,接下來就是git上的提交了。
在接著說說git format-patch生成的補丁,這是git專用的,也是日常工作中最常接觸到的補丁型別。常用命令如下:
1)兩個節點之間的提交: git format-patch 節點A 節點B
2)單個節點: git format-patch -1 節點A (-n就表示要生成幾個節點的提交)
3)最近一次提交節點的patch :git format-patch HEAD^ 依次類推……
使用git format-patch命令生成的patch檔案,包含了提交的附加資訊:比如作者,時間等。再次基礎上使用git am命令即可將此補丁應用到當前分支。注意應用完之後,你會發現當前分支多了一次提交記錄,並且有完整的資訊,而不是簡單的修改檔案。在對比一下,git diff 和git format-patch生成的patch一個重要不同之處,實際使用中會發現git diff一次只會生成一個patch檔案,不管差別了多少個提交,都是一個;而git format-patch是根據提交的節點來的,一個節點一個patch。
補充小技巧: 如果有額外資訊需要補充,但又不想放在提交訊息中說明以免搞亂了提交說明。可以編輯這些補丁檔案,在第一個“---” 行之前新增說明即可。這樣的資訊能閱讀,但在執行完git am命令之後該節點的提交資訊不回包含上述資訊。
相關文章
- 如何使用git 生成patch 和打入patchGit
- 使用 git add -p 整理 patchGit
- Git 打補丁-- patch 和 diff 的使用(詳細)Git
- Git 打補丁– patch 和 diff 的使用(詳細)Git
- LINUX 的patch 製作,及打patchLinux
- 打 patch 報錯:corrupt patch at line 36
- Diff and Patch
- 2.3.3.4 Application PatchAPP
- [原創]How to send patch files by git send-mailGitAI
- 【mos 1265700.1】Oracle Patch Assurance - Data Guard Standby-First Patch ApplyOracleAPP
- REST:使用PATCH進行部分更新 - mscharhagREST
- RAC和ASM環境下打patchASM
- openGauss 支援SQL-PATCHSQL
- 如何編寫 iOS PatchiOS
- Some notes about patch workflows
- Java中的Json Path和Json Merge PatchJavaJSON
- 如何使用diff 和 patch 命令對檔案進行協作?
- [20190221]sql patch 問題.txtSQL
- Oracle Critical Patch Update for October 2022Oracle
- [20210621]Driving site patch.txt
- iOS遠端hot patch的優點和風險iOS
- 有關HTTP的PATCH提交方式HTTP
- Vue 原始碼解讀(12)—— patchVue原始碼
- Vue原始碼剖析——render、patch、updata、vnodeVue原始碼
- Sanic head(), options(), patch(), put() 方法/函式函式
- ORA-15137: The ASM cluster is in rolling patch stateASM
- 差異檔案(diff)和補丁檔案(patch)簡介
- ORACLE ONLINE PATCH & ORA-00600[kcbgtcr_13]Oracle
- PostgreSQL mail list patch:Non-volatile WAL BUFFERSQLAI
- 淺談我對python中的monkey patchPython
- 最新啟用Navicat 15教程,附Keygen Patch
- [20181007]12cR2 Using SQL Patch.txtSQL
- Multi-Patch Prediction Adapting LLMs for Time Series Representation LearningAPT
- patch_id,version, action ,status,action_time,description
- 構建api gateway之 如何給openresty打patchAPIGatewayREST
- Kubernetes官方java客戶端之七:patch操作Java客戶端
- PSU的GI升級,ERROR: This patch is not applicable to GI home.ErrorAPP
- [20181007]12cR2 Using SQL Patch 2.txtSQL
- 使用 HTTP PUT, PATCH 以及 MERGE 請求消費 SAP ABAP OData 服務修改操作HTTP