2010-01-17 16 views
24

Sono nuovo di Git, ma ho familiarità con SVN. Come test ho creato un repository in una directory locale con git init. Poi ho clonato il repository vuoto (su SSH usando 127.0.0.1, che è un'altra cosa che volevo testare) in un'altra directory locale. Ho aggiunto alcuni file nel repository 2, ho fatto git add * e infine git commit -a -m "First source code".Come funzionano le patch in Git?

Ora voglio creare una patch usando git format-patch e applicarla sul repository 1. Come faccio? So che c'è un manuale, ma queste cose sono terribilmente complicate e mi fanno desiderare di fare certe cose sul mio monitor.

+2

Non hai bisogno di usare le patch quasi altrettanto spesso se stai usando Git, controlla la mia risposta sotto –

+1

[This] (https://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git/) l'articolo potrebbe essere utile dinterizzando il processo completo di patching –

risposta

19

Crea il cerotto tramite:

$ git format-patch master --stdout > patch.diff 

poi patch.diff conterrà il diff, che potrete poi inviare a qualcun altro per applicare con:

$ git am < patch.diff 

A volte, quando i manuali sono un po 'denso, ha senso cercare un tutorial:

http://luhman.org/blog/2009/09/22/git-patch-tutorial

13

Il metodo più semplice per creare patch dall'ultimo commit (o ultimi commit) è quello di utilizzare format-patch con un numero negativo indica il numero di commit per creare patch per:

git format-patch -1 

Si otterrà un file di patch prende il nome dalla descrizione del commit.L'uso am per inserirlo in un altro repository:

git am << name_of_patch_file 
+2

Solo un pignolo; ma non è un numero negativo, è solo una bandiera per indicare la profondità. Non ci sono strane magie in corso! Puoi anche specificare un intervallo di commit se è più naturale, ad es. 'git format-patch origin/master..' o così via (vedere il manuale di git rev-parse per tutti i modi di esprimere quegli argomenti). –

+0

Su Windows usa 'git am name_of_patch_file' –

0

Devi andare a "repository 2", quello che si desidera creare la patch da, ed eseguire git-format-patch per creare la patch: git format-patch maestro --stdout> name_of_patch_file

Poi si va in "repository 1", quello che si desidera applicare la patch per: git applicare name_of_patch_file

a volte è utile solo controllare se la patch causa problemi: git apply --check name _of_patch_file

2

Utilizzando GitHub rattoppare

  1. Aggiungi .patch a un URL impegnarsi per ottenere il file di patch, ad esempio

    github.com/git/git/commit/b6b3b6a.patch

  2. patchare il file originale in questo modo:

    git am /tmp/b6b3b6a.patch 
    

Utilizzando GitHub diff

  1. Aggiungi .diff a un URL impegnarsi per ottenere il file di patch, ad esempio

    github.com/git/git/commit/b6b3b6a.diff

  2. patchare il file originale in questo modo:

    git apply -p0 /tmp/b6b3b6a.diff 
    

§5.3 Distributed Git - Maintaining a Project

+0

Bello con un esempio, ma il collegamento purtroppo non funziona più. :( –

2

Il modo corretto e più facile da fare questo se si sta utilizzando Git è via telecomandi:

cd \path\to\repo1 
git remote add otherrepo \path\to\repo2 
git fetch otherrepo 

git log otherrepo/master ## Find the commit you want to steal in the list 

git cherry-pick SOME_SHA1 ## Snag just one commit 
git merge otherrepo/master ## Merge all of the new commits from otherrepo/master 

Questo migreranno commette da un pronti contro termine ad un altro, compresi i loro autori e commettere messaggi, e ti aiuterà a risolvere i conflitti di unione (specialmente se stai spostando> 1 commit)

+0

Funzionerà quando il suo repository iniziale non è lo stesso? Tutti i commit avranno hash diversi, dal momento che ha una cronologia diversa. Non è la patching l'unico modo per farlo in quel momento? –