Come faccio a forzare correttamente una spinta Git?


2 Answers

E se push --force non funziona, puoi fare push --delete . Guarda la seconda riga su questa istanza:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

Ma attenzione ...

Mai e poi mai tornare su una storia git pubblica!

In altre parole:

  • Non force mai force su un repository pubblico.
  • Non fare questo o niente che possa rompere la forza di qualcuno.
  • Non reset mai o rewrite cronologia in un repository che qualcuno potrebbe aver già estratto.

Naturalmente ci sono eccezioni eccezionalmente rare anche a questa regola, ma nella maggior parte dei casi non è necessario farlo e genererà problemi a tutti gli altri.

Effettua invece un ripristino.

E stai sempre attento a ciò che spingi a un repo pubblico . Ripristino:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

In effetti, entrambi i HEAD di origine (dal ripristino e dal ripristino del male ) conterranno gli stessi file.

modifica per aggiungere informazioni aggiornate e altri argomenti su push --force

Prendi in considerazione la possibilità di spingere la forza con il leasing anziché la spinta, ma preferisci comunque tornare indietro

Un altro problema che push --force può portare è quando qualcuno spinge qualcosa prima di te, ma dopo che hai già recuperato. Se spingi a forza la versione rebased ora sostituirai il lavoro degli altri .

git push --force-with-lease introdotto nel git 1.8.5 ( grazie al commento @VonC sulla domanda) cerca di risolvere questo problema specifico. Fondamentalmente, porterà un errore e non spingerà se il telecomando è stato modificato dal tuo ultimo recupero.

Questo è un bene se sei veramente sicuro che sia necessario un push --force , ma vuoi comunque evitare ulteriori problemi. Direi che dovrebbe essere il comportamento predefinito della forza di push --force . Ma è ancora lontano dall'essere una scusa per forzare una push . Le persone che vengono scaricate prima del tuo rebase avranno ancora molti problemi, che potrebbero essere facilmente evitati se tu fossi tornato indietro .

E poiché stiamo parlando di istanze git --push ...

Perché qualcuno dovrebbe voler forzare la spinta?

@linquize portato un buon esempio di forza sui commenti: dati sensibili . Hai trapelato in modo errato i dati che non dovrebbero essere inseriti. Se sei abbastanza veloce, puoi "aggiustarlo" * forzando una spinta in cima.

* I dati saranno ancora sul telecomando, a meno che non si faccia un raccoglitore di rifiuti , o di pulirlo in qualche modo . C'è anche l'ovvio potenziale che possa essere diffuso da altri che lo hanno già scaricato , ma tu hai l'idea.

Question

Ho installato un repository "principale" remoto non nudo e l'ho clonato sul mio computer. Ho apportato alcune modifiche locali, aggiornato il repository locale e reimpostato le modifiche al repository remoto. Le cose andavano bene fino a quel punto.

Ora, ho dovuto cambiare qualcosa nel repository remoto. Poi ho cambiato qualcosa nel mio repository locale. Mi sono reso conto che la modifica al repository remoto non era necessaria. Così ho provato a git push dal mio repo locale al mio repository remoto, ma ho ricevuto un errore del tipo:

Per evitare di perdere la cronologia, gli aggiornamenti non rapidi sono stati respinti Unisci le modifiche remote prima di premere nuovamente. Per i dettagli, consultare la sezione "Nota sui fast-forwards" di git push --help .

Ho pensato che probabilmente a

git push --force

costringerebbe la mia copia locale a inviare modifiche a quella remota e renderla uguale. Forza l'aggiornamento , ma quando torno al repository remoto e faccio un commit, noto che i file contengono modifiche non aggiornate (quelle che il repository remoto principale aveva in precedenza).

Come ho menzionato nei commenti ad una delle risposte :

[I] ha provato a forzare, ma quando torno al server principale per salvare le modifiche, ottengo la gestione temporanea obsoleta. Quindi, quando commetto i repository non sono la stessa cosa. E quando provo a utilizzare nuovamente git push, ottengo lo stesso errore.

Come posso risolvere questo problema?




Questa era la nostra soluzione per la sostituzione di master su un repository gitHub aziendale mantenendo la cronologia.

push -f per la masterizzazione sui repository aziendali è spesso disabilitato per mantenere la cronologia delle filiali. Questa soluzione ha funzionato per noi.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master
git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

spingere il ramo su desiredOrigin e creare un PR




Se sono sul mio ramo locale A, e voglio forzare il push del ramo locale B sul ramo d'origine, l'IC può usare la seguente sintassi:

git push --force origin B:C



Related