Ich versuche, das Skript neu zu basieren, und mein Skript nimmt unterschiedliche Pfade, je nachdem, ob das erneute Basieren zu Konflikten führt.
Gibt es eine Möglichkeit zu bestimmen, ob eine Rebase zu Konflikten führen würde, bevor die Rebase ausgeführt wird?
git
git-rebase
git-merge-conflict
Jonathan.Brink
quelle
quelle
git rebase
Befehls, den Sie verwenden? Verwenden Sie optionale Flags? Und welche Skriptsprache verwenden Sie? Schale?git rebase
einen Zusammenführungskonflikt ausführen und ausführen , wird der Prozess gestoppt und mit einem Status ungleich Null beendet. Sie können den Exit-Status des Rebase-Vorgangs überprüfen und, wenn er nicht Null ist, ausführengit rebase --abort
, um den Vorgang abzubrechen.Antworten:
Zum Zeitpunkt des Schreibens (Git
v2.6.1v2.10.0) bietet dergit rebase
Befehl keine--dry-run
Option. Es gibt keine Möglichkeit zu wissen, ob Sie in Konflikte geraten, bevor Sie tatsächlich versuchen, eine Rebase durchzuführen.Wenn Sie jedoch
git rebase
einen Konflikt ausführen und darauf stoßen, wird der Prozess mit einem Status ungleich Null gestoppt und beendet. Sie können den Exit-Status der Rebase-Operation überprüfen und, falls er nicht Null ist, ausführengit rebase --abort
, um die Rebase abzubrechen:quelle
git checkout --detach foo
.git reset --hard ORIG_HEAD
den Zweig auch verwenden , um ihn wieder an den Ort vor der Neubasis zu verschieben.Wenn Sie nur sehen wollen , wenn das Fütterungsmaterial sei erfolgreich , aber dann wollen Sie auf „roll back“ können Sie alle Tage die Zweigspitze neu positionieren zurück verpflichten zum Original. Markieren Sie einfach die ursprüngliche SHA oder notieren Sie sie.
Oder erstellen Sie einfach einen neuen temporären Zweig, in dem Sie die Rebase "inszenieren" können:
Wenn es erfolgreich war, Sie aber "zurückrollen" möchten,
your-branch
bleibt es unberührt. Nurgit branch -D tmp
und du bist wieder da, wo du angefangen hast.Wenn es Konflikte gab und Sie einige Arbeit geleistet haben, um sie zu lösen, und Sie jetzt die Basis behalten möchten, positionieren Sie einfach Ihren Zweig-Tipp auf
tmp
(und danngit branch -D tmp
).quelle
git checkout -b tmp your-branch
Ich vermute, dass
git rebase ... --dry-run
dies aus folgendem Grund nicht möglich ist.Wenn Sie a
git rebase
ausführen, wird git zum Startpunkt zurückgesetzt und dann schrittweise Patches für jedes Commit angewendet, um den Zweig auf den neuesten Stand zu bringen. Wenn ein Konflikt auftritt, wird er angehalten und darauf gewartet, dass Sie den Konflikt lösen, bevor Sie fortfahren. Der Weg, den die Rebase nach diesem Konflikt einschlägt, hängt davon ab, wie Sie den Konflikt lösen. Wenn Sie ihn auf eine bestimmte Weise lösen, kann dies zu späteren Konflikten führen (oder diese beseitigen).Sie können also
git rebase ... --dry-run
nur den ersten Konflikt angeben - Berichte über spätere Konflikte hängen davon ab, wie dieser erste Konflikt gelöst wird.Ich kann mir nur
git diff
vorstellen, dies zwischen der aktuellen Position und dem letzten Commit in dem Zweig zu tun, auf den Sie zurückgreifen. Aber das gibt Ihnen nicht wirklich das, wonach Sie suchen - Sie brauchen wirklich nur eine Liste widersprüchlicher Änderungen zwischen den beiden Punkten. Es gibt vielleicht eine Möglichkeit, dies zu tungit diff
, aber es ist kein normaler Patch.quelle
Sie können immer noch Git-Rebase durchführen, damit spielen, wie Sie möchten, und dann alle Änderungen von zuvor wiederherstellen. Angenommen, Sie haben einen Zweig in den Zweig zurückgesetzt
master
und es gefällt Ihnen nicht:git reflog -20
- gibt Ihnen die letzten 20 Positionen Ihres KOPFES mit einer kleinen Beschreibunggit checkout <the_branch_name>
- Platziert Ihren KOPF auf dem Astgit reset --hard <old_sha1_found_in_reflog>
- Platziert Ihren KOPF und Zweig auf dem alten Ref. Auf diese Weise können Sie den alten Zweig wiederherstellen.Hier sind einige Mechaniken zu verstehen:
rebase
und Ihre anderen Informationen zu HEAD-Manipulationen sind in derreflog
@{N}
Anmerkungen von verwendenreflog
Nach dem
rebase
geht also nichts verloren , Sie müssen nur wissen, wie Sie es finden und wiederherstellen können.Zum Beispiel können Sie sich ein Tag setzen, bevor Sie darauf
rebase
zurückgreifen oder es löschen. Es entzieht Ihnen den gesamten SHA1-Forschungsschritt.quelle
Aufbauend auf der Lösung von @joneit :
Erstellen Sie einen neuen
temp
Zweig ausyour-branch
und versuchen Sie, diesen temporären Zweig auf Folgendes umzustellennew-base
:zB um zu testen, ob der Zweig
feature1
auf Folgendes zurückgesetzt werden kannmaster
:quelle