Hoe zet ik alle lokale wijzigingen in het door Git beheerde project terug naar de vorige staat?

Ik heb een project waarin ik git initheb uitgevoerd.
Na verschillende commits deed ik git statuswat me vertelde dat alles up-to-date was en dat er geen lokale veranderingen waren.

Toen bracht ik verschillende opeenvolgende wijzigingen aan en realiseerde ik me dat ik alles wilde weggooien en terug wilde naar mijn oorspronkelijke staat. Zal dit commando het voor mij doen?

git reset --hard HEAD

Antwoord 1, autoriteit 100%

Als je wijzigingen aan je werkkopie wilt terugdraaien, doe je dit:

git checkout .

Als u wijzigingen aan de index wilt terugdraaien (d.w.z. die u hebt toegevoegd), doet u dit. Waarschuwing dit zal al je niet-geduwde commits naar master resetten!:

git reset

Als je een wijziging die je hebt vastgelegd wilt terugdraaien, doe je dit:

git revert <commit 1> <commit 2>

Als u niet-getrackte bestanden wilt verwijderen (bijv. nieuwe bestanden, gegenereerde bestanden):

git clean -f

Of niet-bijgehouden mappen (bijv. nieuwe of automatisch gegenereerde mappen):

git clean -fd

Antwoord 2, autoriteit 11%

Opmerking: u kunt ook

. uitvoeren

git clean -fd

als

git reset --hard

zal nietniet-getrackte bestanden verwijderen, terwijl git-clean alle bestanden zal verwijderen uit de bijgehouden hoofdmap die niet onder git-tracking staan. WAARSCHUWING – WEES DIT VOORZICHTIG! Het is handig om eerst een test uit te voeren met git-clean, om te zien wat het zal verwijderen.

Dit is ook vooral handig als u de foutmelding krijgt

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

Wat kan gebeuren als je verschillende dingen doet, een daarvan is het bijwerken van een werkkopie wanneer jij en je vriend allebei een nieuw bestand met dezelfde naam hebben toegevoegd, maar hij heeft het eerst vastgelegd in bronbeheer, en je geeft niet om het verwijderen uw niet-getrackte kopie.

In deze situatie zal het uitvoeren van een test u ook helpen om een lijst met bestanden weer te geven die zouden worden overschreven.


Antwoord 3, autoriteit 5%

Opnieuw klonen

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • ✅ Verwijdert lokale, niet-gepushte commits
  • ✅ Zet de wijzigingen die je hebt aangebracht in bijgehouden bestanden terug
  • ✅ Herstelt bijgehouden bestanden die je hebt verwijderd
  • ✅ Verwijdert bestanden/mappen vermeld in .gitignore(zoals buildbestanden)
  • ✅ Verwijdert bestanden/mappen die niet worden bijgehouden en niet in .gitignore
  • staan

  • 😀 Je zult deze aanpak niet vergeten
  • 😔 Verspilt bandbreedte

Hier volgen andere commando’s die ik dagelijks vergeet.

Reinigen en resetten

git clean --force -d -x
git reset --hard
  • ❌ Verwijdert lokale, niet-gepushte commits
  • ✅ Zet de wijzigingen die je hebt aangebracht in bijgehouden bestanden terug
  • ✅ Herstelt bijgehouden bestanden die je hebt verwijderd
  • ✅ Verwijdert bestanden/mappen vermeld in .gitignore(zoals buildbestanden)
  • ✅ Verwijdert bestanden/mappen die niet worden bijgehouden en niet in .gitignore
  • staan

Schoon

git clean --force -d -x
  • ❌ Verwijdert lokale, niet-gepushte commits
  • ❌ Zet de wijzigingen die je hebt aangebracht in bijgehouden bestanden terug
  • ❌ Herstelt bijgehouden bestanden die je hebt verwijderd
  • ✅ Verwijdert bestanden/mappen vermeld in .gitignore(zoals buildbestanden)
  • ✅ Verwijdert bestanden/mappen die niet worden bijgehouden en niet in .gitignore
  • staan

Resetten

git reset --hard
  • ❌ Verwijdert lokale, niet-gepushte commits
  • ✅ Zet de wijzigingen die je hebt aangebracht in bijgehouden bestanden terug
  • ✅ Herstelt bijgehouden bestanden die je hebt verwijderd
  • ❌ Verwijdert bestanden/mappen vermeld in .gitignore(zoals buildbestanden)
  • ❌ Verwijdert bestanden/mappen die niet worden bijgehouden en niet in .gitignore
  • staan


Opmerkingen

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 revertom nieuwe commits te maken die eerdere ongedaan maken verbindt zich
  • git checkoutom terug te gaan in de tijd naar vroeger commits (mogelijk moeten eerst bovenstaande commando’s worden uitgevoerd)
  • git stashhetzelfde als git resethierboven, maar je kunt het ongedaan maken

Antwoord 4, autoriteit 2%

Als u alle wijzigingen ongedaan wilt maken EN up-to-date wilt zijn met de huidige externe master (u merkt bijvoorbeeld dat de master HEAD naar voren is verplaatst sinds u er een vertakking van hebt gemaakt en uw push wordt ‘afgewezen’), kunt u gebruik

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.

Antwoord 5

Kijk in git-reflog. Het zal een lijst maken van alle staten die het onthoudt (standaard is 30 dagen), en u kunt eenvoudig de gewenste 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 [email protected]{0}: HEAD^^: updating HEAD
ae7c2b3 [email protected]{1}: commit: Append e to a
fdf2c5e [email protected]{2}: commit: Append d to a
145c322 [email protected]{3}: commit: Append c to a
363e22a [email protected]{4}: commit: Append b to a
fa26c43 [email protected]{5}: commit: Append foo to a
0a392a5 [email protected]{6}: commit (initial): Add file a
$ git reset --hard [email protected]{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

Antwoord 6

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

Hier is mijn huidige bash-script om het te doen, dat altijd werkt.

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

Uitvoeren vanuit de hoofdmap van de werkkopie.


Antwoord 7

gewoon uitvoeren –

git stash

het zal al uw lokale wijzigingen verwijderen. en je kunt het ook later gebruiken door –

. uit te voeren

git stash apply 

Antwoord 8

GEVAAR VOORUIT: (lees de opmerkingen. Als u de opdracht uitvoert die in mijn antwoord wordt voorgesteld, kan er meer worden verwijderd dan u wilt)

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

git clean -f -d

Antwoord 9

Ik heb een soortgelijk probleem ontmoet.
De oplossing is om git logte gebruiken om op te zoeken welke versie van de lokale commit anders is dan de remote. (De versie is bijvoorbeeld 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Gebruik vervolgens git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ecom de wijziging ongedaan te maken.


Antwoord 10

Ik heb naar een soortgelijk probleem gezocht,

Wilde lokale commits weggooien:

  1. de repository gekloond (git clone)
  2. overgeschakeld naar dev branch (git checkout dev)
  3. heeft weinig commits gedaan (git commit -m “commit 1”)
  4. maar besloten om deze lokale commits weg te gooien om terug te gaan naar remote (origin/dev)

Dat deed het onderstaande ook:

git reset --hard origin/dev

Controleer:

git status  
        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

nu gaan lokale commits verloren, terug naar de oorspronkelijke gekloonde staat, punt 1 hierboven.


Antwoord 11

Het kan zijn dat u uw werk/bestanden niet per se in uw werkdirectory wilt/moet opslaan, maar ze in plaats daarvan volledig wilt verwijderen. Het commando git cleanzal dit voor je doen.

Een veelvoorkomend gebruik om dit te doen is het verwijderen van cruftdat is gegenereerd door samenvoegingen of externe tools, of het verwijderen van andere bestanden zodat je een schone build kunt uitvoeren.

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

git stash --all

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

Als u echter echt alle bestanden wilt verwijderen en uw werkmap wilt opschonen, moet u

uitvoeren

git clean -f -d

Hierdoor worden alle bestanden en ook alle submappen verwijderd die geen items bevatten als gevolg van de opdracht. Een slim ding om te doen voordat je het git clean -f -dcommando uitvoert, is om

uit te voeren

git clean -f -d -n

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

Dus hier is een samenvatting van uw 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 (voorbeeld meest agressief)

git clean -f -d -n

Optie 3: alle bestanden opbergen (minst agressief)

`git stash --all` 

Antwoord 12

Probeer dit om alle niet-vastgelegde wijzigingen in de lokale vestiging terug te draaien

$ git reset --hard HEAD

Maar als u een fout als deze ziet:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

U kunt naar de map ‘.git’ navigeren en vervolgens het index.lock-bestand verwijderen:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Tot slot, voer nogmaals het commando uit:

$ git reset --hard HEAD

Antwoord 13

Hier nog een optie toevoegen.

Ik verwijs naar de titel: lokalewijzigingen terugzetten.
Het kan ook van toepassing zijn op wijzigingen die niet zijn voorbereid om vast te leggen.

In dit geval kunt u het volgende gebruiken:

git restore <file>

Teruggaan naar de vorige staat.


Antwoord 14

Probeer dit als u zich in de bovenste projectdirectory bevindt:

git restore .

Zo niet, gebruik dan:

git restore :/

Als u lokale wijzigingen voor een subset wilt terugdraaien:

  • herstel alle werkende boombestanden met top pathspec magic: git restore :/
  • herstel alle bestanden in de huidige map: git restore .
  • bestandstype (bijv. alle C-bronbestanden): git restore '*.c'

Zie voor details git restore documentatie.

Om niet-getrackte bestanden te verwijderen: git clean -f


Antwoord 15

Deze vraag gaat meer over het resetten/terugzetten van een bredere repository, maar voor het geval je geïnteresseerd bent in het terugdraaien van een individuele wijziging: ik heb hier een soortgelijk antwoord toegevoegd:

https://stackoverflow.com/a/60890371/2338477

Antwoorden op vragen:

  • Individuele wijziging ongedaan maken met of zonder behoud van wijziging in git-geschiedenis

  • Hoe terug te keren naar de oude versie om opnieuw op te starten vanuit dezelfde staat


Antwoord 16

Als je alle wijzigingen wilt verwijderen, ga dan naar git checkout .
Het is de snellere en eenvoudigere.

Other episodes