Bekijk de wijzigingsgeschiedenis van een bestand met Git-versiebeheer

Hoe kan ik de wijzigingsgeschiedenis van een individueel bestand in Git bekijken, volledige details met wat er is veranderd?

Ik ben zover als:

git log -- [filename]

die me de vastleggingsgeschiedenis van het bestand laat zien, maar hoe kom ik bij de inhoud van elk van de bestandswijzigingen?

Ik probeer de overstap te maken van Microsoft Visual SourceSafeen dat was vroeger een simpele rechtermuisknop → Geschiedenis weergeven.


Antwoord 1, autoriteit 100%

Voor een grafische weergave zou ik gitkgebruiken:

gitk [filename]

Of om bestandsnamen in het verleden te volgen:

gitk --follow [filename]

Antwoord 2, autoriteit 98%

U kunt gebruiken

git log -p filename

om Git de patches voor elk logitem te laten genereren.

Zie

git help log

voor meer opties – het kan veel leuke dingen doen 🙂 Om alleen de diff voor een specifieke commit te krijgen, kun je

git show HEAD

of een andere revisie op id. Of gebruik

gitk

om visueel door de wijzigingen te bladeren.


Antwoord 3, autoriteit 65%

git log --follow -p -- path-to-file

Hiermee wordt de volledigegeschiedenis van het bestand getoond (inclusief de geschiedenis naast hernamen en met diffs voor elke wijziging).

Met andere woorden, als het bestand met de naam bareenmaal is genoemd foo, dan git log -p bar(ZONDER DE --followOptie) toont alleen de geschiedenis van het bestand tot het punt waar het is hernoemd – het zal de geschiedenis van het bestand niet laten zien wanneer het is bekend als foo. Met git log --follow -p bartoont de volledige geschiedenis van het bestand, inclusief wijzigingen in het bestand wanneer deze bekendstond als foo. De optie -pzorgt ervoor dat diffs voor elke wijziging zijn opgenomen.


Antwoord 4, Autoriteit 7%

Als u liever op tekst blijft, wilt u misschien tig .

Snelle installatie:

  • apt : # apt-get install tig
  • homebrew (OS X) : $ brew install tig

Gebruik het om de geschiedenis op één bestand te bekijken: tig [filename]

of blader door de gedetailleerde repository geschiedenis: tig

Het is vergelijkbaar met gitk , maar op tekst gebaseerd. Het ondersteunt kleuren in de terminal!


Antwoord 5, Autoriteit 5%

git whatchanged -p filenameis ook equivalent aan git log -p filenameIn dit geval.

Je kunt ook zien wanneer een specifieke regel code in een bestand is gewijzigd met git blame filename. Dit zal een korte commit-ID, de auteur, tijdstempel en volledige coderegel voor elke regel in het bestand afdrukken.
Dit is erg handig als je een bug hebt gevonden en je wilt weten wanneer deze is geïntroduceerd (of wiens fout het was).


Antwoord 6, autoriteit 4%

Bronboom gebruikers

Als u Sourcetree gebruikt om uw repository te visualiseren (het is gratis en redelijk goed), kunt u met de rechtermuisknop op een bestand klikken en Log Selected

selecteren

Het scherm (hieronder) is veel vriendelijker dan gitken de meeste andere genoemde opties. Helaas is er (op dit moment) geen gemakkelijke manier om deze weergave vanaf de opdrachtregel te starten – de CLI van Sourcetree opent momenteel alleen repositories.


Antwoord 7, autoriteit 3%

Om te laten zien welke revisie en auteur het laatst elke regel van een bestand heeft gewijzigd:

git blame filename

of als je de krachtige schuld-GUI wilt gebruiken:

git gui blame filename

Antwoord 8, autoriteit 2%

Samenvatting van andere antwoorden nadat je ze hebt gelezen en een beetje hebt gespeeld:

De gebruikelijke opdrachtregelopdracht zou zijn

git log --follow --all -p dir/file.c

Maar je kunt ook gitk(GUI) of tig (tekst-UI) gebruiken om geven veel meer voor mensen leesbare manieren om ernaar te kijken.

gitk --follow --all -p dir/file.c
tig --follow --all -p dir/file.c

Onder Debian/Ubuntu, het installatiecommando voor deze mooie tools is zoals verwacht:

sudo apt-get install gitk tig

En ik gebruik momenteel:

alias gdf='gitk --follow --all -p'

zodat ik gewoon gdf dirkan typen om een gerichte geschiedenis van alles in de submap dirte krijgen.


Antwoord 9

Voeg deze alias toe aan je .gitconfig:

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

En gebruik het commando als volgt:

> git lg
> git lg -- filename

De uitvoer ziet er bijna precies hetzelfde uit als de gitk-uitvoer. Geniet ervan.


Antwoord 10

U kunt Visual Studio Code gebruiken met GitLens. Het is een zeer krachtig hulpmiddel.

Nadat je GitLens hebt geïnstalleerd, ga je naar het tabblad GitLens, selecteer je FILE HISTORYen kun je er doorheen bladeren.


Antwoord 11

De laatste tijd ontdekte ik tigen vond het erg handig. In sommige gevallen zou ik willen dat het A of B doet, maar meestal is het best netjes.

In jouw geval is tig <filename>misschien wat je zoekt.

http://jonas.nitro.dk/tig/


Antwoord 12

Ik schreef git-playback voor dit exacte doel

pip install git-playback
git playback [filename]

Dit heeft het voordeel van beide weergave van de resultaten in de opdrachtregel (zoals git log -p) terwijl u ook door elke commit wilt stappen met behulp van de pijltjestoetsen (zoals gitk).


Antwoord 13

U kunt dit ook proberen met de commits die een specifiek onderdeel van een bestand heeft gewijzigd (geïmplementeerd in GIT 1.8.4).

Het geretourneerde resultaat is de lijst met commits die dit specifieke gedeelte heeft gewijzigd. Opdracht:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

Waar UpperLimit het startlijnnummer en de lowerlimit is, is het eindnummer van het bestand.

Meer details zijn op https: //www.technpurohit. com / lijst-sommige-nuttige git-commando’s .


Antwoord 14

of:

gitx -- <path/to/filename>

Als u gitx

gebruikt


Antwoord 15

in de sourcetree ui, kunt u de geschiedenis van een bestand vinden door het ‘log geselecteerde’ te selecteren Optie in het rechterklik contextmenu:

Het zou de geschiedenis van alle commits laten zien.


Antwoord 16

Als u de hele geschiedenis van een bestand wilt zien, inclusief op alle andere filialen gebruiken:

gitk --all <filename>

Antwoord 17

Als je de Git GUIgebruikt (op Windows):

Onder het menu Repository kunt u “Master’s History visualiseren” gebruiken. Markeer een commit in het bovenste paneel en een bestand rechtsonder en je ziet de diff voor die commit linksonder.


Antwoord 18

Met de uitstekende Git-extensiesga je naar een punt in de geschiedenis waar het bestand nog steeds bestond (als het is verwijderd, ga anders gewoon naar HEAD), ga naar het tabblad File tree, klik met de rechtermuisknop op het bestand en kies File history.

Standaard volgt het het bestand bij het hernoemen, en op het tabblad Blamekunt u de naam bij een bepaalde revisie zien.

Het heeft een paar kleine problemen, zoals het tonen van fatal: Not a valid object namein het Viewtabblad bij het klikken op de verwijderingsrevisie, maar daar kan ik mee leven. 🙂


Antwoord 19

SmartGit:

  1. Schakel in het menu in om ongewijzigde bestanden weer te geven: Bekijk / Toon ongewijzigde bestanden
  2. Klik met de rechtermuisknop op het bestand en selecteer ‘Log’ of druk op ‘Ctrl-L’

Antwoord 20

Als je TortoiseGit gebruikt, zou je met de rechtermuisknop op het bestand moeten kunnen klikken en TortoiseGit --> Show Log. Zorg ervoor dat in het venster dat verschijnt:

  • Show Whole Project‘ is niet aangevinkt.

  • All Branches‘ is aangevinkt.


Antwoord 21

Het antwoord dat ik zocht was er niet. Het was om veranderingen te zien in bestanden die ik had voorbereid om vast te leggen. D.w.z.

git diff --cached

Antwoord 22

git diff -U <filename>geeft je een uniform diff.

Er moet worden gekleurd op rood en groen. Als het niet, uit te voeren:. git config color.ui autoeerste


Antwoord 23

Als u gebruik maakt van Eclipse met de Git plugin, het heeft een uitstekend vergelijkend overzicht met de geschiedenis. Klik met de rechtermuisknop op het bestand en kies “vergelijken met” → “Geschiedenis”.


Antwoord 24

Ik ben waarschijnlijk over waar de OP was toen dit begon, op zoek naar iets eenvoudig dat mij zou laten gebruiken git difftool met vimdiff om Wijzigingen van bestanden in mijn repo uitgaande van een specifieke plegen. Ik was niet al te blij met de antwoorden die ik was het vinden van, dus ik samen gooide this git inc remental rep orter (gitincrep) script en het is nuttig geweest voor mij:

#!/usr/bin/env bash
STARTWITH="${1:- }"
shift 1
DFILES=( "$@" )
RunDiff()
{
        GIT1=$1
        GIT2=$2
        shift 2
        if [ "$(git diff $GIT1 $GIT2 "$@")" ]
        then
                git log ${GIT1}..${GIT2}
                git difftool --tool=vimdiff $GIT1 $GIT2 "$@"
        fi
}
OLDVERS=""
RUNDIFF=""
for NEWVERS in $(git log --format=format:%h  --reverse)
do
        if [ "$RUNDIFF" ]
        then
                RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
        elif [ "$OLDVERS" ]
        then
                if [ "$NEWVERS" = "${STARTWITH:=${NEWVERS}}" ]
                then
                        RUNDIFF=true
                        RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
                fi
        fi
        OLDVERS=$NEWVERS
done

Aangeroepen zonder argumenten, dit begint vanaf het begin van de repo-geschiedenis, anders begint het met de afgekorte commit-hash die je opgeeft en gaat het verder naar het heden – je kunt op elk moment ctrl-C gebruiken om af te sluiten. Alle argumenten na de eerste zullen de verschilrapporten beperken tot alleen de bestanden die tussen die argumenten worden vermeld (wat volgens mij is wat de OP wilde, en ik zou het aanbevelen voor alles behalve kleine projecten). Als u wijzigingen in specifieke bestanden controleert enopnieuw wilt beginnen, moet u een lege tekenreeks voor arg1 opgeven. Als je geen vim-gebruiker bent, kun je vimdiffvervangen door je favoriete diff-tool.

Het gedrag is om de commit-opmerkingen uit te voeren wanneer relevante wijzigingen worden gevonden en vimdiff-runs aan te bieden voor elk gewijzigd bestand (dat is git difftool-gedrag, maar het werkt hier).

Deze benadering is waarschijnlijk behoorlijk naïef, maar bij het doornemen van veel van de oplossingen hier en in een verwante post, waren er veel die betrekking hadden op het installeren van nieuwe tools op een systeem waar ik geen beheerderstoegang heb, met interfaces die hun eigen leercurve hadden . Het bovenstaande script deed wat ik wilde zonder daar iets mee te maken te hebben. Ik zal de vele uitstekende suggesties hier bekijken als ik iets geavanceerders nodig heb, maar ik denk dat dit direct aansluit bij de OP.

Other episodes