2012-03-21 18 views
24

Ho fatto qualche ricerca online. So che puoi usare format-patch dopo il commit, ma la mia situazione è leggermente diversa.Come creare una patch senza commit in Git

Voglio creare una patch, simile a "dpk" in SVN, quindi posso inviarlo per la revisione del codice, ma non voglio ancora eseguirlo.

Come posso ottenere questo risultato con Git?

+5

Un punto importante di un DVCS come è che non c'è alcuna ragione per evitare di commettere qualcosa. –

+0

Nessuno ha risposto alla domanda .. Non gli viene chiesto nulla sui commit .. hes ha chiesto come si produce una patch che può essere distribuita ad altri utenti. – Stephen

+0

Correlati: [git format-patch senza commit] (http://stackoverflow.com/q/7837218/183120) – legends2k

risposta

7

L'impegno in Git è un'operazione poco costosa e interamente locale, quindi non c'è motivo di evitare di impegnarsi finché non si spinge da nessuna parte.

Basta creare una nuova filiale locale e commettere le modifiche lì. Puoi sempre eliminare il ramo più tardi se non lo vuoi più, oppure puoi mantenere il ramo e usarlo per lavorare su qualsiasi cosa tu stia facendo, quindi unirlo (o rebase) nel ramo master quando è pronto. Questo è un buon flusso di lavoro da utilizzare quando si lavora con Git.

$ git checkout -b feature-foo # create and switch to new branch feature-foo 
$ git commit 

# do whatever you need to do 

$ git checkout master   # switch back to the master branch 
$ git merge feature-foo  # merge your change into master (optional) 
$ git branch -d feature-foo # delete the branch 
+8

Non utile. A volte voglio vedere le modifiche locali prima di eseguire il commit in modo da poter prendere le cose che non ho intenzione di commettere. – Stephen

+5

Si può fare un 'git diff' per quello. – bfontaine

+3

@Stephen 'git add --patch' – sigod

1

Un commit a un repository locale in git non è "vincolante". Puoi commettere le tue modifiche, creare la tua patch e poi eseguire un soft reset sul tuo ramo sul commit precedente ed è come se il tuo commit non fosse mai successo.

Detto questo, non vi è alcun motivo per cui è necessario ripristinare il ramo dopo aver creato la patch. Puoi lasciare il commit nel repository ed evitare di spingerlo fino a quando non viene eseguita la revisione del codice. Se devi tornare indietro e apportare modifiche al commit originale, hai opzioni a quel punto.

E se si crea un ramo per il commit come suggerisce hammar, è ancora più semplice tornare indietro e apportare modifiche in seguito senza dover effettuare fastidiose operazioni di ribaditura e simili nel ramo principale prima di premere.

6

Come @hammar detto, commettere è a buon mercato e quindi si può soffiare via il commit con git reset ecc

È inoltre possibile riporre e poi fare:

git stash show -p 
79

Quando gli altri ragazzi avevano già dato qualche risposta che rispettino convenzione git, domanda del PO, "creare una patch senza commit", può essere anche risolto in questo modo:

git diff > my_patch.txt 

in seguito è possibile applicare questo p ATCH, anche senza un commit, da:

git apply my_patch.txt 

Ma se si sta lavorando solo a livello locale, un git checkout another_branch -m è abbastanza buono per portare tutti i vostri attuali modifiche uncommit a quella another_branch, senza nemmeno di patch e applicare.

+0

nel caso si voglia rimuovere questa patch applicata: git apply -R my_patch.txt – Sourabh

+2

In questo modo non includiamo file nuovi/non tracciati! Se è necessario includere nuovi file, è necessario aggiungere tutti i file all'indice (git add) e quindi a $ git diff --cached> my_patch.txt – dxvargas

+0

Questo inoltre non include i file staged. Avrai bisogno di eseguire 'git diff --staged> my_patch.txt' per includerli –

7

generale passo per generare patch senza commettere finalmente

  1. commit delle modifiche locali utilizzando

    git commit -a -m "specific message" 
    

    Nota: non spingere questo commesso.

  2. generare cerotto

    git format-patch -s -n -1 HEAD 
    

    genererà 0001-.PATCH

  3. tornare locale commettere

    git reset --soft HEAD~1 
    

    eliminare commettere, ma mantenere il vostro lavoro

    git reset --hard HEAD~1 
    

    eliminare impegnarsi con il vostro lavoro

Problemi correlati