Moet git branch resetten naar originele versie

Ik werkte per ongeluk aan een branch die ik al een tijdje niet had moeten zijn, dus ben ik ervan afgestapt en de toepasselijke naam gegeven. Nu wil ik de branch die ik niet had moeten overschrijven naar de originele versie (github) overschrijven. Is er een gemakkelijke manier om dit te doen? Ik heb geprobeerd de vertakking te verwijderen en vervolgens de volgvertakking opnieuw in te stellen, maar het geeft me gewoon weer de versie waar ik aan werkte.


Antwoord 1, autoriteit 100%

Als je nog niet naar de oorsprong hebt gepusht, kun je je branch resetten naar de stroomopwaartsetak met:

git checkout mybranch
git reset --hard origin/mybranch

(Zorg ervoor dat je naar je laatste commit verwijst in een aparte branch, zoals je vermeldt in je vraag)

Merk op dat net na de reset, mybranch@{1}verwijst naar de oude commit, voor de reset.

Maar als je al had gepusht, zie “Git branch maken, en origineel terugzetten naar upstream-status” voor andere opties .


Met Git 2.23 (augustus 2019)zou dat één commando zijn: git switch.
Namelijk: git switch -C mybranch origin/mybranch

Voorbeeld

C:\Users\vonc\git\git>git switch -C master origin/master
Reset branch 'master'
Branch 'master' set up to track remote branch 'master' from 'origin'.
Your branch is up to date with 'origin/master'.

Dat herstelt de index en de werkboom, zoals een git reset --hardzou doen.


Zoals opgemerkt door Brad Herman, zou een reset --hardverwijder een nieuw bestand of reset het gewijzigde bestand naar HEAD.

Eigenlijk, om er zeker van te zijn dat je met een “schone lei” begint, zou een git clean -f -dna de reset zorgen voor een werkende boom die exactidentiek is aan de branch waarnaar u zojuist hebt gereset.


Deze blogberichtstelt deze aliassen voor (alleen voor masterbranch, maar u kunt deze aanpassen/uitbreiden):

[alias]
   resetorigin = !git fetch origin && git reset --hard origin/master && git clean -f -d
   resetupstream = !git fetch upstream && git reset --hard upstream/master && git clean -f -d

Dan kun je typen:

git resetupstream

of

git resetorigin

Antwoord 2, autoriteit 3%

Ervan uitgaande dat dit is wat er is gebeurd:

# on branch master
vi buggy.py                 # you edit file
git add buggy.py            # stage file
git commit -m "Fix the bug" # commit
vi tests.py                 # edit another file but do not commit yet

Dan realiseer je je dat je wijzigingen aanbrengt in de verkeerde branch.

git checkout -b mybranch    # you create the correct branch and switch to it

Maar masterwijst nog steeds naar je commit. Je wilt dat het wijst waar het eerder wees.

Oplossing

De gemakkelijkste manier is:

git branch --force master origin/master

Een andere manier is:

git checkout master
git reset --soft origin/master
git checkout mybranch

Houd er rekening mee dat als u reset --hardgebruikt, uw niet-vastgelegde wijzigingen verloren gaan (tests.pyin mijn voorbeeld).


Antwoord 3

Er is een iets eenvoudigere manier om dit te doen:

git reset --hard @{u}

@{u}is een snelkoppeling voor wat je tracking branch ook is, dus als je op masterzit en dat volgt origin/master, @{u}verwijst naar origin/master.

Het voordeel hiervan is dat u de volledige naam van uw tracking branch niet hoeft te onthouden (of uit te typen). Je kunt ook een alias maken:

git-reset-origin="git reset --hard @{u}"

die zal werken ongeacht de branch waar je momenteel op zit.


4

Ik heb dit geprobeerd en het heeft mijn huidige tak niet gereserveerd naar mijn afgelegen Github-nieuwste.
Ik googled en gevonden
https://itsyndicate.org/blog/how-to -use-git-force-pull-properly/

die suggereerde

git fetch origin master
git reset --hard origin/master

Ik wilde mijn v8-branch resetten, dus dat deed ik

git fetch origin v8
git reset --hard origin/v8

en het werkte

Other episodes