2012-04-07 7 views
29

Fondamentalmente, ho una richiesta pull aperta che voglio correggere e allo stesso tempo voglio fare 1 commit che contenga 2 funzioni in 2 commit separati.Come inviare una nuova cronologia (riscritta) all'archivio remoto

repository GitHub ora assomiglia a questo, dove correzione è una nuova branca:

master c-c-c 
      \ 
    fix c-c-c-c 

ho creato una richiesta di pull da correzione.

ho voluto cambiare l'ultimo commit in difficoltà in 2 commit nel mio repository locale come segue:

master c-c-c 
      \ 
    fix c-c-c-n-n 

dove n-n sono i miei 2 nuovi commit.

Per arrivare a questo punto a livello locale, ho fatto questo:

1. git rebase -i HEAD~2 
2. Changed my last commit line to "edit", saved and closed the file 
3. git reset HEAD^ 
4. git stash save 
5. Removed the changes I don't want in the first commit 
6. git commit -m "commit a" -a 
7. git stash apply 
8. git commit -m "commit b" 

Così ora ho 2 impegna nel modo desiderato. Il problema è che ho trovato un bug che è finito nella richiesta pull. Dal momento che ho già spinto al repository remoto, non accetterà i miei nuovi commit (dato che manca quello originale).

corro:

git push origin fix --dry-run 

e ottengo il messaggio:

To [email protected]:<UserName>/<Repository>.git 
! [rejected]  fix -> fix (non-fast-forward) 
error: failed to push some refs to '[email protected]:<UserName>/<Repository>.git' 

ho visto altri post suggeriscono di tirare i miei cambiamenti di origine prima di spingere di nuovo, ma non sarà che in fondo resettare il mio 2 torna in quello?

Idealmente, ciò che mi piacerebbe fare è assegnare lo stesso ID di commit all'ultimo commit in modo che possa sostituire quello corrente così com'è. C'è un modo per farlo? (Si noti che non aver corso git reset con --hard)

risposta

60

Di fronte a questo problema, una spinta forza ha funzionato per me:

git push --force origin fix 
+1

Che ha funzionato come un fascino. Nel caso qualcuno legga questo e si chieda cosa è successo alla mia richiesta di pull, ha semplicemente sostituito il commit 1 con 2. Ho aggiunto un commento a Github al proprietario del progetto per fargli sapere di recuperare nel caso lo abbia già fatto. – NightOwl888

+0

Quindi per chiarire: è corretto che se il proprietario del progetto si è già fuso nella richiesta pull, dopo di che eseguo una 'git push --force origin fix', allora un' git fetch' dal lato del proprietario del progetto potrebbe inserire la correzione? – PonyEars

+4

Il proprietario del progetto dovrà eseguire un ripristino se le modifiche sono già state eseguite, poiché il commit sarà ancora presente nel suo ramo. 'git fetch origin' quindi' git reset --hard origin/master'. Vedi: http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head – NightOwl888

Problemi correlati