活用 git apply 合入 patch 補丁

創宇前端發表於2018-02-07

前言

在還是 git 新手時,經常會遇到一個比較尷尬的處境,git 倉庫經常會被自己給玩壞了,雖然沒到山窮水盡的地步,但也恨不得反手給自己一巴掌

衝動是魔鬼,我們還是要解決問題是吧~ 當然重置方法有很多了,而本文也將為你提供一個新的解題思路。

使用方法

認識 GIT DIFF

git diff 命令我們用得太多了,預設返回工作區和暫存區的檔案詳細差異。

什麼叫詳細差異?

工作區與暫存區的每一行資料變更都能夠在這個命令中看到,多用於提交程式碼前的再次審閱,避免出錯。

當然,git diff 不僅能提供工作區和暫存區的檔案對比,可以說能提供任意檔案差異,如下:

  1. git diff filepath 工作區與暫存區某檔案對比
  2. git diff HEAD filepath 工作區與 HEAD(當前工作分支) 比較,HEAD 也可替換為任意一次 commitID
  3. git diff --staged 或 --cached filepath 暫存區與 HEAD 比較
  4. git diff branchName filepath 當前分支的檔案與 branchName 分支的檔案進行比較
  5. git diff commitId filepath 與某一次提交進行比較
  6. git diff commitID1 commitID2 兩次 commit 提交間檔案對比

然後就在想,若能根據這些資訊恢復檔案,豈不妙哉? 當然,我肯定不是第一個這麼聰明的人,git 早就提供了相應的命令,且向下看。

生成 PATCH 補丁

patch 補丁即為根據 git diff 生成的文字內容檔案,最簡單的生成方法為 git diff > test.patch

其中 test。patch 檔案記錄了你本次的所有修改,若由於你忘記 git stash,或者強行 git reset --hard HEAD,這個檔案將是最後的救命稻草。

GIT APPLY

基本使用方法為 git apply patch,根據 patch 檔案內的資訊,在現有檔案中新增或刪除內容。

這裡新增或刪除的操作,和手動修改並無多大區別,即修改內容還是在工作區,不會提交到暫存區。之後的操作,就任君發揮了。

示例

我們預先生成一個文字檔案 text,其內容如下並提交 commit,工作區,暫存區皆無內容:

origin context line1
origin context line2
複製程式碼

將其修改為:

origin context line1
origin context
add line
複製程式碼

使用 git diff > test.patch 生成 patch 補丁,當然你可以把這個檔案放至任何目錄下,開啟其內容如下:

diff --git a/test b/test
index ce2f4b3..ae27ef5 100644
--- a/test
+++ b/test
@@ -1,2 +1,3 @@
 origin context line1
-origin context line2
+origin context
+add line
複製程式碼

然後我們使用 git checkout . 將檔案重置為最初狀態,text 檔案恢復為

origin context line1
origin context line2
複製程式碼

使用 git apply test.patch,將變更內容再次寫入,檢視 text 檔案,又變回了

origin context line1
origin context
add line
複製程式碼

示例為求簡潔特別簡單,也可以使用上文 git diff 儲存各種對比內容,從而恢復不同的檔案內容。

另外需要多說一句的是,git apply 是一個事務性操作的命令,若有衝突修改會被全部放棄,加引數 --reject 即可。

應用

前面說了那麼多,會有人反駁了,這裡我用其它命令諸如 git stashgit rebase 比你這個強大多了,這條命令很雞肋沒什麼用啊~

下面,用兩個鮮明的例項,證明這一命令的方便之處

舉個栗子

使用 patch 補丁下載 MR 內容

這個方法來源於部門同事,這是個有趣的人,經常會給我帶來各種奇思妙想,這裡我也就借花獻佛了。(為了獲取這個 idea 能夠撰文,偷偷塞給他 10 塊錢獲取了授權)

經常使用 gitlab 的同學大家都知道,當他人提交 MR 到主庫時,你只能做程式碼審閱,無法在 MR 未合併前直接下載更改後的檔案內容驗證程式碼是否正確。

當檔案更改內容過多,或者是前端專案你特別想看看程式碼執行起來的頁面效果時,備感無力。

當然,若是僅憑程式碼就能腦補其在瀏覽器中的顯示效果的人,當我沒說……

這裡關鍵的地方在於,如何獲取這個 MR 與主庫現有檔案的對比 patch 補丁,然而 gitlab 早已看透了你的一切小心思~

活用 git apply 合入 patch 補丁

點選 Email Patches,就可以直接下載 patch 檔案,然後通過上文的 git apply 直接將修改內容下載至本地,然後愉快的 yarn start 或者其它命令跑起你的專案檢視效果啦,so good!

多人協作

程式設計師的工作大家都是知道的,週末也會偶爾加個班修個緊急 bug 啥的,若你正放假坐著火車上,吃著火鍋唱著歌,一個電話打過來,緊急 bug,速度修復,真是要了個命吶~

而這時候屋漏偏逢連陰雨,VPN 也連不上公司內網,啥倒黴事全讓你佔盡了,這可咋整?!

要麼打電話請同事幫你改,二十八個檔案都需要改兩三句程式碼,一個一個說吧…… 半天過去了

或者整個修改的檔案全發過去,訊號差傳得又慢,還不如打電話說,可急死我了……

這時候,廢什麼話,git diff 打個 patch 補丁傳過去唄,一個 bug 修改的內容通常極少,不到 1KB……

到這裡也看出來了,patch 補丁最大的優勢在於內容小,能夠只記錄你的修改內容而非全檔案,通過 git apply 簡直不能更好用~

補充

這裡還有兩個類似命令:git format-patch commitA commitBgit am

前者會將一次 commit 的所有資訊也帶上,如作者,時間,節點描述等,再配合後者將 patch 內容應用到當前分支。 與 git apply 的不同點是,這裡補丁不再只在工作區,你會發現當前分支多 commitA 和 commitB 之間的提交記錄。具體細節,就還請大家自行去探索吧~


關注微信公眾號:創宇前端(KnownsecFED),碼上獲取更多優質乾貨!

活用 git apply 合入 patch 補丁

相關文章