git cherry pick-range of commits and exclude some in between

Zwykle używam następującego polecenia git, aby wybrać zakres gerrits..no jak wykluczyć kilka gerritów pomiędzy.. czy można zmodyfikować poniższe polecenie, czy jest takie, w którym możemy wybrać zakres gerrytów i wykluczyć te, które chcemy..

git cherrypick fromgerritSHA1..togerritSHA1
Author: Luksprog, 2013-03-28

3 answers

Możesz określić wiele zakresów:

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

Lub nawet konkretne commity:

git cherry-pick A B C D E F

Jeśli masz wiele commitów, które chcesz wykluczyć, może być łatwiej zrobić coś takiego (coś w stylu biednego człowieka git rebase -i dla 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: Dodano zalecenie do tac dziennika, ponieważ git cherry-pick chce zobaczyć commity w odwrotnej kolejności od tego, co git log produkuje (może również użyć git log --reverse ...).

 36
Author: twalberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-17 13:13:08

Nie wiem, czy można wyciągnąć pojedyncze commity z zakresu abcdef..123456. Składnia Git range jest wyjaśniona w dokumentach dla gitrevisions , i nie wygląda na to, że działa w ten sposób. Jednak istnieje inny sposób, aby uzyskać to, co chcesz, używając tylko hashów zakresu i tych, które należy wykluczyć.

Zakładając, że dwa hasze w zakresie fromgerritSHA1..togerritSHA1, których nie chcesz, to skiphash1 i skiphash2, spróbuj:

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

git rev-list --reverse fromgerritSHA1..togerritSHA1 wypisuje hasze zatwierdzeń w zakresie fromgerritSHA1..togerritSHA1, po jednej linijce na raz. --reverse jest potrzebne do wymień hasze w odpowiedniej kolejności dla wyboru wiśni.

grep -vE 'skiphash1|skiphash2' usuwa dwa hasze, których nie chcesz z listy. Możesz dodać więcej hashów do pominięcia, po prostu oddziel je za pomocą |.

Na koniec, do git cherry-pick --stdin przekazywana jest lista tylko żądanych skrótów commit.

 3
Author: Rob Bajorek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 18:11:40

Jeśli masz problem podczas cherry-pick, jak poniżej, spróbuj wybrać początek hash jeden przed niż oryginalna próba była.

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'
 1
Author: János,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-09 12:27:40