2013-03-28 13 views
20

Normalmente utilizzo il comando git seguente per visualizzare un intervallo di gherretti ... non so come posso escludere un paio di gerrits tra ... il comando sottostante può essere modificato o è c'è quella in cui siamo in grado di scegliere una serie di Gerrits ed escludere quelli che vogliamo ..git cherry pick - intervallo di commit ed esclusione di alcuni tra

git cherrypick fromgerritSHA1..togerritSHA1 
+0

Simili: [Come ciliegia scegliere una serie di commit e si fondono in un altro ramo?] (Http://stackoverflow.com/q/1994463/55075) – kenorb

risposta

33

È possibile specificare più intervalli:

git cherry-pick A..B C..D E..F 

o anche commit specifici:

git cherry-pick A B C D E F 

Se hai un sacco di commit si desidera escludere, potrebbe essere più facile da fare qualcosa di simile (un po 'come un povero di git rebase -i per git cherry-pick):

git log --pretty=oneline A..F | tac > tempfile.txt 
< edit tempfile.txt to remove the commits you don't want > 
git cherry-pick $(awk '{print $1}' tempfile.txt) 

Edit: raccomandazione Aggiunto a tac il log, poiché git cherry-pick vuole vedere i commit nell'ordine opposto a quello prodotto da git log (potrebbe anche utilizzare git log --reverse ...).

+0

Per qualche motivo le linee che ottengo in tempfile .txt deve essere invertito. git log presenterà tutti i commit dal più recente al più vecchio mentre si usa git cherry pick che si desidera applicare questi commit dal più vecchio al più recente. Ti è mancato o non è stato un problema nel tuo caso? –

+1

@ KonradSzałwiński Hai ragione ... hai dimenticato quel pezzettino. Linux ha una comoda utility chiamata 'tac' per invertire l'ordine delle righe - La modifico in ... – twalberg

+0

Grazie per aver aggiornato la soluzione. Sfortunatamente con Windows non esiste un comando "tac", quindi in quel momento ho dovuto usare uno strumento online per invertire le linee. Grazie per aver sottolineato che con git log --reverse. –

2

Non è sicuro se è possibile estrarre singoli commit da un intervallo abcdef..123456. La sintassi Git range è spiegata nei documenti per gitrevisions e non sembra che funzioni in questo modo. Tuttavia, c'è un altro modo per ottenere quello che vuoi usando solo gli hash della gamma e quelli da escludere.

Supponendo che i due hash nella gamma fromgerritSHA1..togerritSHA1 che non si desidera sono skiphash1 e skiphash2, provare:

$ git rev-list --reverse fromgerritSHA1..togerritSHA1 | grep -vE 'skiphash1|skiphash2' | git cherry-pick --stdin 

git rev-list --reverse fromgerritSHA1..togerritSHA1 stampe impegnano fuori hash nella gamma fromgerritSHA1..togerritSHA1, una riga alla volta. --reverse è necessario per elencare gli hash nell'ordine corretto per il cherry-pick.

grep -vE 'skiphash1|skiphash2' rimuove i due hash che non si desidera dall'elenco. Puoi aggiungere altri hash da saltare, basta separarli con |.

Infine, l'elenco di solo gli hash di commit che si desidera viene passato a git cherry-pick --stdin.

+0

In questo modo sembra più script ... – Gqqnbig

1

Se hai avuto problemi durante la selezione come di seguito, prova a scegli l'hash iniziale prima dello rispetto al tuo tentativo originale.

git cherry-pick a005efa..1ece685 
[temp_4454kjerer3233 3520dd4] 3. xxx. 
1 file changed, 9 insertions(+) 
[temp_4454kjerer3233 791cec5] 4. xxx. 
3 files changed, 19 insertions(+) 
[temp_4454kjerer3233 2e95364] 5. xxx. 
2 files changed, 21 insertions(+) 
[temp_4454kjerer3233 59e38b9] 6. xxx. 
3 files changed, 61 insertions(+) 
error: could not apply a3b0c6b... 7. xxx. 
hint: after resolving the conflicts, mark the corrected paths 
hint: with 'git add <paths>' or 'git rm <paths>' 
hint: and commit the result with 'git commit' 
Problemi correlati