瞭解 Git 歷程記錄簡化
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Git 歷史簡化可能令人感到非常困惑。 99%, 你甚至不知道它存在, 但偶爾它會跳出 Git 的黑暗角落, 咬你。 在本文中,我們將探索什麼是歷程記錄簡化,以及如何在查看檔案歷程記錄時造成混淆。
讓我們從常見的案例開始:
- 您將變更推送到檔案,然後將變更合併到 main。
- 您的一些同事也會將他們的分支合併到主幹。
- 過了一段時間,您回來後發現您的變更不見了。
- 尋找罪魁禍首,您可以查看檔案歷程記錄並注意...您的變更甚至未列出!
Git 提交歷史是樹形結構。 有時候,時間歷程記錄與實際的檔案樹狀目錄歷程記錄不同。 當合併提交將檔案還原到其原始狀態時,這種情況最常發生。 在此情況下,默認歷程記錄檢視 實際上不會顯示所有變更,因為從技術上說,檔案並未變更。 在此案例中,Git 發現它可以簡化歷程記錄,而且最有可能尋找的「變更」會從記錄中移除。
除非你以前遇到過這種情況,否則你可能會感到沮喪,想知道 我的更動到底去哪裡了?
歷程記錄簡化:默認開啟
預設情況下,針對檔案執行記錄命令:git log file.txt
會自動簡化歷程記錄,可能會隱藏其輸出中的某些提交。 如需詳細資訊,請參閱 Git 記錄人頁面。
造成混淆的是,如果您只是執行 git log
,則歷程記錄簡化不會發生,因為您正在查看所有變更,因此沒有什麼可簡化的。
若要關閉歷程記錄簡化,您必須使用命令列參數 --full-history
。
記錄簡化的範例
為了進一步瞭解簡化的運作方式,我們會建立自己的歷程記錄簡化範例。 首先,讓我們看看我們將要創建的歷史圖表:
如您所見,我們將:
- 建立檔案。
- 在名為「動物」的分支中將一行新增至該檔案。
- 在一個名為 "fruit" 的分支中,將不同的行新增至該檔案。
- 將分支 動物 合併回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公司。 保留所有權利。 本文件是以「as-is」提供的。文件中所表達的資訊和觀點,包括 URL 和其他網頁參考,可能會在沒有通知的情況下變更。 您必須承擔使用本文件的風險。
本文件不會提供您任何 Microsoft 產品中的智慧財產權的法律權利。 您可以複製和使用本文件,以參考為目的供內部使用。