Interaktives Rebase eines Branchs mit seinem Divergenzpunkt vom Master

Lesezeit: 4 Minuten

Benutzer-Avatar
Aaron

Nehmen wir an, ich habe einen Themenzweig, dessen gesamte Historie ich neu schreiben möchte, da er ursprünglich vom Master für eine Pull-Anforderung erstellt wurde. Aus irgendeinem Grund ist die Verwendung nicht einfach oder offensichtlich git log um den Commit-Hash zu bestimmen, an den ich übergeben möchte

git rebase -i <commit>

Ich weiß, dass ich es gebrauchen kann git merge-base <branch1> <branch2 || master> um den Commit zu finden, von dem zwei Referenzen ihre Vorfahren verfolgen können, und dies verwenden können, um den Commit zu bestimmen. Was ich gerne wissen würde, ist, ob es einen besseren Weg gibt, diesen ganzen Zweig (ob der Meister fortgeschritten ist oder nicht) interaktiv umzubasieren, als zu verwenden

git rebase -i `git merge-base my_branch master`

BEARBEITEN: Ich möchte das übergeordnete Element des ersten Commits, das auf diesem Zweig vorgenommen wurde, nicht ändern git rebase -i master würde nur in dem Fall funktionieren, in dem beide Master nicht fortgeschritten sind, seit der Zweig erstellt wurde, und der Zweig von dem Commit-Master erstellt wurde, auf den er derzeit zeigt.

  • Dies ist keine Antwort, sondern ein interessanter Hack, den ich mir ausgedacht habe. Ich habe folgendes in mein .profile eingefügt. function gri() { git rebase -i `git merge-base $@ master` }

    – Aaron

    3. Mai 2012 um 14:04 Uhr


  • Ich konnte nichts besseres finden, aber Sie können ersetzen my_branch durch HEAD.

    – Konrad

    27. Juni 2018 um 5:26 Uhr

Vielleicht verstehe ich deine Frage falsch, aber ich denke git rebase -i master soll machen was du willst. Es wird die Zusammenführungsbasis ermitteln und die gesamte Verzweigung von diesem Punkt bis zum aktuellen HEAD umbasieren, so dass es so aussieht, als wäre sie von der aktuellen Spitze des Masters verzweigt worden.

Wenn der Master nicht fortgeschritten ist, ist das Rebasing so ziemlich ein No-Op.

  • Vielen Dank. Später wurde mir klar, dass git rebase -i master das tun würde, aber was wäre, wenn ich interaktiv rebasen wollte, ohne den Leiter meines Zweigs zum aktuellen Leiter des Masters zu machen, falls sie nicht bereits derselbe wären.

    – Aaron

    2. Mai 2012 um 20:48 Uhr

  • Wenn Sie eingeschaltet sind my-branch und Renn git rebase -i masteres wird nur die aktualisieren my-branch ref – es wird nicht aktualisiert master. Rebasing verschiebt die aktuell zu einem anderen Punkt auf seinem übergeordneten Zweig verzweigen (oder möglicherweise zu einem völlig anderen übergeordneten Zweig, wenn Sie verwenden --onto), ändert aber keine anderen Branches.

    – Twalberg

    2. Mai 2012 um 21:17 Uhr

  • Nachdem Sie das Ganze noch einmal durchgelesen haben, möchten Sie vielleicht nur die Commits auf Ihrem Zweig neu anordnen (möglicherweise einige überspringen oder kombinieren oder neu anordnen), ohne sie irgendwohin zu verschieben? In diesem Fall denke ich nur git rebase -i (ohne Angabe eines Zielzweigs) sollte dies tun.

    – Twalberg

    3. Mai 2012 um 12:43 Uhr


  • Vielen Dank! Ihr letzter Kommentar ist die von mir beabsichtigte Interpretation. Irgendwelche Änderungen, die Sie vorschlagen, um meine ursprüngliche Frage für andere wertvoller zu machen? Ich werde es einfach versuchen git rebase -i das nächste Mal. Ich weiß mit Sicherheit, dass das, was ich in der ursprünglichen Frage gepostet habe, funktioniert. Ich weiß nur, dass Merge-Base intern von Git verwendet wird, und dachte, es könnte eine andere Möglichkeit geben, meinen Ausdruck zu verkürzen.

    – Aaron

    3. Mai 2012 um 14:03 Uhr

  • Ich glaube, was ich beim ersten Mal übersehen habe, war, dass Sie nicht versucht haben, den Zweig zu verlegen, sondern ihn einfach neu anzuordnen. Ich persönlich neige dazu, zu verwenden rebase mehr zum Schneiden und Pfropfen von Zweigen an verschiedenen Stellen als zum Neuordnen und Squashing von Commits, also habe ich Ihre Frage aus einem anderen Blickwinkel betrachtet. Ich denke, es könnte hilfreich sein, klarzustellen, dass Sie nur den Verlauf eines vorhandenen Zweigs optimieren möchten, anstatt einen Zweig zu verschieben, da dies hilfreich sein könnte git rebase (und auch andere Unterbefehle) hat manchmal mehr als eine mögliche Verwendung …

    – Twalberg

    3. Mai 2012 um 15:21 Uhr

Ich habe nur eine iterative Verbesserung des von Ihnen aufgelisteten Befehls gefunden. Ihr Befehl:

git rebase -i `git merge-base my_branch master`

Eine Verbesserung wäre, dass Sie sich den Namen des Zweigs, den Sie rebasen möchten, nicht merken müssen. Angenommen, Sie befinden sich derzeit in dem Zweig, den Sie rebasen möchten (was meiner Erfahrung nach fast immer der Fall ist), könnten Sie Folgendes verwenden:

git rebase -i `git merge-base HEAD master`

1229490cookie-checkInteraktives Rebase eines Branchs mit seinem Divergenzpunkt vom Master

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy