使用 diff 和 patch 命令協(xié)同開發(fā)
大家好,我是良許。
之前我在公司上班的時候,需要經(jīng)常跟外國同事一起協(xié)同開發(fā)(之前在外企上班)。由于是異地協(xié)作,所以溝通幾乎全部是通過郵件。
我們有使用 Git 進行代碼版本管理,但有時為了快速驗證,外國同事非常喜歡發(fā)個 patch 包過來讓我們做測試。這也是我第一次在工作中使用 diff 和 patch 命令。
簡單來講,diff 命令可以用來創(chuàng)建一個差異文件,然后接收者可以使用 patch 命令將這部分差異代碼應(yīng)用到自己的代碼里,達到協(xié)同開發(fā)的目的。
本文我們就來聊聊,怎么使用 diff 和 patch 命令進行協(xié)作開發(fā)。
一個簡單的例子
大家的業(yè)務(wù)及所使用的編程語言都不一樣,所以為了便于敘述與理解,這里不使用具體的代碼,而是一起編寫一個具有一定邏輯的步驟文檔。
假設(shè)你和我正在合作編寫一個描述如何泡茶的文件。
下面是你寫的代碼部分:
- Boil water.
- Warm the teapot.
- Add tea and water to the teapot.
- Place a tea cosy over the teapot.
- Steep for 6 minutes.
- Pour tea into cup.
- Add milk.
你家不種茶,也沒有泡茶經(jīng)驗,所以這里有很多優(yōu)化空間。
我家畢竟是多年種茶老司機,也培養(yǎng)出多名優(yōu)秀的賣茶女業(yè)務(wù)代表,所以我大筆一揮,改進了一下泡茶步驟。
我先將文件復(fù)制為 tea-revision.md ,然后在此基礎(chǔ)上進行修改,得到以下內(nèi)容:
- Warm a teapot in the proving drawer of your oven.
- Boil water.
- Add tea leaves to a tea strainer.
- Add strainer and water to teapot.
- Steep for 6 minutes. Keep it warm with a tea cosy.
- Pour tea into cup.
- Optionally, add warm milk.
在這里,有幾行代碼語句沒有任何改動,比如 Boil water 和 Pour tea into cup ;新增了幾行代碼,比如第一行 ,而有些行則進行了改動(增加或減少了部分內(nèi)容)。
這么優(yōu)秀的代碼,你不應(yīng)用的話太可惜了~
使用diff命令創(chuàng)建差異
我如果直接把寫好的代碼丟給你,你肯定一頭霧水,需要自己去對比兩份代碼的差異,費時費力。這時 diff 命令就派上用場了。
diff 命令可以直觀顯示兩個文件之間的差異,使用 --unified (或者簡寫為 -u)選項可以顯示哪些行被添加或刪除。默認(rèn)情況下,diff 會將差異結(jié)果輸出打印到終端。
- $ diff --unified tea.md tea-revised.md
- --- tea.md 2021-11-13 10:26:25.082110219 +1300
- +++ tea-revised.md 2021-11-13 10:26:32.049110664 +1300
- @@ -1,7 +1,7 @@
- +Warm a teapot in the proving drawer of your oven.
- Boil water.
- -Warm the teapot.
- -Add tea and water to the teapot.
- -Place a tea cosy over the teapot.
- -Steep for 6 minutes.
- +Add tea leaves to a tea strainer.
- +Add strainer and water to teapot.
- +Steep for 6 minutes. Keep it warm with a tea cosy.
- Pour tea into cup.
- -Add milk.
- +Optionally, add warm milk.
在這個差異顯示中,加號 ( + ) 表示添加到原文件中的內(nèi)容,而減號 ( - ) 表示刪除或更改的行。
根據(jù)差異創(chuàng)建patch文件
現(xiàn)在我們有了兩份代碼的差異部分了,我們可以根據(jù)差異生成補丁文件。patch 文件的生成很簡單,只需要使用標(biāo)準(zhǔn) Bash 重定向?qū)?diff 命令的結(jié)果輸出就行了:
- $ diff -u tea.md tea-revised.md > tea.patch
該文件的內(nèi)容與輸出到終端的內(nèi)容完全相同,我們可以使用 cat 或 vim 命令來查看這個文件。說個題外話,使用 Emacs 工具來查看的話,它會根據(jù)每行是被添加還是被減去來對每一行使用顏色區(qū)分,非常直觀。
使用patch文件應(yīng)用更改
當(dāng)我生成好了補丁文件之后,我就可以將它發(fā)給你(QQ/微信,郵件,或者其它方式都行),你就可以將它應(yīng)用到你的舊文件中。
這里我們需要使用 patch 命令應(yīng)用補丁:
- $ patch tea.md tea.patch
應(yīng)用了補丁之后,你就得到了一個與我的版本相同的文件:
- $ cat tea.md
- Warm a teapot in the proving drawer of your oven.
- Boil water.
- Add tea leaves to a tea strainer.
- Add strainer and water to teapot.
- Steep for 6 minutes. Keep it warm with a tea cosy.
- Pour tea into cup.
- Optionally, add warm milk.
隨著開發(fā)的進行,我們會進行多次代碼增減,在這過程中我們可以多次生成補丁并應(yīng)用,然后互相審核,一起為代碼做貢獻。
命令安裝
在 Linux 和 macOS 系統(tǒng)上,已經(jīng)默認(rèn)擁有 diff 和 patch 命令。但在 Windows 系統(tǒng)上就需要自己安裝了,一個簡單的方法就是通過 Cygwin 來獲得這兩個命令。
如果你曾嘗試通過郵件或微信來協(xié)作處理文件,并且發(fā)現(xiàn)自己試圖描述需要進行更改的位置,那么 diff 和 patch 這兩個工具非常適合你,可以省去很多溝通成本。