2013-03-26 15 views
9

OK, ho fatto qualcosa di stupido.Devo cancellare un commit su un fork

  • Ho biforcato un repo a cui dovrei contribuire.
  • Quindi ho quindi creato letteralmente un file chiamato "blafile" per verificare che possa eseguire il commit (ovviamente ho non ho capito cos'è un fork) e ho eseguito il commit con un messaggio "check I can commit".
  • Ho spinto al mio repository github biforcuto e ho dimenticato.
  • Ho iniziato a correggere un bug il giorno successivo.
  • Ho eseguito il commit della mia correzione e inviato al mio repository biforcato con il messaggio "bug fisso xyz".

Ora volevo emettere una richiesta di pull, e all'improvviso vedo il mio "controllo che posso commettere" commit. Preferirei che non mi piacesse apparire sulla richiesta di pull. :)

Posso cancellare completamente quel commit? Posso emettere una richiesta di pull su un singolo commit o prenderà tutti i miei commit?

So che posso localmente git reset --hard HEAD~1 (è una piccola correzione che potrei rifare rapidamente) ma che risolve solo il mio repository locale, non il mio repository github (fork).

risposta

9

Un sacco di opzioni.

L'opzione migliore è probabilmente quello di fare un nuovo ramo e cherry-pick il fix in quel ramo:

git checkout -b my-fix-branch origin/master 
git cherry-pick master 
git push -u origin my-fix-branch 

poi fare una richiesta di pull da my-fix-branch su GitHub. (Ciò presuppone che il ramo di lavoro sia denominato master, in base al numero di telefono remoto master; modificare i nomi dei rami in modo appropriato).


SE nessuno ha tirato o clonato la forchetta, si può riscrivere la storia con forza. Fare git rebase -i HEAD~2 ed eliminare il commit incriminato, quindi git push --force. Questo interromperà qualsiasi altro repository basato sulla forcella, quindi fare non fare questo se si sospetta che qualcun altro stia utilizzando il repository.

+0

Siccome sono sicuro che nessuno ha biforcato il mio repository (guardando il grafico della forcella), ho riscritto la storia :) grazie! – faboolous

3

Credo che la seguente sequenza di comandi dovrebbe funzionare presupponendo che il tuo commit non valido fosse solo un commit prima del HEAD corrente, e il nome del ramo è master.

NOTA: I seguenti comandi riscriveranno la cronologia che non è consigliata se qualcuno ha già clonato il repository. Se questo non è il caso, push -f non dovrebbe essere un grosso problema.

# Switch the current working tree to master branch 
git checkout master 
# Soft reset to get all the changes since HEAD~2 into the index/staging area 
git reset --soft HEAD~2 
# Remove the blafile from the staging area 
git rm --cached blafile 
# Commit the changes you actually intended to make 
git commit 
# Update the refs on the remote forcefully to push the newer commit. 
# Note that if any one else has pulled master already with your blafile 
# commit, they would be really pissed off with you now. 
git push -f origin master 
+0

'push -f' è pericoloso se qualcuno ha ritirato il tuo deposito. – nneonneo

+0

@nneonneo - Sì, ho aggiunto i commenti che lo indicano. Ma dal suo aspetto, l'OP vuole riscrivere la cronologia, dove non c'è affatto 'blafile' senza creare un nuovo ramo. – Tuxdude

Problemi correlati