Ich habe einen Feature-Zweig mit vielen Commits.
%Vor% Ich arbeite an feature
, aber ein anderer Entwickler hat die Commits B
und C
erstellt. Jetzt möchte ich feature
bei commit C
neu erstellen, aber ich und / oder automatische Fehler während der Rebase eingeführt. Mein Projekt hat eine sehr gute Testabdeckung und ich kann die Tests mit ant rebuild test
von der Konsole aus ausführen, und jetzt möchte ich, dass git mir sagt, welcher Commit der erste Commit ist, der meinen Test bricht, damit ich diesen Commit beheben kann. Wie kann ich das tun?
Während Sie sich im Zweig feature
befinden, führen Sie Folgendes aus:
Dies bewirkt, dass git bei Commit C erneut startet, Ihre Arbeit oben wiederholt und nach jedem Commit, das während der Wiedergabephase angewendet wird, Ihre Tests ausführt.
Hoffentlich hat deine Ameisen-Aufgabe einen Null-Exit-Code, wenn deine Tests fehlschlagen. In diesem Fall stoppt Git, sobald die Tests fehlschlagen. Sie sind sofort in der richtigen Position, um Ihr Commit zu ändern, damit die Tests wieder glücklich werden. Nachdem Sie die Änderung vorgenommen haben, führen Sie einfach git rebase --continue
wie gewohnt aus und git überprüft weiterhin alle Ihre Commits.
Hinzufügen zum OP-Yankee ausgezeichnete Antwort , Git 2.5+ wird eine robustere git rebase --interactive --exec
Erfahrung, vor allem im Falle einer fehlgeschlagen exec.
Siehe commit b12d3e9 [22. Mai 2015] und committe 1d968ca [22. Mai 2015] von Matthieu Moy ( moy
) .
(Zusammengeführt von Junio C Hamano - gitster
- in commit a6be52e , 1. Juni 2015)
Der Befehl '
exec
' sendet das aktuelle Commit anstopped-sha
, das das ursprüngliche Commit (vor der Rebase) enthalten soll.
Wenn ein 'exec
' Befehl fehlschlägt, wird das nächste 'git rebase --continue
' das aktuelle Commit als nächstes an den Post-Rewrite-Hook senden.
Die vollständige Dokumentation:
rebase -i
: fixpost-rewrite
hook mit fehlgeschlagenemexec
-BefehlWenn "
git rebase
" vor dem Abschluss des Rebases stoppt, wird dem Benutzer normalerweise die Möglichkeit gegeben, ein Commit zu bearbeiten (z. B. mit dem 'edit
'). Befehl).
In solchen Fällen lässt 'git rebase
' den sha1 des Commits in"$state_dir"/stopped-sha
umschreiben und der nachfolgende 'git rebase --continue
' ruft denpost-rewrite
Hook mit diesem sha1 als<old-sha1>
Argument zumpost-rewrite
Hook auf .Der Fall, dass "
git rebase
" wegen eines fehlgeschlagenen Befehls "exec
" anhält, ist anders: Es gibt dem Benutzer die Möglichkeit, das Problem zu untersuchen oder zu beheben Fehler, aber hört nicht auf zu sagen "Hier ist ein Commit zu bearbeiten, zu verwenden--continue
wenn du fertig bist ".
Es gibt also keinen Grund, denpost-rewrite
Hook für 'exec' Befehle aufzurufen.
Wenn der Benutzer das Commit neu geschrieben hat, wäre es mit 'git commit --amend
', das bereitspost-rewrite
hook genannt hat.Fix das Verhalten zu:
- Bei fehlgeschlagenem
darf keinestopped-sha
-Befehl ,exec
-Datei verbleiben- und lehre '
git rebase --continue
', umrecord_in_rewritten
if zu überspringen Keinestopped-sha
-Datei gefunden.
Eingeführt in Git 2.9 , können Sie nun für jeden einen Befehl ausführen Übernehmen Sie die Option -x
, ohne auch --interactive
hinzufügen zu müssen.
Anstatt git rebase -i --exec "cmd1 && cmd2 && ..."
auszuführen, können Sie jetzt git rebase -x "cmd1 && cmd2 && ..."
ausführen.