Git: Come ignorare l’avanzamento veloce e ripristinare l’origine in precedenza?

ero solito

 git reset --hard dc082bc ... 

per tornare al ramo in uno stato precedente richiesto, a causa di alcuni cattivi commit. Questo ha riavvolto la mia filiale locale. Tuttavia, voglio riavvolgere il ramo su “origine” sullo stesso commit in modo che possa ricominciare. Qualcuno potrebbe dirmi come ripristinare il ramo di origine (non master) per questo commit?

Ho provato il master di origine git push, ma dà il seguente errore

  !  [rifiutato] branch -> branch (non-fast-forward)
 errore: imansible inviare alcuni riferimenti a "[email protected]: xxx / xxx.git"
 Per evitare di perdere la cronologia, gli aggiornamenti non rapidi sono stati rifiutati
 Unisci le modifiche remote prima di premere nuovamente.  Vedi la 'Nota su
 sezione "git push - help" per i dettagli.

Puoi provare git push --force per forzare la spinta.

 --force 

Di solito, il comando si rifiuta di aggiornare un ref remoto che non è un antenato del ref locale usato per sovrascriverlo. Questo flag disabilita il controllo.
Ciò può causare la perdita di commit del repository remoto; usalo con cura

Pertanto, se molte persone hanno già prelevato lo stesso ramo dall’origine, ciò potrebbe causare alcuni problemi di rebase dalla loro parte.
Quell’operazione può essere bloccata sul lato server, come fa notare ebneter (nei commenti):

Tuttavia, a seconda di come è configurato il telecomando, questo potrebbe non funzionare
– tutti i miei repository centrali sono configurati con receive.denyNonFastForwards = true e receive.denyDeletes = true , nel qual caso qualsiasi intervento chirurgico deve essere eseguito sul server remoto.

Tuttavia, nel caso di GitHub, tali impostazioni non sono prontamente disponibili per l’utente che gestisce il repository GitHub.
Quindi, se per errore git push --force , tutto ciò che rimane è aprire un caso al supporto GitHub , per consentire loro di controllare i loro diagrammi locali (es. “GitHub”) e vedere se riescono a ripristinare i vecchi commit.
(Dal momento che i reflog sono locali, come se fossi stato ricordato di recente . Quindi i commit che vengono sostituiti da quelli nuovi durante una push --force sono ancora visibili, se non è già stato git gcgit gc ” o ” git prune ” al GitHub lato server)

Quindi Marco Ceppi insiste (nei commenti):

questo potrebbe davvero rovinare i repository locali di altri contributori se forzate i push – anche se sono volte che è solo un male necessario (forse ho dovuto farlo due volte nella mia vita di utilizzo di Git)

Per aggiungere alla mia risposta precedente , e per affrontare il fatto che una git push forzata può davvero rovinare i repository locali di altri contributori, git 1.8.5 (imminente Q4 2013) vedrà una nuova opzione:

 git push --force-with-lease 

Vedi l’origine di quell’opzione in questo thread :

se succede qualcosa di ” origin ” al ramo che stai forzando o eliminando da quando sei stato prelevato per ispezionarlo, potresti finire per perdere il lavoro di altre persone .

Qualcuno che non è a conoscenza della decisione di riavvolgere e ribuild il ramo può tentare di passare al ramo tra il tempo impiegato per rebase e il tempo impiegato per sostituirlo con il risultato del rebasing.

Possiamo make these pushes safer opzionalmente consentendo all’utente di dire ” git push ” questo:

Sto forzando / eliminando, basato sul presupposto che il valore di ‘ramo’ è ancora a questo object.
Se questa ipotesi non è più valida, vale a dire se qualcosa è accaduto al ramo da quando ho iniziato a preparare questa spinta, per favore non procedere e fallire questa spinta.

È ansible visualizzare la documentazione completa di --force-with-lease in commit 28f5d17

--force-with-lease proteggerà tutti i riferimenti remoti che verranno aggiornati richiedendo che il loro valore corrente sia lo stesso di un valore predefinito ragionevole, se non diversamente specificato;

Per ora, “qualche ragionevole default” è provvisoriamente definito come “il valore del ramo di localizzazione remota che abbiamo per il ref del remoto che viene aggiornato”, ed è un errore se non abbiamo un ramo di tracciamento remoto.

Questo spiega la parte “affitto” di questa opzione:

force-with-lease “: si presume che abbiate preso in leasing il ref quando è stato prelevato per decidere quale dovrebbe essere la cronologia successiva, e si può respingere solo se il lease non è stato interrotto.


Questo è già stato testato e menzionato nella sezione ” What’s cooking in git.git (Aug 2013, # 07; Wed, 28) “:

A proposito, la spinta che esclude il solito “deve avanzare velocemente” è stata fatta usando l’opzione ” force-with-lease ” che è stata utilizzata in next , in questo modo:

 $ git fetch ko next $ anchor=$(git rev-parse --verify FETCH_HEAD) $ for remote in ko repo gph github2 do git push --force-with-lease=refs/heads/next:$anchor $remote next done 

Nota: ” git push --force-with-lease ” è stato insegnato a segnalare se la spinta è necessaria per forzare (o inoltrare rapidamente).

Quindi questo comando è più dettagliato nel suo output con git 2.8 (marzo 2016)

push: correzione dei rapporti sullo stato di ref per --force-with-lease

L’opzione push ” --force--with-lease porta a informazioni sullo stato meno dettagliate di --force .
In particolare, l’output indica che un riferimento è stato inoltrato rapidamente, anche quando è stato aggiornato con la forza.


Attenzione a che l’opzione venga ignorata / esclusa, come spiegato in Git 2.13 (2 ° trim. 2017) .