git 中的非破壞性操作

2021-08-08 12:07:01 字數 2173 閱讀 4315

如果你學習過 python 程式語言,你可能會知道,python 為列表內建了乙個排序方法。

lst = [3, 1, 2]

lst.sort()

這個例子中,list.sort() 方法可以將列表內的元素按照從小到大的順序排序。但是,跟其它大多數操作不同,list.sort() 沒有返回值,或者返回的是 none。它將排序的結果直接儲存在 lst 中。

出於效能上的考慮,list.sort() 直接修改要排序的列表。在計算機語言裡,這種方法叫做破壞性方法。在使用破壞性方法前,我們需要提醒自己,以免人為引入 bug。

git 中的破壞性操作與此類似。在 git 中,我們自己的檔案組成了工作區(workspace),git 為跟蹤檔案版本,維護索引(index)和提交歷史。破壞性操作指的是會影響工作區內容的操作。

為什麼需要區分破壞性操作和非破壞性操作呢?

這種操作主要應對對線上做重大修改的場景。在我們自己的機器上,怎麼改都不是很重要。但是,當涉及到線上操作,就不能有一點差錯,否則,後果將不堪設想。這時,我們就需要確切知道,哪些操作執行後會修改線上的檔案,以免千萬不必要的損失。

後面我們會找乙個例項來更深入地理解一下。

首先,檢視類的操作是非破壞性的,比如檢視狀態(git status)、檢視某個物件(git cat-file -p object)、檢視提交歷史(git log)。

其次,只修改 git 檔案的操作也是非破壞性的。包括修改索引和修改提交歷史的操作。

這裡我們重點說一下 reset 操作。git reset 是我們在操作線上時非常重要的乙個命令,它可以幫我們重置 head、索引或工作區到某個狀態,即可以將 head 指向某個提交、將索引設定為某次提交的索引或修改檔案到某次提交。

需要注意一下,git reset –soft 和 git reset –mixed 是非破壞性操作,而 git reset –hard 會修改工作區,屬於存壞性操作。

這是根據一次實際的線上遷移抽象出來的乙個例子。

假設我們有下面的目錄結構:

.

└── new

-root

└── old-root

├── .git <==== 倉庫目錄

└── data

├── letter.txt

└── number.txt

其中,old-root 是我們當前的倉庫根目錄,而我們的目標是將倉庫根目錄移動到上一層,並保持所有的實體檔案不變,以確保不會影響到線上執行。

遷移完後目錄結構是下面這個樣子:

.

└── new

-root

├── .git <==== 新的倉庫目錄

└── old-root

└── data

├── letter.txt

└── number.txt

可行的辦法是,直接將原來的 .git 公升級,並將其移動到上層目錄。

使用這個方案,我們需要分三步。

第一步,使用乙個臨時性倉庫將遠端目錄結構改為新的目錄結構,並將該修改 fetch 到線上。

第二步,將 .git 目錄移動到上一層。

第三步,將索引和提交歷史重置為最新的狀態。

# 第一步

git clone old-root/remote.git tmp # 轉殖乙個臨時倉庫

cd tmp

mkdir old-root

mv data old-root

git add .

git commit -m "fix dir structure"

git push origin master:master # 將新目錄結構推送到遠端

cd$prod/new-root/old-root

git fetch # 將新結構 fetch 到線上 <====

# 第二步

mv .git ../ # 將 .git 倉庫檔案移動到新的倉庫根目錄 <====

# 第三步

cd ..

git reset origin/master # 修改索引和提交歷史到新結構 <====

到此,我們的目的就已經達到了。

壓力測試就是一種破壞性的效能測試

對效能測試 負載測試和強度測試比較混淆。沒錯,這三個概念是比較容易使人糊塗。負載測試和強度測試,都屬於效能測試的子集。下面舉個跑步的例子進行解釋。效能測試,表示在乙個給定的基準下,能執行的最好情況。例如,在沒有負重的情況下,你跑100公尺需要花多少時間 這邊,沒有負重是基準 負載測試,也是效能測試,...

克里斯坦森的破壞性創新 《可以量

內容提要 消費者對商品的需求焦點會隨著商品的發展而從功能性到可靠性,到便利性,最後轉移到 克萊頓 克里斯坦森 clayton m.christensen 所創造的破壞性創新就是指消費者需求焦點的轉移,最開始成功的企業是商品功能最好的企業,但隨著商品功能的發展超過了主流消費者的需求時,功能的進步不會再...

壓力測試就是一種破壞性的效能測試

壓力測試stresstest是在一定的負荷條件下,長時間連續執行系統給系統效能造成的影響。負載測試loadtest 在一定的工作負荷下,給系統造成的負荷及系統響應的時間。壓力測試主要是為了發現在一 任意 定條件下軟體系統的效能的變化情況,通過改變應用程式的輸入以對應用程式施加越來越大的負載 併發,迴...