2010-07-22 13 views
12

diciamo che il mio collega John ha creato un ramo chiamato "john". Ha 10 committs di John. Quando si tratta di unirsi al master, mi chiedono di fondersi.Come unire un ramo e mantenere la paternità

Questo è quello che faccio

git checkout -b john origin/john 
git rebase master 
git checkout master 
git merge john --squashed 
git add . 
git commit -m 'merged branch john' 

Comunque ora quello che succede è che è la mia id contro il fuse commesso. E più tardi le persone vengono a chiedermi perché ho cambiato parte del codice.

Come faccio a comprimere tutti i membri del ramo john in un commit in modo tale che John sia l'autore. Immagino che git commit interattivo possa aiutare ma non riesco a capirlo.

risposta

6

Il problema qui è che git merge --squash applicherà le stesse modifiche di un'unione normale, ma senza conservare le informazioni di unione. Quindi, quando ti impegni, è lo stesso di ogni commit che fai: è attribuito a te. È possibile modificare le informazioni dell'autore del commit utilizzando git commit --author="Original Author <[email protected]>". Vedere git-commit(1) per ulteriori informazioni sull'interruttore --author.

Ma la domanda che ho è: perché stai schiacciando l'unione? Perché non fare semplicemente una fusione non schiacciata? Se qualcuno fa un git blame, sarà attribuito in modo appropriato al commit dall'autore originale.

+1

in modo da poter facilmente eseguire il rollback poiché dopo averlo schiacciato è un singolo commit che deve essere ripristinato. Se non faccio lo squash, saranno 10 i rollback a meno che non ci sia un modo migliore. –

+2

Come indicato nella risposta di mfontani, se unisci --no-ff, verrà registrato un commit di merge e se esegui il rollback di quel commit, avrà lo stesso effetto del rollback di un commit schiacciato, ma con il vantaggio aggiuntivo di registrare anche la cronologia completa del commit. –

+0

un motivo per fare un'unione di squash è che a volte le persone commettono una serie di stati danneggiati nel loro ramo, il che rende il bisect più difficile, ma il ramo finale va bene, ea volte il branch ha comunque un solo autore. – xenoterracide

8

Se fate la seguente:

git checkout -b john origin/john 
git rebase master 
git checkout master 
git merge --no-ff john # forces a merge commit to be recorded 

sarete in grado sia di conservare sia la paternità di Giovanni commette e essere in grado di ripristinare l'unione ripristinando l'SHA del merge commit.

+0

è davvero fantastico.Immagino che dovrei fare un po 'di prove da solo se mi impegno usando git merge --no-ff john, allora vedrò 10 commit nel mio master log da john o vedrò un commit come vedrei in caso di schiacciamento. Non mi importa di 10 comitts lin il registro. la mia unica preoccupazione era che dovessi essere in grado di tornare facilmente. –

+0

Vedrai tutti i commit che hai ridefinito, ma sarai in grado di annullare l'unione semplicemente ripristinando il commit di unione. Inoltre, si tiene traccia di quali commit appartenevano a quale ramo :) – mfontani

+0

Non vedo l'ora di sentire se quanto sopra ha funzionato per voi, e quindi risponde alla vostra domanda originale. – mfontani

4

Il modo in cui ho appena fatto questo è da schiacciamento via rebase:

git rebase --onto master -i master remote/branch 

Poi nell'editor, contrassegnare tutti i commit "zucca". Questo produce un singolo con l'autore originale allegato. Sebbene in realtà non vi sia nulla che si ottiene al contrario di copiare l'autore originale in --author. Mi sono sentito a disagio nel farlo.

Per qualche ragione, la mia testa era staccata in seguito, così ho riapplicati padrone ad esso tramite:

git checkout -B master HEAD 
5

È inoltre possibile --amend la paternità in seguito se avete già fatto l'unione. In questo modo:

git checkout master 
git merge my_branch 
git commit --amend --author="My Nick <[email protected]>" 
git push origin master 

Questo funziona come desiderato e aggiunge l'autore specificato al commit di unione. Semplice come quella.

Problemi correlati