共用方式為


瞭解 Git 歷程記錄簡化

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

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

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

  1. 您將變更推送到檔案,然後將變更合併到 main。
  2. 您的一些同事也會將他們的分支合併到主幹。
  3. 過了一段時間,您回來後發現您的變更不見了。
  4. 尋找罪魁禍首,您可以查看檔案歷程記錄並注意...您的變更甚至未列出!

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

除非你以前遇到過這種情況,否則你可能會感到沮喪,想知道 我的更動到底去哪裡了?

歷程記錄簡化:默認開啟

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

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

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

記錄簡化的範例

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

Git 分支

如您所見,我們將:

  1. 建立檔案。
  2. 在名為「動物」的分支中將一行新增至該檔案。
  3. 在一個名為 "fruit" 的分支中,將不同的行新增至該檔案。
  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公司。 保留所有權利。 本文件是以「as-is」提供的。文件中所表達的資訊和觀點,包括 URL 和其他網頁參考,可能會在沒有通知的情況下變更。 您必須承擔使用本文件的風險。

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