2013-06-07 14 views
6

Supponiamo di avere un progetto sul ramo MASTER con 100s di file php. Per fare un bug fixing nel progetto, creo un ramo separatocome unire file specifici in git

git checkout -b bugfix 

Poi dopo aver fissato il bug in 3 file (per esempio index.php, register.php e login.php), mi fondo nel ramo principale

git checkout master 
git merge bugfix 

Il codice qui sopra unire tutti i file 3 ho fatto cambiamenti, ma c'è comunque che posso forzare GIT per unire solo 2 file, dire login.php e solo register.php?

+1

Penso che un modo sarebbe quello di commettere quei due file in un commit e l'ultimo nell'altro, penso che sia possibile specificare un commit e unire solo quello. – dutt

+0

@dutt Il problema degli OP è che le modifiche apportate ai file sono già state confermate. – arkascha

+0

Forse questo può aiutare a trovare un modo http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge – hellectronic

risposta

0

Non c'è modo di registrare un'unione parziale in Git, tutte le unioni devono unire l'intero albero radice di tutti i commit che vengono uniti.

Puoi ovviamente scegliere di risolvere quell'unione scegliendo la copia invariata di uno dei file da uno dei genitori, ma questa è ancora un'unione "completa" e le modifiche in quel file saranno considerate come unite quando si tratta di successivi rebase o fusioni tra i rami coinvolti.

0

No, non esiste un modo diretto. Anche se; è possibile selezionare i file dal ramo che si desidera unire e sovrascriverli su quelli esistenti nel ramo principale. I comandi in ordine sono:

git checkout master 
git show bugfix:login.php > login.php 
git show bugfix:register.php > register.php 
git add . 
git commit -m "Select login and register from branch/bugfix" 

Ok, il metodo di cui sopra sarà "distruggere" cronologia dei file. C'è una vecchia discussione sullo stesso in this mailing list.

Dal punto di vista tecnico, la cosa che rende la materia la storia (e perché "insieme di commit in ordine di data" è inutile) è perché ci dà un antenato comune! E che è l'unica cosa che conta.

Ora, cosa c'è di fondamentalmente sbagliato nel fare la cronologia per-file?

Ora, se hai seguito questo argomento, dovresti andare "Aaahh! Ovvio!".

Ignorare un intero lotto di paragrafi; troverete la soluzione:

git diff commit..othercommit filename | git-apply --index && git commit 

Nel tuo caso, commit = hash di voi TESTA/master succursale; e othercommit = hash del ramo bugfix.

+0

Non unisce il ramo in 'master'. – axiac

3

La seguente soluzione è adottata dal a blog post

Si è scoperto che checkout può anche essere utile in questa materia. Si può semplicemente richiamo (checkout) quei file specifici da un altro ramo:

# switch to the branch you want to be your merge destination 
git checkout master 

# checkout specific files from specific branch 
git checkout bugfix login.php register.php 

# check the status 
git status 

# merge them in 
git commit -m "your merge comment" 
+0

Non unisce il ramo in 'master'. – axiac

+1

@axiac se leggi attentamente la domanda ti renderai conto che la domanda non è l'unione di un ramo, si tratta di unire un file (che è una terminologia errata per portare un file specifico da un altro ramo al ramo desiderato). La soluzione sopra funziona –

0

è possibile simulare il comportamento che si desidera, ma cosa succede con i cambiamenti che hai fatto sul terzo file?

Le modifiche sul terzo file rimangono nei commit sul ramo ma non saranno presenti nel commit unito, è come se il file non fosse stato modificato sul ramo.

Questo è come si può fare:

git checkout master 
git merge bugfix --no-commit 

L'opzione --no-commit dice git per unire i file, ma fermarsi prima di commettere. Ora puoi ispezionare i file, cambiarli, fare quello che vuoi. Al fine di annullare le modifiche che hai fatto sul index.php è possibile eseguire:

git checkout master -- index.php 

esecuzione git status si può vedere che index.php non appare come modificato più (né nell'indice o nella struttura di lavoro). È ora possibile git commit e questo è tutto.

+0

Questa soluzione è come cambiare tutti i file e quindi provare a correggere manualmente il pasticcio !! leggi [questo post] (http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/) per ottenere di cosa tratta questo stack e perché la tua soluzione è uno spreco di tempo e lavoro. –