分享方式:


了解 Git 歷程記錄簡化

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Git 歷程記錄簡化可能是令人困惑的野獸。 99% 的時間, 你甚至不知道它存在, 但偶爾它會跳出 Git 的黑暗角落, 咬你。 在本文中,我們將探索什麼是歷程記錄簡化,以及如何在查看檔案歷程記錄時造成混淆。

讓我們從常見的案例開始:

  1. 您會將變更推送至檔案,然後將變更合併為main。
  2. 您的部分同事也會將其分支合併至main。
  3. 您稍後會回來,並注意到您的變更遺失。
  4. 尋找罪魁禍首,您可以查看檔案歷程記錄並注意...您的變更甚至未列出!

Git 認可歷程記錄是樹狀結構。 有時候,時間歷程記錄與實際的檔案樹狀目錄歷程記錄不同。 當合併認可將檔案還原回其原始狀態時,這種情況最常發生。 在此情況下,默認歷程記錄檢視 實際上不會顯示所有變更,因為從技術上說,檔案並未變更。 在此案例中,Git 發現它可以簡化歷程記錄,而且最有可能尋找的「變更」會從記錄中移除。

除非你以前遇到過它,否則你可能會感到沮喪,想知道 我的變化在哪裡?

歷程記錄簡化:默認開啟

根據預設,在檔案上執行記錄命令: git log file.txt 會自動簡化歷程記錄,可能會隱藏其輸出中的某些認可。 如需詳細資訊,請參閱 Git 記錄人頁面

造成混淆的是,如果您只是執行 git log,則歷程記錄簡化不會發生,因為您正在查看所有變更,因此沒有什麼可簡化的。

若要關閉歷程記錄簡化,您必須使用命令列參數 --full-history

記錄簡化的範例

為了進一步瞭解簡化的運作方式,我們會建立自己的歷程記錄簡化範例。 首先,讓我們看看我們將建立的歷程記錄圖表:

Git 分支

如您所見,我們將:

  1. 建立 檔案。
  2. 在分支中將一行新增至該檔案(動物)。
  3. 在另一個分支中,將另一行新增至該檔案(水果)。
  4. 將分支 動物 合併回main。
  5. 將分支 水果 合併回main,然後從水果分支選擇檔案的整個複本。
  6. 檢查檔案的歷程記錄。

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 已在網路上引進許多令人敬畏的歷程記錄檢視選項。 這表示,如果您不想透過命令行進行記錄,您可以直接提取您想要在總管中檢視歷程記錄的檔案,而且您會看到下列歷程記錄篩選,您可以在其中指定簡單或非簡單歷程記錄檢視:

Git 篩選

(c) 2016 Microsoft Corporation. 著作權所有,並保留一切權利。 本檔提供「依目前」提供。本檔所表達的信息和檢視,包括 URL 和其他因特網網站參考,可能會變更而不通知。 您必須承擔使用本文件的風險。

本文件不提供您任何 Microsoft 產品之任何智慧財產權的任何法律權利。 您可以複製和使用本文件,以參考為目的供內部使用。