Hoe reset ik mijn lokale vertakking zodat deze net zo is als de vertakking op de externe repository?
Dat deed ik:
git reset --hard HEAD
Maar als ik een git status
uitvoer,
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: java/com/mycompany/TestContacts.java
modified: java/com/mycompany/TestParser.java
Kun je me alsjeblieft vertellen waarom ik deze ‘aangepast’ heb? Ik heb deze bestanden niet aangeraakt? Als ik dat deed, wil ik die verwijderen.
Antwoord 1, autoriteit 100%
Het instellen van uw vertakking zodat deze exact overeenkomt met de vertakking op afstand kan in twee stappen worden gedaan:
git fetch origin
git reset --hard origin/master
Update @2020 (als u main
branch heeft in plaats van master
in remote repo)
git fetch origin
git reset --hard origin/main
Als u de status van uw huidige filiaal wilt opslaan voordat u dit doet (voor het geval dat), kunt u het volgende doen:
git commit -a -m "Saving my work, just in case"
git branch my-saved-work
Je werk is nu opgeslagen in de tak "mijn-opgeslagen-werk" voor het geval je besluit dat je het terug wilt (of het later wilt bekijken of het wilt vergelijken met je bijgewerkte branch).
Merk op dat in het eerste voorbeeld wordt aangenomen dat de naam van de externe repo “oorsprong” is. en dat de branch genaamd "master" in de externe repo komt overeen met de momenteel uitgecheckte branch in uw lokale repo.
Trouwens, deze situatie waarin je je bevindt lijkt erg veel op een veelvoorkomend geval waarbij een push is gedaan naar de momenteel uitgecheckte tak van een niet-kale repository. Heb je onlangs in je lokale repo gepusht? Als dat niet het geval is, hoeft u zich geen zorgen te maken — iets anders moet ervoor hebben gezorgd dat deze bestanden onverwacht zijn gewijzigd. Anders moet u zich ervan bewust zijn dat het niet wordt aanbevolen om naar een niet-bare repository te pushen (en niet in het bijzonder naar de momenteel uitgecheckte branch).
Antwoord 2, autoriteit 6%
Ik moest doen (de oplossing in het geaccepteerde antwoord):
git fetch origin
git reset --hard origin/master
Gevolgd door:
git clean -f
om lokale bestanden te verwijderen
Om te zien welke bestanden worden verwijderd (zonder ze daadwerkelijk te verwijderen):
git clean -n -f
Antwoord 3, autoriteit 5%
Gebruik eerst git reset om te resetten naar de eerder opgehaalde HEAD
van de corresponderende stroomopwaartse tak:
git reset --hard @{u}
Het voordeel van het specificeren van @{u}
of de uitgebreide vorm @{upstream}
is dat de naam van de externe repo en vertakking niet expliciet hoeft te zijn gespecificeerd. Geef in Windows of met PowerShell "@{u}"
op (met dubbele aanhalingstekens).
Gebruik vervolgens, indien nodig, git clean om niet-getrackte bestanden te verwijderen, optioneel ook met -x
:
git clean -df
Ten slotte, indien nodig, de laatste wijzigingen ophalen:
git pull
Antwoord 4, autoriteit 2%
git reset --hard HEAD
reset eigenlijk alleen naar de laatst vastgelegde status. In dit geval verwijst HEAD naar de HEAD van uw filiaal.
Als je meerdere commits hebt, zal dit niet werken..
Wat u waarschijnlijk wilt doen, is resetten naar het hoofd van de oorsprong of hoe uw externe repository ook wordt genoemd. Ik zou waarschijnlijk gewoon iets doen als
git reset --hard origin/HEAD
Wees echter voorzichtig. Harde resets kunnen niet eenvoudig ongedaan worden gemaakt. Het is beter om te doen wat Dan suggereert, en een kopie van je wijzigingen af te takken voordat je opnieuw instelt.
Antwoord 5
Al het bovenstaande is juist, maar om je project echt te resetten, moet je ook vaak bestanden verwijderen die in je .gitignore
staan.
Om het morele equivalent te krijgen van het wissen van uw projectdirectory en opnieuw klonen vanaf de afstandsbediening is:
git fetch
git reset --hard
git clean -x -d -f
Waarschuwing: git clean -x -d -f
is onomkeerbaar en u kunt bestanden en gegevens verliezen (bijv. dingen die u hebt genegeerd met .gitignore
).
Antwoord 6
Gebruik de onderstaande opdrachten. Deze commando’s zullen ook alle niet-getrackte bestanden van lokale git verwijderen
git fetch origin
git reset --hard origin/master
git clean -d -f
Antwoord 7
De vraag combineert hier twee problemen:
- hoe een lokale tak te resetten naar het punt waar de afstandsbediening is
- hoe u uw staging-gebied (en mogelijk de werkmap) kunt wissen, zodat
git status
nothing to commit, working directory clean.
Het one-stop-antwoord is:
git fetch --prune
(optioneel) Werkt de lokale momentopname van de externe repo bij. Verdere opdrachten zijn alleen lokaal.
git reset --hard @{upstream}
Plaats de lokale vertakkingsaanwijzer naar waar de snapshot van de remote is, evenals de index en de werkdirectory naar de bestanden van die zich committeren.git clean -d --force
Verwijdert niet-getrackte bestanden en mappen die git belemmeren om werkmap opschonen te zeggen.
Antwoord 8
Op voorwaarde dat de externe repository origin
is en dat u geïnteresseerd bent in branch_name
:
git fetch origin
git reset --hard origin/<branch_name>
Je gaat ook voor het resetten van de huidige tak van origin
naar HEAD
.
git fetch origin
git reset --hard origin/HEAD
Hoe het werkt:
git fetch origin
downloadt het laatste van remote zonder te proberen iets samen te voegen of te rebasen.
Vervolgens zet de git reset
de <branch_name>
branch terug naar wat je zojuist hebt opgehaald. De optie --hard
verandert alle bestanden in uw werkboom zodat ze overeenkomen met de bestanden in origin/branch_name
.
Antwoord 9
Dit is iets waar ik regelmatig mee te maken heb, & Ik heb het script dat Wolfgang hierboven heeft gegeven, gegeneraliseerd om met elke branch te werken
Ik heb ook een “weet je het zeker”-prompt toegevoegd, & wat feedback-output
#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] ||
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
git branch "auto-save-$branchname-at-$timestamp"
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname
Antwoord 10
Dat deed ik:
git branch -D master
git checkout master
om vertakking volledig te resetten
let op, u moet naar een ander filiaal afrekenen om het vereiste filiaal te kunnen verwijderen
Antwoord 11
Hier is een script dat automatiseert wat het meest populaire antwoord suggereert …
Zie https://stackoverflow.com/a/13308579/1497139 voor een verbeterde versie die branches ondersteunt
#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
git branch "auto-save-at-$timestamp"
fi
git fetch origin
git reset --hard origin/master
Antwoord 12
Het antwoord
git clean -d -f
werd onderschat (-d om mappen te verwijderen).
Bedankt!
Antwoord 13
Als je een probleem had zoals ik, dat je al een aantal wijzigingen hebt doorgevoerd, maar nu, om welke reden dan ook, je er vanaf wilt, de snelste manier is om git reset
op deze manier te gebruiken :
git reset --hard HEAD~2
Ik had 2 niet benodigde commits, vandaar het nummer 2. Je kunt dit veranderen in je eigen aantal commits om te resetten.
Dus om je vraag te beantwoorden – als je 5 commits voorsprong hebt op de externe repository HEAD, moet je dit commando uitvoeren:
git reset --hard HEAD~5
Houd er rekening mee dat je de wijzigingen die je hebt aangebracht kwijtraakt, dus wees voorzichtig!
Antwoord 14
Eerdere antwoorden gaan ervan uit dat de te resetten vertakking de huidige vertakking is (uitgecheckt). In opmerkingen verduidelijkte OP hap497 dat het filiaal inderdaad is uitgecheckt, maar dit wordt niet expliciet vereist door de oorspronkelijke vraag. Aangezien er ten minste één “duplicaat” vraag is, Vertakking volledig resetten naar repository-status, wat er niet van uitgaat dat het filiaal is uitgecheckt, hier is een alternatief:
Als branch “mybranch” momenteel niet is uitgecheckt, kunt u deze low-level commando:
git update-ref refs/heads/mybranch myremote/mybranch
Deze methode laat de uitgecheckte tak zoals hij is, en de werkboom onaangeroerd. Het verplaatst gewoon het hoofd van mybranch naar een andere commit, wat ook als het tweede argument wordt gegeven. Dit is vooral handig als meerdere vertakkingen moeten worden bijgewerkt naar nieuwe remote heads.
Wees echter voorzichtig wanneer u dit doet en gebruik gitk
of een vergelijkbare tool om de bron en bestemming te controleren. Als je dit per ongeluk doet op de huidige branch (en git zal je hier niet van weerhouden), kun je in de war raken, omdat de inhoud van de nieuwe branch niet overeenkomt met de werkende tree, die niet is veranderd (om te repareren, update de branch opnieuw, naar waar het eerder was).
Antwoord 15
Dit is wat ik vaak gebruik:
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
Houd er rekening mee dat het een goede gewoonte is om geen wijzigingen aan te brengen in uw lokale master/develop-branch, maar in plaats daarvan uit te checken naar een andere branch voor elke wijziging, met de branchnaam voorafgegaan door het type wijziging, b.v. feat/
, chore/
, fix/
, enz. U hoeft dus alleen wijzigingen door te voeren, geen wijzigingen van master te pushen. Hetzelfde geldt voor andere branches waar anderen aan bijdragen. Dus het bovenstaande zou alleen moeten worden gebruikt als je toevallig wijzigingen hebt doorgevoerd in een branch waar anderen zich aan hebben gecommitteerd en die opnieuw moeten worden ingesteld. Vermijd anders in de toekomst pushen naar een branch waar anderen naar pushen, in plaats daarvan afrekenen en pushen naar de genoemde branch via de uitgecheckte branch.
Als je je lokale branch wilt resetten naar de laatste commit in de upstream branch, wat tot nu toe voor mij werkt is:
Controleer je afstandsbedieningen, zorg ervoor dat je upstream en oorsprong zijn wat je verwacht, zo niet zoals verwacht, gebruik dan git remote add upstream <insert URL>
, b.v. van de originele GitHub-opslagplaats waaruit je hebt geforkt, en/of git remote add origin <insert URL of the forked GitHub repo>
.
git remote --verbose
git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force
Op GitHub kun je ook de branch uitchecken met dezelfde naam als de lokale, om het werk daar op te slaan, hoewel dit niet nodig is als origin development dezelfde wijzigingen heeft als de lokale save-work branch. Ik gebruik de ontwikkeltak als voorbeeld, maar het kan elke bestaande taknaam zijn.
git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop
Als je dan deze wijzigingen moet mergen met een andere branch terwijl er conflicten zijn, met behoud van de wijzigingen in development, gebruik dan:
git merge -s recursive -X theirs develop
Tijdens gebruik
git merge -s recursive -X ours develop
om de conflicterende wijzigingen van branch_name te behouden. Gebruik anders een mergetool met git mergetool
.
Met alle wijzigingen samen:
git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;
Merk op dat in plaats van upstream/develop je een commit-hash, een andere branchnaam, enz. zou kunnen gebruiken. Gebruik een CLI-tool zoals Oh My Zsh om te controleren of je branch groen is om aan te geven dat er niets te committen is en de werkdirectory schoon is (wat wordt bevestigd of ook verifieerbaar door git status
). Merk op dat dit daadwerkelijk commits kan toevoegen in vergelijking met upstream development als er iets automatisch wordt toegevoegd door een commit, b.v. UML-diagrammen, licentieheaders, enz., dus in dat geval kunt u de wijzigingen op origin develop
naar upstream develop
trekken, indien nodig.
Antwoord 16
Slechts 3 commando’s zullen het laten werken
git fetch origin
git reset --hard origin/HEAD
git clean -f
Antwoord 17
Als je terug wilt naar de HEAD
-status voor zowel de werkmap als de index, dan moet je git reset --hard HEAD
in plaats van naar HEAD^
. (Dit kan een typfout zijn geweest, net als het enkele versus dubbele streepje voor --hard
.)
Wat betreft uw specifieke vraag waarom die bestanden in de status gewijzigd worden weergegeven, het lijkt erop dat u een zachte reset hebt uitgevoerd in plaats van een harde reset. Dit zorgt ervoor dat de bestanden die zijn gewijzigd in de HEAD
-commit verschijnen alsof ze gestaged zijn, wat waarschijnlijk is wat je hier ziet.
Antwoord 18
Geen enkele hoeveelheid reset en opschonen leek enig effect te hebben op niet-getrackte en gewijzigde bestanden in mijn lokale git-repo (ik heb alle bovenstaande opties geprobeerd). Mijn enige oplossing hiervoor was om de lokale repo te rmen en opnieuw te klonen vanaf de afstandsbediening.
Gelukkig had ik geen andere filialen waar ik om gaf.
Antwoord 19
De enige oplossing die in alle gevallen die ik heb gezien werkt, is verwijderen en opnieuw klonen. Misschien is er een andere manier, maar op deze manier is er natuurlijk geen kans dat de oude staat daar achterblijft, dus ik geef er de voorkeur aan. Bash one-liner die je als macro kunt instellen als je vaak dingen verprutst in git:
REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH
* gaat ervan uit dat je .git-bestanden niet beschadigd zijn
Antwoord 20
Ben je vergeten een feature-branch te maken en heb je per ongeluk direct op master gecommitteerd?
Je kunt nu de feature branch maken en master terugzetten zonder de worktree (lokaal bestandssysteem) te beïnvloeden om het triggeren van builds, tests en problemen met file-locks te voorkomen:
git checkout -b feature-branch
git branch -f master origin/master
Antwoord 21
Als je het niet erg vindt om je lokale wijzigingen op te slaan, maar toch je repository wilt updaten zodat deze overeenkomt met origin/HEAD, kun je eenvoudig je lokale wijzigingen opslaan en dan pullen:
git stash
git pull