了解 Git 歷程記錄簡化
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Git 歷程記錄簡化可能是令人困惑的野獸。 99% 的時間, 你甚至不知道它存在, 但偶爾它會跳出 Git 的黑暗角落, 咬你。 在本文中,我們將探索什麼是歷程記錄簡化,以及如何在查看檔案歷程記錄時造成混淆。
讓我們從常見的案例開始:
- 您會將變更推送至檔案,然後將變更合併為main。
- 您的部分同事也會將其分支合併至main。
- 您稍後會回來,並注意到您的變更遺失。
- 尋找罪魁禍首,您可以查看檔案歷程記錄並注意...您的變更甚至未列出!
Git 認可歷程記錄是樹狀結構。 有時候,時間歷程記錄與實際的檔案樹狀目錄歷程記錄不同。 當合併認可將檔案還原回其原始狀態時,這種情況最常發生。 在此情況下,默認歷程記錄檢視 實際上不會顯示所有變更,因為從技術上說,檔案並未變更。 在此案例中,Git 發現它可以簡化歷程記錄,而且最有可能尋找的「變更」會從記錄中移除。
除非你以前遇到過它,否則你可能會感到沮喪,想知道 我的變化在哪裡?
歷程記錄簡化:默認開啟
根據預設,在檔案上執行記錄命令: git log file.txt
會自動簡化歷程記錄,可能會隱藏其輸出中的某些認可。 如需詳細資訊,請參閱 Git 記錄人頁面。
造成混淆的是,如果您只是執行 git log
,則歷程記錄簡化不會發生,因為您正在查看所有變更,因此沒有什麼可簡化的。
若要關閉歷程記錄簡化,您必須使用命令列參數 --full-history
。
記錄簡化的範例
為了進一步瞭解簡化的運作方式,我們會建立自己的歷程記錄簡化範例。 首先,讓我們看看我們將建立的歷程記錄圖表:
如您所見,我們將:
- 建立 檔案。
- 在分支中將一行新增至該檔案(動物)。
- 在另一個分支中,將另一行新增至該檔案(水果)。
- 將分支 動物 合併回main。
- 將分支 水果 合併回main,然後從水果分支選擇檔案的整個複本。
- 檢查檔案的歷程記錄。
Git 將會簡化我們的歷程記錄。 步驟 5 是這裡的索引鍵。 我們忽略了動物分支的所有變化。 Git 會注意到,我們的檔案基本上 並未在步驟 1 和步驟 5 之間變更 ,因此它只會顯示兩 個歷程記錄專案。
首先,我們會建立檔案,並將它新增至存放庫:
> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"
現在,我們決定將文字「驢」附加至動物分支中的檔案:
> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"
在進行實驗時,我們決定也許我們想要改用檔案中的水果,因此我們會建立不同的分支,並在檔案結尾附加文字「香蕉」,改為:
> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"
我們對我們的變化感到滿意,我們決定將動物分支合併回主要:
> git checkout main
> git merge animals
現在讓我們看看檔案 test.txt
的記錄:
> git log test.txt
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
到目前為止,這麼好,對吧? 在我們的記錄輸出中,什麼都不看出一般。 現在,假設我們改變了主意,並決定合併我們的水果分支:
>git merge fruit
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
Uh-oh,合併衝突。 經過一些考慮,我們決定 使用來自水果分支的整個 test.txt
檔案 。 一般而言,您會使用某種文本編輯器或合併工具,但我們只會重新建立整個檔案,因為它只有兩行:
> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"
現在讓我們看看檔案 test.txt
的歷程記錄:
> git log test.txt
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
果然,我們沒有看到記錄檔中第一個實驗的任何變更,也不會看到我們的合併! 他們還在嗎? Git 是否完全排除變更?
> git log --full-history test.txt
如您所見,雖然它已簡化沒有旗標的 full-history
記錄,但 Git 已保留我們的所有變更:
> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
Merge: 6b33d99 fdd4dfd
Date: Mon Feb 15 10:59:34 2016 -0500
Fixed merge conflict
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
Git 歷程記錄簡化摘要
歷史簡化的事情是,你永遠不會注意到它的大部分時間。 但是,當合併衝突發生錯誤,而您想要知道發生了什麼事時,您可能會發現自己查看 Git 記錄歷程記錄,並想知道變更的所在位置。
現在,您不必驚慌失措,而是知道:
- 默認會開啟檔案的歷程記錄簡化
- 旗
--full-history
標會為您提供更完整的檔案歷程記錄
更新:自從我撰寫本文以來, Azure DevOps Services 已在網路上引進許多令人敬畏的歷程記錄檢視選項。 這表示,如果您不想透過命令行進行記錄,您可以直接提取您想要在總管中檢視歷程記錄的檔案,而且您會看到下列歷程記錄篩選,您可以在其中指定簡單或非簡單歷程記錄檢視:
(c) 2016 Microsoft Corporation. 著作權所有,並保留一切權利。 本檔提供「依目前」提供。本檔所表達的信息和檢視,包括 URL 和其他因特網網站參考,可能會變更而不通知。 您必須承擔使用本文件的風險。
本文件不提供您任何 Microsoft 產品之任何智慧財產權的任何法律權利。 您可以複製和使用本文件,以參考為目的供內部使用。