2013-03-28 7 views
20

Normalerweise benutze ich den folgenden git Befehl, um eine Reihe von gerrits..no zu cherryppick, wie schließe ich ein paar gerrits dazwischen aus .. kann der folgende Befehl geändert werden oder ist dort ein, wo wir eine Reihe von gerrits und schließen diejenigen auswählen können, wir wollen ..git cherry pick - Bereich der Commits und schließen einige dazwischen aus

git cherrypick fromgerritSHA1..togerritSHA1 
+0

Ähnliche: [How Kirsche auf eine Reihe von Commits holen und in einen anderen Zweig zusammenführen?] (Http://stackoverflow.com/q/1994463/55075) – kenorb

Antwort

33

Sie können mehrere Bereiche angeben:

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

oder sogar spezifische Commits:

git cherry-pick A B C D E F 

Wenn Sie viele Commits haben Sie ausschließen möchten, könnte es einfacher sein, so etwas zu tun (Art wie ein armer Menschen git rebase -i für 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: Hinzugefügt Empfehlung an tac der log, seit git cherry-pick will die Commits in der umgekehrten Reihenfolge sehen, was git log produziert (könnte auch git log --reverse ... verwenden).

+0

Aus irgendeinem Grund die Zeilen, die ich in tempfile bekommen .txt muss umgekehrt werden. git log zeigt alle commits von der neusten zur ältesten an, während git cherry pick benutzt wird, um diese commits von der ältesten auf die neuste zu übertragen. Hast du es vermisst oder war das in deinem Fall kein Problem? –

+1

@ KonradSzałwiński Du hast Recht ... vergaß das bisschen. Linux hat ein praktisches Dienstprogramm namens 'tac', um die Reihenfolge der Zeilen umzukehren - ich bearbeite das in ... – twalberg

+0

Danke für die Aktualisierung der Lösung. Leider gibt es bei Windows keinen 'tac' Befehl, also musste ich zu diesem Zeitpunkt ein Online-Tool verwenden, um die Zeilen umzukehren. Danke, dass du das mit git log --reverse aufgezeigt hast. –

2

Nicht sicher, ob Sie einzelne Commits aus einem Bereich abcdef..123456 ziehen können. Die Git-Bereichssyntax wird in der Dokumentation für gitrevisions erklärt, und es sieht nicht so aus, als ob es so funktioniert. Es gibt jedoch noch einen anderen Weg, um zu erreichen, was Sie wollen, indem Sie nur die Bereichs-Hashes und die auszuschließenden Hashes verwenden.

die beiden Hashes in Reichweite Unter der Annahme fromgerritSHA1..togerritSHA1, die Sie nicht wollen, sind skiphash1 und skiphash2, versuchen:

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

git rev-list --reverse fromgerritSHA1..togerritSHA1 druckt begehen aus Hashes in Bereich fromgerritSHA1..togerritSHA1, zu einem Zeitpunkt eine Zeile. --reverse wird benötigt, um die Hashes in der richtigen Reihenfolge für den Cherry-Pick aufzulisten.

grep -vE 'skiphash1|skiphash2' entfernt die zwei Hashes, die Sie nicht von der Liste möchten. Sie können weitere Hashes hinzufügen, um sie zu überspringen, trennen Sie sie einfach mit |.

Schließlich wird die Liste der gewünschten Commit-Hashes an git cherry-pick --stdin übergeben.

+0

Auf diese Weise klingen mehr skriptable .. – Gqqnbig

1

Wenn Sie Probleme während des Cherry-Pick wie unten haben, versuchen Sie wählen Start-Hash eins vor als Ihr ursprünglicher Versuch war.

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' 
Verwandte Themen