Ik heb een project waarin ik git init
heb uitgevoerd.
Na verschillende commits deed ik git status
wat 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
- 😀 Je zult deze aanpak niet vergeten
- 😔 Verspilt bandbreedte
staan
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 revert
om nieuwe commits te maken die eerdere ongedaan maken verbindt zichgit checkout
om terug te gaan in de tijd naar vroeger commits (mogelijk moeten eerst bovenstaande commando’s worden uitgevoerd)git stash
hetzelfde alsgit reset
hierboven, 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 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
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 log
te 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 3c74a11530697214cbcc4b7b98bf7a65952a34ec
om de wijziging ongedaan te maken.
Antwoord 10
Ik heb naar een soortgelijk probleem gezocht,
Wilde lokale commits weggooien:
- de repository gekloond (git clone)
- overgeschakeld naar dev branch (git checkout dev)
- heeft weinig commits gedaan (git commit -m “commit 1”)
- 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 clean
zal 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 -d
commando 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.