Vraag Herstel lokale repository branch om net als remote repository HEAD te zijn


Hoe stel ik mijn lokale branch opnieuw in als de branch op de externe repository?

Ik deed:

git reset --hard HEAD

Maar als ik een git status,

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.


2515
2017-10-27 00:27


oorsprong


antwoorden:


Het instellen van uw branch om exact overeen te komen met de remote branch kan in twee stappen worden gedaan:

git fetch origin
git reset --hard origin/master

Als u de status van uw huidige vestiging 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

Nu wordt uw werk opgeslagen in de tak "mijn opgeslagen werk" in het geval u besluit dat u het terug wilt (of wilt u het later bekijken of het vergelijken met uw bijgewerkte filiaal).

Merk op dat het eerste voorbeeld veronderstelt dat de naam van de externe repo "oorsprong" is en dat de vertakking met de naam "master" in de externe repo overeenkomt met de momenteel uitgecheckte vertakking in uw lokale repo.

Tussen haakjes, deze situatie waarin je je bevindt lijkt ontzettend veel op een veel voorkomende zaak waarbij een push is gedaan naar de momenteel uitgecheckte tak van een niet-bare repository. Heb je onlangs je lokale repo gepusht? Zo niet, dan hoeft u zich geen zorgen te maken - iets anders moet ertoe hebben geleid dat deze bestanden onverwacht zijn gewijzigd. Anders moet u er rekening mee houden dat het niet wordt aanbevolen om in een niet-bare repository te duwen (en niet in de huidige uitgecheckte branch, in het bijzonder).


4460
2017-10-27 01:44



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 zullen worden verwijderd (zonder deze daadwerkelijk te verwijderen):

git clean -n -f

250
2017-12-27 06:20



Ten eerste, reset naar de eerder gehaalde HEAD van de corresponderende stroomopwaartse tak:

git reset --hard @{u}

Het voordeel van opgeven @{u} of zijn uitgebreide vorm @{upstream} is dat de naam van de remote repo en branch niet expliciet gespecificeerd hoeft te worden.

Verwijder vervolgens, indien nodig, niet-gerangschikte bestanden, optioneel ook met -x:

git clean -df

Maak ten slotte, waar nodig, de nieuwste wijzigingen door:

git pull

118
2018-02-10 20:27



git reset --hard HEAD eigenlijk alleen terug naar de laatste toegewijde staat. In dit geval verwijst HEAD naar de HEAD van je filiaal.

Als je meerdere commits hebt, zal dit niet werken ..

Wat u waarschijnlijk wilt doen, wordt teruggezet naar de oorspronkelijke afzender of naar wat de externe repository wordt genoemd. Ik zou waarschijnlijk zoiets als doen

git reset --hard origin/HEAD

Maar wees voorzichtig. Harde reset kan niet gemakkelijk ongedaan worden gemaakt. Het is beter om te doen wat Dan suggereert, en een kopie van uw wijzigingen af ​​te zetten voordat u het opnieuw instelt.


91
2017-10-27 01:08



Alle bovenstaande suggesties hebben gelijk, maar vaak ook werkelijk reset uw project, u moet ook even bestanden verwijderen die zich in uw bevinden .gitignore.

Om het morele equivalent van te krijgen uw projectdirectory wissen en opnieuw klonen van de afstandsbediening is:

git fetch
git reset --hard
git clean -x -d -f

Waarschuwing: git clean -x -d -f is onomkeerbare en u kunt bestanden en gegevens verliezen (bijvoorbeeld dingen die u hebt genegeerd met .gitignore).


57
2017-07-23 17:48



De vraag combineert hier twee zaken:

  1. hoe een lokale vertakking te resetten naar het punt waar de afstandsbediening zich bevindt
  2. hoe je je verzamelplaats (en mogelijk de werkdirectory) wist, zodat git statuszegt nothing to commit, working directory clean.

Het one-stop-antwoord is:

  1. git fetch --prune  (optioneel) Werkt de lokale snapshot van de remote repo bij. Verdere opdrachten zijn alleen lokaal.
    git reset --hard @{upstream}Zet de lokale branch pointer op de plaats waar de snapshot van de remote staat, en stel de index en de werkdirectory in op de bestanden van die commit.
  2. git clean -d --force  Verwijdert niet-traceerde bestanden en mappen die git belemmeren om "werkmap opschonen" te zeggen.

29
2018-01-31 01:29



Dit is iets wat ik regelmatig tegenkom, en ik heb het bovenstaande script van Wolfgang gegeneraliseerd om met elke branche te werken

Ik voegde ook een "weet je het zeker" prompt, & wat feedback-uitvoer toe

#!/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

20
2017-11-09 13:01



Hier is een script dat automatiseert wat het populairste antwoord suggereert ... Zien 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

11
2017-10-15 08:50



Op voorwaarde dat de externe repository is origin, en dat je geïnteresseerd bent in branch_name:

git fetch origin
git reset --hard origin/<branch_name>

Ook ga je 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 de afstandsbediening zonder iets te proberen samen te voegen of te rebasen.

Dan de git reset reset de <branch_name> vertakken naar wat je zojuist hebt opgehaald. De --hard optie verandert alle bestanden in uw werkboom om overeen te komen met de bestanden in origin/branch_name.


11
2018-05-08 11:12



Ik deed:

git branch -D master
git checkout master

om de tak volledig te resetten


merk op, u zou moeten afrekenen naar een ander filiaal om het vereiste filiaal te kunnen verwijderen


10
2018-05-14 07:48