Informace o zjednodušení historie Gitu

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Zjednodušení historie Gitu může být matoucí zvíře. 99 % času nebudete ani vědět, že existuje, ale občas to vyskočí z tmavých rohů Gitu a kousne vás. V tomto článku prozkoumáme, co je zjednodušení historie a jak může způsobit nejasnosti při prohlížení historie souborů.

Začněme běžným scénářem:

  1. Změny nasdílíte do souboru a pak tuto změnu sloučíte do hlavního souboru.
  2. Někteří vaši kolegové také sloučí své větve s hlavními větvemi.
  3. Později se vrátíte a všimnete si, že změny chybí.
  4. Hledáte viník, můžete se podívat na historii souborů a všimněte si... vaše změny nejsou ani uvedené!?

Historie potvrzení Gitu je strom. V některých případech není chronologická historie stejná jako skutečná historie stromové struktury souborů. K této situaci nejčastěji dochází, když potvrzení sloučení vrátí soubor zpět do původního stavu. V takovém případě se ve výchozím zobrazení historie ve skutečnosti nezobrazí všechny změny, protože technicky vzato se soubor nezměnil. V tomto scénáři Git zjistí, že může zjednodušit historii a "změny", které pravděpodobně hledáte, se z protokolu odeberou.

Pokud jste na to ještě narazili, můžete se stát frustrovanými, divíte se, kam to sakra udělalo moje změny?

Zjednodušení historie: Ve výchozím nastavení zapnuto

Ve výchozím nastavení spuštění příkazu protokolu v souboru: git log file.txt automaticky zjednoduší historii, případně skryje některá potvrzení z výstupu. Další informace najdete na stránce pro správce protokolů Gitu.

Co přidává nejasnosti, je, že zjednodušení historie neproběhne, pokud právě spustíte git log, protože se díváte na všechny změny, které by se neměly zjednodušit.

Pokud chcete vypnout zjednodušení historie, musíte použít přepínač --full-historypříkazového řádku .

Příklad zjednodušení historie

Abychom lépe pochopili, jak zjednodušení funguje, vytvoříme vlastní příklad zjednodušení historie. Nejprve se podíváme na diagram historie, který vytvoříme:

Větve Gitu

Jak vidíte, chystáme se:

  1. Vytvořte soubor .
  2. Přidejte do souboru řádek ve větvi (zvířata).
  3. Přidejte do souboru jiný řádek v jiné větvi (ovoce).
  4. Sloučit větev zvířat zpět do hlavní.
  5. Sloučit větev ovoce zpět do hlavní a zvolit celou kopii souboru z větve ovoce.
  6. Zkontrolujte historii souboru.

Git nám zjednoduší historii. Krok 5 je tady klíčem. Všechny změny z větve zvířat jsme ignorovali. Git si všimne, že se náš soubor v podstatě nezměnil mezi krokem 1 a krokem 5, takže se zobrazí jenom dvě položky historie.

Nejprve vytvoříme soubor a přidáme ho do našeho úložiště:

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

Teď se rozhodneme k souboru ve větvi zvířat připojit text "donkeys":

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

Při experimentování se rozhodneme, že chceme místo toho jít s ovocem v souboru, takže vytvoříme jinou větev a místo toho připojíme text "banány":

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

Pocit, že jsme spokojení s našimi změnami, rozhodli jsme se sloučit větev zvířat zpět do hlavní:

> git checkout main
> git merge animals

Teď se podívejme na protokol pro náš test.txt soubor:

> 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

Zatím tak dobře, že? Nic nevypadá z obyčejného výstupu protokolu. Teď řekněme, že jsme změnili názory a rozhodli jsme se sloučit naši ovocnou větev:

>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, konflikt při slučování. Po nějakém zvážení se rozhodneme použít celý test.txt soubor z naší větve ovoce. Obvykle byste použili nějaký textový editor nebo slučovací nástroj, ale celý soubor vytvoříme znovu, protože je to jenom dva řádky:

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

Teď se podíváme na historii našeho test.txt souboru:

> 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

Samozřejmě, že nevidíme žádné změny z našeho prvního experimentu v protokolu, ani nevidíme sloučení! Jsou tam pořád? Odstranil Git změny zcela?

> git log --full-history test.txt

Jak vidíte, i když se protokol zjednodušil bez příznaku full-history , Git zachoval všechny naše změny:

> 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

Souhrn zjednodušení historie Gitu

Zjednodušení historie spočívá v tom, že většinu času si ji nikdy nevšimnete. Ale když dojde ke konfliktu při slučování a chcete vědět, co se stalo, můžete se podívat na historii protokolů Gitu a přemýšlet o tom, kam se vaše změny dostaly.

Teď, místo toho, abyste se zpanikařili, víte, že:

  • Zjednodušení historie souborů je ve výchozím nastavení zapnuté.
  • Příznak --full-history vám poskytne komplexnější historii souborů.

Aktualizace: Protože jsem napsal tento článek, služba Azure DevOps Services zavedla řadu úžasných možností prohlížení historie na webu. To znamená, že pokud nechcete procházet protokolování přes příkazový řádek, můžete jednoduše načíst soubor, pro který chcete zobrazit historii v průzkumníkovi, a zobrazí se následující filtr historie, ve kterém můžete zadat jednoduchá zobrazení historie nebo zobrazení historie, která nejsou jednoduchá:

Filtry Gitu

c) 2016 Microsoft Corporation. Všechna práva vyhrazena. Tento dokument je k dispozici tak, jak je. Informace a zobrazení vyjádřená v tomto dokumentu, včetně adres URL a jiných odkazů na internetové weby, se mohou bez předchozího upozornění změnit. Riziko spojené s jejich použitím nesete vy.

Tento dokument vám neposkytuje žádná zákonná práva na duševní vlastnictví, které je součástí jakéhokoli produktu společnosti Microsoft. Tento dokument můžete kopírovat a používat pro své interní referenční účely.