2010-03-25 30 views
11

Ho un commit, lo ho memorizzato in un ramo, perché questo dovrebbe andare solo a una casella specifica.Git esclude un commit in un ramo

L'ho unito al master del ramo, ma non allo sviluppo del ramo, che utilizzo localmente.

Ora, per errore ho unito il master a dev e questo ha introdotto questo commit su dev.

So che posso git revert sha, to branch dev; ma poiché questo introdurrà un commit che annulla quel commit (sto indovinando, non l'ho provato esattamente), quando mi unisco al master, anche questo commit verrà annullato?

In tal caso, come annullare questo commit solo dallo sviluppatore del ramo.

E oh, git reset HEAD^1 --hard non è un'opzione perché ci sono altri commit sul master, dopo il commit non necessario.

Se resettare nuovamente e applicare è l'unica opzione, quindi come faccio a unire solo questi commit extra dal master diverso dal commit non necessario.

Aggiornamento:

Ecco l'albero di commettere. Sembra complesso Ho indicato il commit, che non ho bisogno nel dev. (Ho anche rimosso qualsiasi informazione di identificazione personale, grazie per la comprensione.È molto più semplice per screenshot gitk che per ascii art.) alt text

Grazie in anticipo!

+1

E 'possibile ascii-art questo come io non sono totalmente chiaro dove l'unione si impegna in relazione al commit indesiderato? –

+0

In svn puoi unire intervalli di revisioni, 1-19, 49, 52-90 ... Sono sicuro che puoi farlo anche in git. – SeanJA

+1

@SeanJA: Non sono sicuro che l'analogia con svn sia il modo migliore per ottenere una risposta. In particolare, con git, se inizi con 'A - B - C' e rimuovi' B' per ottenere 'A - C'', il commit' C'' non è lo stesso del commit 'C', perché non ha lo stesso genitore Quindi, certo, puoi costruire un secondo ramo composto dal commit originale con quello desiderato mancante, e quindi unirlo, ma non avrai fuso il ramo originale. – Cascabel

risposta

16

Su una copia zero del ramo, git rebase --interactive e rilasciare il commit indesiderato. In alternativa, è possibile creare un nuovo ramo a monte del commit indesiderato e git cherry-pick il commit desiderato su di esso.

Ci sono probabilmente più modi per raggiungere questo obiettivo.

2

git reflog, quindi git reset --hard sono i tuoi amici per annullare gli errori.

Al fine di evitare un singolo commettere quando si unisce un ramo, questo è ciò che ho appena utilizzato nel mio progetto:

  • assumere: fusione dal ramo B a testa.
  • Identificare revid di impegnarsi da evitare (R0)
  • Identificare revid di impegnarsi appena prima di R0 (R1)

    git merge <R1> 
    git merge -s ours R0 
    git merge B 
    
Problemi correlati