2010-08-18 4 views
25

Ho una serie di commit di diversi autori e mi piacerebbe vedere un output git dff tra 2 commit ma solo considerando il commit di uno degli autori, qualcosa di simile, qualcosa come --author in git log.git diff con filtro autore

Sono interessato al diff finale e non alle differenze dei singoli commit.

C'è un trucco per questo?

+2

Non è esattamente un duplicato, ma potresti trovare alcune informazioni utili qui: [Estrai le modifiche rilevanti per la revisione del codice] (http://stackoverflow.com/questions/78339/extract-relevant-changes-for-code-review) –

risposta

19

Il problema qui è che non è possibile farlo nel caso generale. Supponi che Alice cambi un particolare file, quindi Bob lo cambi - incluse le parti modificate da Alice - e infine Alice lo cambia di nuovo. Come combini le due differenze di Alice in una singola diff? Se li prendi come due patch, il secondo semplicemente non si applica senza prima applicare la patch di Bob! Ma non puoi semplicemente diffare lo stato finale rispetto all'originale, perché questo includerà le modifiche di Bob.

Se si preferisce un esempio con le operazioni git, è come eseguire un rebase interattivo e semplicemente eliminare i commit casuali. Certo, a volte funziona, ma a volte fallisce completamente, perché uno di quei commit dipende da uno di quelli che hai eliminato.

Quindi, So che hai detto che non vuoi individuale commettere diff, ma è tutto quello che può davvero sperare:

git log -p --author=Alice 

Oppure, se siete davvero disperata per una singola diff, questo otterrà per voi, ma solo nei casi in cui non v'è alcuna interazione di patch, come ho detto sopra:

git checkout -b temp first_commit 
git log --pretty=%H --author=Alice first_commit..second_commit | 
while read commit; do 
    git cherry-pick $commit || exit 
done 
# or if you have a new version of git, cherry-pick works with multiple arguments: 
# git cherry-pick $(git log --pretty=%H --author=Alice first_commit..second_commit) 
git diff first_commit temp 

Questo ha veramente bisogno di operazioni nella struttura di lavoro, perché non c'è assolutamente alcuna garanzia che nessuna delle patch applicherà una volta il commit è stato saltato. Devi solo provare e vedere.

0

può essere che si potrebbe usare le funzioni di formattazione del diff-tree

format:<string> 

Il formato format:<string> consente di specificare quali informazioni si desidera visualizzare.
Funziona un po 'come il formato printf, con l'eccezione notevole che si ottiene una nuova riga con %n anziché \n.

per esempio,

format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 

avrebbe mostrato qualcosa di simile:

The author of fe6e0ee was Junio C Hamano, 23 hours ago 
The title was >>t4119: test autocomputing -p<n> for traditional diff input.<< 

È quindi possibile grep sull'autore rilevante.