Git: Come ignorare l'avanzamento rapido e l'origine Revert [ramo] in precedenza commesso?

StackOverflow https://stackoverflow.com/questions/3166713

  •  02-10-2019
  •  | 
  •  

Domanda

ho usato

git reset --hard dc082bc... 
to Ripristina sul retro ramo a uno stato precedente richiesta, a causa di alcune cattive commit. Questo ha riavvolto il mio bene filiale locale. Tuttavia, voglio per riavvolgere il ramo su 'origine' per lo stesso impegno in modo che possa ricominciare. qualcuno potrebbe dirmi come ripristinare il ramo origine (non master) per questo commettere?

Ho provato git maestro origine spinta, ma dà il seguente errore

 ! [rejected]        branch -> branch (non-fast-forward)
error: failed to push some refs to 'git@github.com:xxx/xxx.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.
È stato utile?

Soluzione

Si può provare a forzare git push --force la spinta.

--force
  

Di solito, il comando si rifiuta di aggiornare un arbitro remoto che non è un antenato del ref locale utilizzato per sovrascrivere esso. Questo flag disabilita il controllo.
  Ciò può causare il repository remoto al commit perdere; utilizzare con cura.

Quindi, se un sacco di persone hanno già tirato lo stesso ramo di origine, che può causare qualche rebase problema dalla loro parte.
Tale operazione può essere bloccato sul lato server, come Ebneter punti fuori (nei commenti):

  

A seconda di come il telecomando è configurato, però, questo potrebbe non funzionare
  - tutti i miei pronti contro termine centrali sono configurati con receive.denyNonFastForwards = true e receive.denyDeletes = true , nel qual caso qualsiasi intervento chirurgico deve essere fatto sul server remoto.

Tuttavia, nel caso di GitHub, tali impostazioni non sono facilmente disponibili per l'utente gestire il suo repo GitHub.
Quindi, se si git push --force per errore, tutti si sono lasciati è l'apertura di un caso alla GitHub supporto , per loro di controllare il loro locale (vale a dire 'GitHub') reflogs e vedere se sono in grado di ripristinare i vecchi commit.
(Dal momento che reflogs sono locali, come mi è stato ricordato di recente . così commit che vengono sostituiti da quelli nuovi nel corso di una push --force sono solo ancora visibili, se no 'git gc' o 'git prune' già avuto luogo, presso il GitHub lato server)

Marco Ceppi insiste (nei commenti):

  

questo potrebbe davvero rovinare altri contributori repos locali se ti costringono spinte - anche se sono volte che si tratta solo di un male necessario (ho forse dovuto fare questo due volte nella mia vita di usare Git)

Altri suggerimenti

Per aggiungere al mio precedente risposta , e di affrontare il fatto che un git push forzata può davvero rovinare altri collaboratori repos locali, Git 1.8.5 (imminente Q4 2013) vedrà una nuova opzione:

git push --force-with-lease

vedere l'origine di tale facoltà in questa discussione :

  

se succede qualcosa a 'origin' al ramo si stanno costringendo o eliminazione dal momento che recuperato per ispezionarlo, si può finire per perdere il lavoro di altre persone .

     

Qualcuno che non è a conoscenza della decisione di riavvolgere e ricostruire il ramo può tentare di spingere al ramo tra il tempo che si azzardato rebase e il tempo ti ha spinto a sostituirlo con il risultato della ribasatura.

     

Si può make these pushes safer dal opzionalmente consentendo all'utente di dire "git push" in questo modo:

     

sto forzando / eliminazione, sulla base del presupposto che il valore del 'ramo' è ancora a questo oggetto.
  Se questa ipotesi non regge più, vale a dire se è successo qualcosa al ramo da quando ho iniziato la preparazione per questa spinta, si prega di non procedere e non riescono questa spinta.

È possibile vedere la documentazione completa di --force-with-lease in commettere 28f5d17

  

--force-with-lease proteggerà tutti refs remoti che stanno per essere aggiornati richiedendo loro valore corrente di essere lo stesso di qualche difetto ragionevole, se non diversamente specificato;

     

Per il momento, "un po 'di default ragionevole" è indicativamente definito come "il valore del ramo remoto di monitoraggio che abbiamo per l'arbitro del telecomando in fase di aggiornamento", ed è un errore se non abbiamo un tale Remote- monitoraggio ramo.

che spiegano la parte "affitto" di tale possibilità:

  

"force-with-lease": si assume che hai preso il contratto di locazione sul l'arbitro quando si azzardato decidere che cosa la storia Ribasato dovrebbe essere, e si può spingere indietro solo se il contratto di locazione non è stato rotto

.

Questo è già in fase di test, e menzionato nella sezione " Cosa bolle in pentola in git.git (agosto 2013, # 07; mer 28) ":

  

Tra l'altro, la spinta che le sostituzioni il solito "deve fast-forward" è stato fatto con l'opzione "force-with-lease" che è stata la cottura 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 report, se la spinta necessario per forza (o avanzare velocemente).

Quindi questo comando è più dettagliato nella sua produzione con git 2.8 (Marzo 2016)

  

push: lo stato di difficoltà ref reporting per --force-with-lease

     

L'opzione --force--with-lease spinta porta a informazioni sullo stato meno dettagliate di --force.
  In particolare, l'output indica che un riferimento è stato avanti veloce,   anche quando è stato forza-aggiornato.


Attenzione che l'opzione essere ignorato / bypassato, come spiegato nel Git 2.13 (Q2 2017) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top