Vraag Hoe kan ik alle lokale wijzigingen in het door Git beheerde project terugzetten naar de vorige staat?


Ik heb een project waarin ik rende git init. Na verschillende commits, deed ik het git status die me vertelde dat alles up-to-date was en dat er geen lokale veranderingen waren.

Toen maakte ik verschillende opeenvolgende veranderingen en realiseerde ik me dat ik alles weg wilde gooien en terug wilde naar mijn oorspronkelijke staat. Zal dit commando het voor mij doen?

git reset --hard HEAD

1544
2017-07-18 07:52


oorsprong


antwoorden:


Als u wijzigingen in uw werkkopie wilt herstellen, doet u dit:

git checkout .

Als u de wijzigingen in de index (d.w.z. die u hebt toegevoegd) wilt terugdraaien, doet u dit. Als je dit waarschuwt, worden al je niet-geblokkeerde commits opnieuw ingesteld om te beheersen!:

git reset

Als u een wijziging wilt terugdraaien die u hebt vastgelegd, doet u het volgende:

git revert <commit 1> <commit 2>

Als u niet-traceerde bestanden (bijvoorbeeld nieuwe bestanden, gegenereerde bestanden) wilt verwijderen:

git clean -f

Of niet-gevonden mappen (bijvoorbeeld nieuwe of automatisch gegenereerde mappen):

git clean -fd

2808
2017-07-18 07:57



Opmerking: misschien wilt u ook uitvoeren

git clean -fd

als

git reset --hard

zullen niet verwijder niet-gevonden bestanden, waarbij git-clean bestanden uit de bijgehouden root-map verwijdert die niet onder git-tracking staan. WAARSCHUWING - ZORG ERVOOR VOOR DEZE! Het is handig om eerst een dry-run uit te voeren met git-clean om te zien wat het zal verwijderen.

Dit is ook bijzonder handig wanneer u de foutmelding krijgt

~"performing this command will cause an un-tracked file to be overwritten"

Dat kan gebeuren bij het doen van verschillende dingen, het ene bij het bijwerken van een werkkopie wanneer jij en je vriend beiden een nieuw bestand met dezelfde naam hebben toegevoegd, maar hij heeft het eerst vastgelegd in bronbeheer en je geeft er niet om om je niet-ondertekende kopie te verwijderen .

In deze situatie helpt het uitvoeren van een dry run u ook een lijst met bestanden die worden overschreven.


334
2017-07-20 05:37



Als u alle wijzigingen wilt terugdraaien EN op de hoogte wilt zijn van de huidige externe master (u ziet bijvoorbeeld dat de hoofd HEAD naar voren is verplaatst sinds u deze vertakt en uw push wordt 'afgewezen') die u kunt gebruiken

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

58
2018-04-22 20:48



Kijk naar git-reflog. Het zal een lijst maken van alle staten die het onthoudt (standaard is 30 dagen), en je kunt gewoon degene die je wilt afrekenen. Bijvoorbeeld:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

47
2017-07-19 12:16



Re-kloon

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  Verwijdert lokale, niet-gepushte commits
  •  Wijzigingen in bewerkte bestanden worden hersteld
  •  Herstelt de bijgehouden bestanden die u hebt verwijderd
  •  Verwijdert bestanden / mappen die worden vermeld in .gitignore (zoals build-bestanden)
  •  Verwijdert bestanden / mappen die niet worden gevolgd en niet worden gebruikt .gitignore
  •  Je zult deze benadering niet snel vergeten
  •  Verkwist bandbreedte

Hieronder volgen andere opdrachten die ik dagelijks vergeet.

Reinig en reset

git clean -f -d -x
git reset --hard
  •  Verwijdert GEEN lokale, niet-gepushte commits
  •  Wijzigingen in bewerkte bestanden worden hersteld
  •  Herstelt de bijgehouden bestanden die u hebt verwijderd
  •  Verwijdert bestanden / mappen die worden vermeld in .gitignore (zoals build-bestanden)
  •  Verwijdert bestanden / mappen die niet worden gevolgd en niet worden gebruikt .gitignore

Schoon

git clean -f -d -x
  •  Verwijdert GEEN lokale, niet-gepushte commits
  •  Retourneert NIET de wijzigingen die u hebt aangebracht in bijgehouden bestanden
  •  Herstelt GEEN bijgehouden bestanden die u heeft verwijderd
  •  Verwijdert bestanden / mappen die worden vermeld in .gitignore (zoals build-bestanden)
  •  Verwijdert bestanden / mappen die niet worden gevolgd en niet worden gebruikt .gitignore

Reset

git reset --hard
  •  Verwijdert GEEN lokale, niet-gepushte commits
  •  Wijzigingen in bewerkte bestanden worden hersteld
  •  Herstelt de bijgehouden bestanden die u hebt verwijderd
  •  Verwijdert bestanden / mappen die worden vermeld in .gitignore (zoals build-bestanden)
  •  Verwijdert GEEN bestanden / mappen die niet worden gevolgd en niet worden verwijderd .gitignore

Notes

Testcase voor het bevestigen van al het bovenstaande (gebruik bash of sh):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Zie ook

  • git revert om nieuwe commits te maken die eerdere commits ongedaan maken
  • git checkout om terug te gaan in de tijd naar eerdere commits (mogelijk moet eerst worden uitgevoerd boven opdrachten)
  • git stash hetzelfde als git reset hierboven, maar je kunt het ongedaan maken

40
2018-03-20 12:37



GEVAAR VOORUIT: (lees de opmerkingen.) Het uitvoeren van de in mijn antwoord voorgestelde opdracht kan mogelijk meer verwijderen dan u wilt)

om alle bestanden inclusief mappen die ik moest uitvoeren volledig te verwijderen

git clean -f -d

34
2017-09-11 07:10



Na het lezen van een heleboel antwoorden en het uitproberen van deze antwoorden, heb ik verschillende randgevallen gevonden die soms betekenen dat ze de werkkopie niet volledig opruimen.

Hier is mijn huidige bash-script om het te doen, dat werkt de hele tijd.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Uitvoeren van root-map voor werkkopie.


34
2018-06-04 07:25



zeg gewoon

git stash

het zal al je lokale chages verwijderen. en je kunt het ook later gebruiken door te zeggen

git stash apply 

29
2018-04-24 12:18



Ik ontmoette een soortgelijk probleem. De oplossing is om te gebruiken git log om op te zoeken welke versie van de lokale commit verschilt van de afstandsbediening. (Bijvoorbeeld de versie is 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Gebruik dan git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec om de wijziging ongedaan te maken.


26
2017-08-28 07:34



U hoeft niet noodzakelijkerwijs uw werk / bestanden in uw werkmap te / moeten opslaan, maar hoeft ze in plaats daarvan gewoon volledig kwijt te raken. Het bevel git clean zal dit voor je doen.

Enkele veelvoorkomende use-cases om dit te doen zijn verwijder cruft die is gegenereerd door samenvoegingen of externe hulpprogramma's of andere bestanden verwijdert, zodat u een schone build kunt uitvoeren.

Houd er rekening mee dat u heel voorzichtig wilt zijn met deze opdracht, omdat deze is ontworpen om bestanden uit uw lokale werkmap te verwijderen die NIET GETOOND zijn. als je na het uitvoeren van deze opdracht plotseling van gedachten verandert, is er geen weg terug om de inhoud van de verwijderde bestanden te zien. Een alternatief dat veiliger is, is om uit te voeren

git stash --all 

die alles zal verwijderen, maar alles in een voorraad opslaan. Deze stash kan dan later worden gebruikt.

Als u echter echt alle bestanden wilt verwijderen en uw werkdirectory wilt opschonen, moet u deze uitvoeren

git clean -f -d

Hiermee verwijdert u alle bestanden en ook submappen die geen items hebben als gevolg van de opdracht. Een slim ding om te doen voor het uitvoeren van de git clean -f -d opdracht moet worden uitgevoerd

git clean -f -d -n

die je een voorbeeld laat zien van wat er na het uitvoeren zal worden verwijderd git clean -f -d

Dus hier is een samenvatting van je opties van meest agressief tot minst agressief


Optie 1: Verwijder alle bestanden lokaal (Meest agressief)

git clean -f -d

Optie 2: Voorbeeld van de bovenstaande impact bekijken (Voorbeeld van meest agressieve)

git clean -f -d -n

Optie 3: Bewaar alle bestanden (minst agressief)

`git stash --all` 

6
2018-06-14 22:31