Reset de lokale repository-vertakking om net als de externe repository HEAD te zijn

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:

  1. hoe een lokale tak te resetten naar het punt waar de afstandsbediening is
  2. 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:

  1. 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.
  2. 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.

xkcd: Git


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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

20 − 5 =

Other episodes