Git, Come resettare origin / master a un commit?


245

Ho reimpostato il mio master locale su un commit con questo comando:

git reset --hard e3f1e37

quando inserisco il $ git statuscomando, il terminale dice:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Dato che voglio ripristinare anche origin / header, checkout su origin / master:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

e resetta l'intestazione con questo comando:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Quindi ho provato ad aggiungere commit a origin / header che non avevo avuto successo.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Alla fine, controllo al mio padrone di casa.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Da allora, ho resettato il capo di origine / master, mi aspetto che local e origin dovrebbero essere nella stessa direzione, ma come vedi, git sta dicendo che il mio local / master è dietro origin / master di 7 commit.

Come posso risolvere questo problema? Quello che sto cercando è Head of local / master e origin / master puntano allo stesso commit. L'immagine seguente mostra cosa ho fatto. Grazie.

inserisci qui la descrizione dell'immagine


Prima di tutto, assicurati di essere autorizzato a forzare il codice push in una succursale protetta del tuo progetto, altrimenti non sarai in grado ...
DarmVillegas,

Risposte:


564

origin/xxxi rami sono sempre puntatori a un telecomando. Non puoi controllarli perché non sono puntatori al tuo repository locale (fai solo il checkout del commit. Ecco perché non vedrai il nome scritto nel marker del ramo dell'interfaccia della riga di comando, solo l'hash del commit).

Quello che devi fare per aggiornare il telecomando è forzare il push delle tue modifiche locali al master:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
che esegue l'operazione richiesta, ma tieni presente che renderà infelice quelle persone che hanno già eseguito il commit dal master.
mnagel,

Ho seguito questi passaggi ed è tornato indietro. Ma l'origine / HEAD ora punta a un ramo diverso dal master. Cosa posso fare per risolvere questo problema?
Daniil Shevelev il

1
Non dovresti preoccuparti di origine / TESTA, basta spingere il buon riferimento a origine / riferimento
Simon Boudrias,

D'accordo, oggi ho dovuto farlo dopo aver accidentalmente unito i rami sbagliati e poi aver spinto verso l'origine. Funziona bene, ma potrebbe essere molto distruttivo se altre persone hanno verificato i rami interessati dall'origine. Usare con cautela.
Nick W.

1
Non funziona remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0,

52

La soluzione trovata qui ci ha aiutato ad aggiornare il master a un precedente commit che era già stato inviato:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

La differenza chiave dalla risposta accettata è l'hash di commit "e3f1e37:" prima del master nel comando push.


1
Non funziona:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0,

@ m0skit0 come dice il messaggio you should pull first:)
intuitivepixel

La risposta a questo è su stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falsema in realtà l'ho impostato manualmente nel mio repository git locale /opt/gitche ho creato per giocare con le idee qui. Non sono sicuro di come o se sia possibile farlo per bitbucket, github ecc ... E @intuitivepixel che è inutile in quanto inverte ciò che stavi cercando di ottenere con l'hard reset.
HankCa,

Ciao @jkovacs, non voglio che vengano rimosse nuove modifiche in master. Voglio solo spingere quell'hash di commit "e3f1e37" sul master di origine. È possibile saltando il secondo comando git reset --hard "e3f1e37"?
KarenAnne,

Ciao @jkovacs, ho appena confermato che posso saltare il 2 ° passaggio. :)
KarenAnne,

2

Supponendo che il tuo ramo sia chiamato mastersia qui che da remoto, e che il tuo telecomando sia chiamato originpotresti fare:

git reset --hard <commit-hash>
git push -f origin master

Tuttavia, dovresti evitare di farlo se qualcun altro sta lavorando con il tuo repository remoto e ha apportato le modifiche. In tal caso, sarebbe meglio ripristinare le commit non desiderate, quindi spingere normalmente.


1

Dato che avevo una situazione simile, ho pensato di condividere la mia situazione e come queste risposte mi hanno aiutato (grazie a tutti).

Così ho deciso di lavorare localmente modificando il mio ultimo commit ogni volta che volevo salvare i miei progressi sul ramo principale (lo so, avrei dovuto ramificarmi, impegnarmi su quello, continuare a spingere e poi tornare al master).

Una sera tardi, nella paura paranoica di perdere i miei progressi verso guasti hardware o qualcosa fuori dall'etere, ho deciso di spingere il maestro all'origine. Successivamente ho continuato a modificare il mio ramo principale locale e quando ho deciso che era ora di spingere di nuovo, mi sono trovato di fronte a diversi rami principali e ho scoperto che non posso modificare l'origine / a monte ( duh! ) Come posso fare con i rami di sviluppo locale.

Quindi non ho verificato il master localmente perché ero già dopo un commit. Il maestro è rimasto invariato. Non ho nemmeno bisogno di resettare --hard, il mio commit attuale era OK.

Ho solo forzato a spingere verso l'origine, senza nemmeno specificare quale impegno volevo forzare sul master poiché in questo caso è qualunque sia HEAD. Controllato git diff master..origin/masterquindi non c'erano differenze e basta. Tutto risolto. Grazie! (Lo so, sono un novizio git, ti prego di perdonare!).

Quindi, se stai già bene con la tua filiale principale localmente, basta:

git push --force origin master
git diff master..origin/master
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.