Hoe kan ik de lokale branch volledig vervangen door een remote branch in Git?

Ik heb twee vestigingen:

  1. lokale vestiging (degene waarmee ik werk)
  2. externe branch (openbaar, alleen goed geteste commits gaan daar naartoe)

Onlangs heb ik mijn lokale vestiging ernstig verpest.

Hoe zou ik de lokale vertakking volledig vervangen door de externe, zodat ik mijn werk kan voortzetten vanaf waar de externe vertakking zich nu bevindt?

Ik heb SO al gezocht en lokaal uitchecken naar de remote branch heeft geen effect.


Antwoord 1, autoriteit 100%

  1. Zorg ervoor dat je de branch die je vervangt hebt uitgecheckt (uit Zoltán’s commentaar).
  2. Ervan uitgaande dat master de lokale branch is die je vervangt, en dat “origin/master” de remote branch is waarnaar je wilt resetten:

    git reset --hard origin/master
    

Hiermee wordt uw lokale HEAD-branch bijgewerkt zodat deze dezelfde revisie heeft als origin/master, en --hardzal deze wijziging ook synchroniseren met de index en werkruimte.


Antwoord 2, autoriteit 16%

Dat is zo eenvoudig als drie stappen:

  1. Verwijder je lokale vestiging: git branch -d local_branch

  2. Fetch de nieuwste remote branch: git fetch origin remote_branch

  3. Bouw de lokale branch opnieuw op basis van de remote:

    git checkout -b local_branch origin/remote_branch


Antwoord 3, autoriteit 7%

Het verbaast me een beetje dat niemand dit nog heeft genoemd; Ik gebruik het bijna elke dag:

git reset --hard @{u}

Kortom, @{u}is slechts een afkorting voor de upstream branch die uw huidige branch bijhoudt. Dit komt bijvoorbeeld meestal overeen met origin/[my-current-branch-name]. Het is leuk omdat het branche-agnostisch is.

Zorg ervoor dat je eerst git fetchdoet om de laatste kopie van de remote branch te krijgen.


Antwoord 4, autoriteit 3%

git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

Antwoord 5, autoriteit 2%

Vervang alles door de remote branch; maar, alleen vanaf dezelfde commit waar je lokale vestiging op staat:

git reset --hard origin/some-branch

OF, haal de nieuwsteuit de remote branch en vervang alles:

git fetch origin some-branch
git reset --hard FETCH_HEAD

Terzijde, indien nodig, kunt u niet-getrackte bestanden wissen & mappen die je nog niet hebt vastgelegd:

git clean -fd

Antwoord 6

De veiligste en meest complete manier om de huidige lokale vestiging te vervangen door de afstandsbediening:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

De regel stashslaat de wijzigingen op die u niet hebt vastgelegd. De regel branchverplaatst uw branch naar een andere naam, waardoor de oorspronkelijke naam vrijkomt. De regel fetchhaalt het laatste exemplaar van de afstandsbediening op. De regel checkoutreconstrueert de oorspronkelijke vertakking als een volgvertakking.

Of als bash-functie:

replaceWithRemote() {
    yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

die de huidige tak hernoemen naar zoiets als vervangende_master_98d258F.


Antwoord 7

Het kan meerdere manieren worden uitgevoerd, waarbij dit antwoord wordt bewerkt voor het verspreiden van beter kennisperspectief.

1) Reset Hard

Als u werkt vanuit de tak op afstand ontwikkelen, kunt u hoofd naar de laatste commit op afstandsbediening resetten zoals hieronder:

git reset --hard origin/develop

2) Verwijder de huidige tak en kies opnieuw uit de Remote Repository

Gezien het feit dat u werkt aan de ontwikkeling van het filiaal in lokale repo, die synchroniseert met de tak van de afstandsbediening / ontwikkelen, kunt u doen zoals hieronder:

git branch -D develop
git checkout -b develop origin/develop

3) Abort samenvoegen

Als u tussen een slecht merge bent (per ongeluk gedaan met verkeerde tak), en wilde het samenvoegen vermijden om terug te gaan naar de tak Laatste zoals hieronder:

git merge --abort

4) Abort Rebase

Als u tussen een slechte rebase bent, kunt u het herbasisverzoek afbreken zoals hieronder:

git rebase --abort

Antwoord 8

je kunt doen als @hugo van @Laurent zei, of je kunt gebruiken git rebaseom de commits te verwijderen die je wilt ontdoen, als je weet welke. Ik heb de neiging om te gebruiken git rebase -i head~N(waarbij n een nummer is, zodat u de laatste N-commits kunt manipuleren) voor dit soort operaties.


Antwoord 9

Het geselecteerde antwoord is absoluut correct , maar het heeft me niet verlaten met de nieuwste commit / pushen …

Dus voor mij:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

Omdat ik weet dat ik een paar weken tijdelijk mijn upstream-filiaal wil instellen op een specifieke tak (hetzelfde als degene die ik eerder heb ingeschakeld / gecontroleerd en een harde reset heeft gedaan)

Zo na reset

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

Antwoord 10

Als u de tak wilt bijwerken die momenteel niet is uitgecheckt, kunt u doen:

git fetch -f origin rbranch:lbranch

Antwoord 11

Git Checkout.

Ik gebruik deze opdracht altijd om mijn lokale wijzigingen met repository-veranderingen te vervangen.
Git Checkout Space Dot.


Antwoord 12

Zoals verstrekt in gekozen uitleg, Git Reset is goed.
Maar tegenwoordig gebruiken we vaak submodules: repositories in repositories. U als u bijvoorbeeld ZF3 en JQUERY gebruikt in uw project, wilt u waarschijnlijk waarschijnlijk dat ze worden gekloneerd uit hun oorspronkelijke repositories.
In dat geval is Git Reset niet genoeg.
We moeten submodules bijwerken op die exacte versie die zijn gedefinieerd in onze repository:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule foreach git submodule update
git status

Het is hetzelfde als u komt (CD) recursief naar de werkmap van elke submodule en wordt uitgevoerd:

git submodule update

en het is heel anders dan

git checkout master
git pull

Omdat submodules niet naar tak, maar naar de commit.

In die gevallen wanneer u handmatig een tak uitcheckt voor 1 of meer submodules
U kunt

uitvoeren

git submodule foreach git pull

Antwoord 13

git reset --hard
git clean -fd

Dit werkte voor mij – clean liet ook alle verwijderde bestanden zien. Als het je vertelt dat je wijzigingen kwijtraakt, moet je het opbergen.


Antwoord 14

  1. git fetch origin remote_branch
  2. git reset –hard FETCH_HEAD

Antwoord 15

De lelijke maar eenvoudigere manier: verwijder je lokale map en kloon de externe repository opnieuw.

Other episodes