Git: Hoe heen en weer bewegen tussen commits

Ik heb een newbie-vraag over Git:

Ik moet heen en weer gaan in de geschiedenis van een filiaal.
Dat betekent dat ik alle bestanden in de staat moet krijgen waarin ze zich in een oude revisie bevonden, en dan moet ik teruggaan naar de laatste staat in de repository. Ik hoef me niet te binden.

Met SVN zou het zijn

svn up -r800

om naar revisie 800 te gaan, en

svn up

om synchroon te lopen met de repository.

Ik ken de hash van de commit waar ik op terug wil komen, dus ik heb het geprobeerd

git reset <hash>

wat me daar lijkt te brengen. Maar toen probeerde ik

git pull

maar dat klaagt over conflicten.

Dus wat is de juiste manier om door de geschiedenis van het filiaal te bladeren?

Ik denk in termen van SVN, dus aarzel niet om me op een leuke tutorial te wijzen. Merk op dat ik al heb gecontroleerd op http://git.or.cz/course/svn.htmlen http://www.youtube.com/watch?v=8dhZ9BXQgc4.

Bedankt, Ondra.


Antwoord 1, autoriteit 100%

Nou, ik ben ook een voormalige svn-gebruiker en gebruik nu git voor al mijn projecten.

Als je git gebruikt, moet je de manier van denken veranderen van de client-server-architectuur die in svn wordt gebruikt. In svn heeft elke wijziging een verbinding met de server nodig. Als je git gebruikt, staat je repo in de werkmap. Je hebt niet voor elke repo-actie een verbinding nodig.

Gebruik alleen git pushen git pullom te synchroniseren met repo. Zie het als het gebruik van rsync of een andere back-upoplossing, om ervoor te zorgen dat twee plaatsen exact dezelfde inhoud hebben. Net zoals u een externe back-up harde schijf aansluit, maakt u vervolgens de inhoud ervan hetzelfde met de inhoud in uw hoofd. Dat is het gebruik van git pullen git push.

Als je gewoon heen en weer wilt gaan in de geschiedenis, doe dat dan met git checkout. Zie de revisie-ID met behulp van git history. Als je Linux gebruikt, gebruik dan gitkom de revisieboom te zien. In Windows kan tortoise git het weergeven met behulp van een revisiegrafiek.

Gebruik git checkout masterom terug te gaan naar de laatste revisie. Voordat je een commando uitvoert, moet je jezelf altijd git statuslaten doen. Deze opdracht geeft alles weer wat u moet weten over de huidige repo-conditie en welke actie u moet doen om het goed te maken. Voordat u git pullen git pushdoet, is het beter om ervoor te zorgen dat het resultaat van git statusde tekst working directory clean.

Als je een bestand moet terugzetten naar de vorige revisie, kun je dat doen met git merge. Voordat je het met een bestand doet, moet je het eerst testen met git diff. Bijvoorbeeld: git diff rev1:rev2 filename. Het zal een verschil tussen twee revisies afdrukken. Wijziging in rev1 zal worden vervangen door de wijzigingen in rev2. Dus om terug te keren, zal rev2 ouder zijn dan rev1. Nadat je tevreden bent met het diff-resultaat, doe het dan met git merge, vervang gewoon diffdoor merge, alle andere parameters blijven hetzelfde.

Ik hoop dat dit je helpt. De belangrijkste sleutel is om te zien dat uw werkmap uw repo is. Als u dit begrijpt, kunt u git optimaal gebruiken. Veel succes.


Antwoord 2, autoriteit 56%

Je kunt git checkoutgebruiken om elke commit uit te checken en deze vervolgens te gebruiken met een branchnaam om terug te gaan naar een genoemde branch.

git checkoutmet een commit-ID en niet een branch-naam, verplaatst je van elke benoemde branch naar wat bekend staat als een detached head.

Als je git resetgebruikt, dan zal het je branch zelf terug naar een oude staat verplaatsen, waardoor de recentere commits worden verweesd, wat waarschijnlijk niet is wat je wilt.


Antwoord 3, autoriteit 44%

De andere antwoorden zijn informatief, maar ik denk dat dit het dichtst in de buurt komt van wat de OP wil:

Voeg deze twee functies toe aan je ~/.bashrc:

# checkout prev (older) revision
git_prev() {
    git checkout HEAD~
}
# checkout next (newer) commit
git_next() {
    BRANCH=`git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq`
    HASH=`git rev-parse $BRANCH`
    PREV=`git rev-list --topo-order HEAD..$HASH | tail -1`
    git checkout $PREV
}

Gebruik:

$ git_prev
Previous HEAD position was 7042c8a... Commit message2
HEAD is now at d753ecc... Commit message1
$ git_next
Previous HEAD position was d753ecc... Commit message1
HEAD is now at 7042c8a... Commit message2

Opmerking: deze commando’s voeren altijd losstaande HEADstaat. Als je git_preven dan git_nextvan een momenteel uitgecheckte branch, kom je terug bij de laatste revisie, maar je zult in de vrijstaande HEAD-status zijn. Doe git checkout BRANCH_NAMEom weer normaal te worden.


Antwoord 4, autoriteit 21%

Probeer git reflog, dit geeft een lijst van commits en checkouts die je hebt gedaan om tussen de commits te wisselen, zelfs de commits die je bent kwijtgeraakt bij het uitchecken naar een eerdere commit.

Dan kun je git checkout <hash of a commit>proberen om naar die commit over te schakelen.

Hopelijk helpt dit!


Antwoord 5, autoriteit 10%

Gebruik

. om een ​​andere versie van een bestand uit te checken

git checkout rev -- filename

Waar revde ID van een commit, de naam van een branch, de naam van een tag of een relatieve versie kan zijn.

Gebruik git log, gitkom te kijken naar versies om te zien welke versie van het bestand je wilt.

Om deze versie van het bestand permanent te maken, moet je het bestand committen: git add filename; git commit filename

Ik zou git pullniet aanraden om versies te onderzoeken omdat het een merge doet — mogelijk je huidige status wijzigend.

Je hoeft in dit geval git resetniet te gebruiken, tenzij je git addeen bestand hebt dat je besluit niet vast te leggen.

Other episodes