git 生成patch和使用patch

Andrew這個暱稱發表於2013-03-21

        囉嗦下:發現自己的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命令之後該節點的提交資訊不回包含上述資訊。 

相關文章