2015-04-08 14 views
30

Ich versuche, Rebins zu skripten, und mein Skript wird je nachdem, ob die Rebase zu Konflikten führt, unterschiedliche Wege gehen.Gibt es eine Art "git rebase --dry-run", die mich im Voraus über Konflikte informieren würde?

Gibt es eine Möglichkeit festzustellen, ob eine Rebase zu Konflikten führen würde, bevor die Rebase ausgeführt wird?

+0

Was ist die genaue Form des Befehls 'git rebase', den Sie verwenden? Verwenden Sie optionale Flags? Und welche Skriptsprache verwenden Sie? Schale? – Jubobs

+3

Wenn Sie 'git rebase' ausführen und einen Zusammenführungskonflikt treffen, wird der Prozess gestoppt und mit einem Nicht-Null-Status beendet. Sie können den Exit-Status der Rebase-Operation überprüfen und, falls es ungleich Null ist, 'git rebase --abort' ausführen, um den Vorgang abzubrechen. – Jubobs

+1

Haben Sie einen Weg gefunden, dies zu tun? – crmpicco

Antwort

25

Zum Zeitpunkt des Schreibens (Git v2.6.1 v2.10.0), der git rebase Befehl bietet keine --dry-run Option. Es gibt keine Möglichkeit zu wissen, bevor Sie tatsächlich eine Rebase versuchen, ob Sie in Konflikte geraten werden oder nicht.

Wenn Sie jedoch git rebase ausführen und einen Konflikt auslösen, wird der Prozess gestoppt und mit einem Status ungleich Null beendet. Was Sie tun können, ist zu überprüfen, die Exit-Status des Fütterungsmaterial Operation, und wenn es nicht Null ist, führen git rebase --abort die rebase abzubrechen:

git rebase ... || git rebase --abort 
+1

Und wenn die Rebase erfolgreich ist, aber ich merke, dass ich zurückgehen möchte? Zum Beispiel, weil ich Push nicht erzwingen möchte. – bluenote10

+0

@ bluenote10 Sie können die [reflog] der Niederlassung verwenden (https://git-scm.com/docs/git-reflog), um sie auf das Commit zurückzusetzen, auf das vor der Rebase verwiesen wird. – Jubobs

4

Ich vermute, dass git rebase ... --dry-run nicht möglich ist, aus dem folgenden Grund.

Wenn Sie eine git rebase machen, wird Git zum Startpunkt zurückrollen, dann inkrementell Patches für jedes Commit anwenden, um die Verzweigung auf den neuesten Stand zu bringen. Wenn es einen Konflikt trifft, wird es aufhören & warten Sie, bis Sie den Konflikt lösen, bevor Sie fortfahren. Der Pfad, den die Rebase nach diesem Konflikt nimmt, hängt davon ab, wie Sie den Konflikt lösen - wenn Sie ihn auf eine bestimmte Art und Weise lösen, könnte dies zu späteren Konflikten führen (oder diese eliminieren).

Somit würde git rebase ... --dry-run nur in der Lage sein, Sie die ersten Konflikt - Berichte späterer Konflikte werden davon abhängen, wie der erste Konflikt gelöst ist.

Die einzige Möglichkeit, die ich mir vorstellen könnte, wäre über git diff zwischen der aktuellen Position und dem letzten Commit in der Branche, auf die Sie rebasieren. Aber das wird nicht wirklich geben, was Sie suchen - Sie brauchen wirklich nur eine Liste von widersprüchlichen Änderungen zwischen den beiden Punkten. Dort könnte ein Weg sein, es mit git diff zu tun, aber es ist kein normaler Patch.

3

Sie können immer noch git Rebase, spielen Sie mit, wie Sie wollen, als alle Änderungen von zuvor wiederherstellen. Angenommen, Sie haben Ihr Fütterungsmaterial von einigem Zweig in die master getan, und Sie es nicht mögen:

  1. git reflog -20 - geben Ihnen letzte 20 Positionen des Kopfes mit einer kleinen Beschreibung
  2. git checkout <the_branch_name> - legen Ihre HEAD auf dem Zweig
  3. git reset --hard <old_sha1_found_in_reflog> - platziert Ihren Kopf und Zweig auf dem alten Verweis, auf diese Weise können Sie alte Zweig wiederherstellen.

Es gibt einige Mechanik hier zu verstehen:

  1. Sie nie etwas in git löschen, nicht mit Befehlen, sowieso. Es ist der Garbage Collector, der nicht referenzierte Zweige durchläuft und löscht (standardmäßig 3 Monate). So existiert Ihr Zweig von vor dem Rebase noch.
  2. Das gleiche gilt für die gleiche Filiale Rebase, es ist nur ein neuer Baum neben dem alten umgeschrieben.
  3. Die ganze Geschichte von rebase und Ihre anderen auf HEAD Manipulationen in der reflog
  4. geschrieben Sie @{N} Anmerkungen von reflog

So verwenden können, nichts nach dem rebase verloren, man muss nur wissen, wie um es zu finden und wiederherzustellen.

Zum Beispiel können Sie sich ein Tag vor dem rebase setzen, als es wiederherstellen oder löschen. Es entzieht Ihnen den gesamten SHA1-Forschungsschritt.

1

Wenn Sie wollen einfach nur sehen, ob die rebase erfolgreich, aber dann wollen würde Sie auf „Rollback“ können Sie reposition the branch tip wieder auf den ursprünglichen begehen alway. Markieren oder notieren Sie sich das Original SHA.

Oder vielleicht einfacher, eine neue temporäre Niederlassung schaffen, in dem auf „Stufe“ der Fütterungsmaterial:

git checkout your-branch 
git checkout -b tmp 
git rebase other-branch 

Wenn es erfolgreich war, aber sie wollen „zurück rollen,“ your-branch unberührt ist. Nur git branch -D tmp und du bist zurück, wo du angefangen hast.

Wenn es Konflikte gab und Sie etwas Arbeit unternommen haben, um sie zu lösen, und Sie jetzt die Rebase beibehalten möchten, positionieren Sie einfach Ihre Zweigstelle auf tmp (und dann git branch -D tmp).