Git: Come ignorare l'avanzamento rapido e l'origine Revert [ramo] in precedenza commesso?
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.
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 conreceive.denyNonFastForwards = true
ereceive.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 innext
, 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) .