move verpflichtet sich von einem Zweig zum anderen

8

Ich habe einen Baum:

%Vor%

wobei 'b' von 'a' abhängt. Dann merke ich, dass ich einige Änderungen in Bezug auf das Thema 'a' machen muss, um mit 'b' fortzufahren, aber ich würde sie gerne auf 'b' als einen normalen Entwicklungskurs von 'b' machen:

%Vor%

Wenn dann das, was ich auf 'b' erreichen möchte, fertig ist, möchte ich, dass mein Baum so aussieht:

%Vor%

als ob ich tatsächlich alle Änderungen an 'a' gemacht hätte, dann habe ich sie auf 'b' zusammengeführt und dann auf 'b' fortgesetzt.

Ich weiß, dass ich das manuell machen kann:

1- rebase / cherry-pick 'a' verpflichtet sich von Zweig 'b' zu 'a'
2- Erstellen Sie einen temporären Zweig 'b-tmp' auf 'b'.
3- Setzen Sie den Zweig 'b' auf 'b2' zurück.
4 - füge 'a' auf 'b' zusammen.
5- Rebase / Cherry-Pick 'b' verpflichtet sich von 'b-tmp' auf 'b'.
6- lösche Zweig 'b-tmp'.

Ich kann ein Skript dafür erstellen, ich würde nur gerne wissen, ob es bessere Möglichkeiten / Ideen gibt, dies zu tun, außer diesen 6 Schritten.

    
chila 25.09.2011, 14:02
quelle

1 Antwort

8

Lassen Sie mich mit der Aussage beginnen, dass ich die Zweige des Themas lieber integrieren würde (Früh integrieren, Oft bauen ... klingelt?). In der Tat, wenn es Änderungen gibt, die irgendwann auf eine gehen sollten, würde ich zurückgehen, die Änderungen an a vornehmen und b über neu einfügen a .

Wenn a für einen anderen Zweck stabil sein muss, mache ich einen a-for-b Zweig, um die Arbeit vorübergehend zu speichern und neu zu erstellen b darüber.

Wenn Sie unbedingt mit arbeiten müssen

Hinweis: Screencasts inklusive

Zum Startpunkt gelangen

Dies ist ein einfacher funktionierender Baum mit dem Layout aus der Frage:

%Vor%

Siehe Screencast hier

Reorganisationen von Commits auf ihre Zweigstellen

%Vor%

Wieder siehe Screencast

Überprüfung der Ergebnisse

Wir können nun einen Vorher-Nachher-Vergleich durchführen:

%Vor%

Macht es dauerhaft:

%Vor%

Notizen

Ich habe mich bewusst dafür entschieden, für die Demo keine widersprüchlichen Änderungen vorzunehmen. Natürlich werden Sie im wirklichen Leben Zusammenführungskonflikte bekommen. Verwende git mergetool und git rebase --continue .

Wenn Ihre Änderungen hygienisch sind und wirklich zu ihren jeweiligen Zweigstellen gehören, besteht die Chance, dass Konflikte nur wenige und leicht zu lösen sind. Andernfalls ist es an der Zeit, Ihr Verzweigungsschema zu überarbeiten (siehe Martin Fowler e.a.)

Diskussion

Als Antwort auf

  

Sie sagen auch, dass "wenn es Änderungen gibt, die irgendwann auf" a "übergehen sollten, würde ich zurückgehen, die Änderungen an" a "vornehmen und" b "auf" a "zurücksetzen. Ich bin mir nicht sicher, ob ich das auch verstehe. Kannst du es erklären?

Ich meine, dass ich versuchen würde, die a3-, a4-, a5-Revisionen für den a Zweig sowieso zu machen und b auf diesen zu setzen, also

  • Die Person, die die Zusammenführung vornimmt, ist dieselbe Person, die die Commits durchführt
  • Sie machen das Commit und fusionieren nacheinander (was bedeutet, dass Sie die Dinge aufgrund von Kurzzeitgedächtnisverlusten nicht durcheinander bringen) <-- this is the Merge Early/Soon/Frequently mantra
  • Sie vermeiden unnötige Konflikte verschmelzen
  • Sie müssen später nicht mehr in die Vergangenheit zurückgehen und die ursprünglichen Commits neu schreiben: a3, a4, a5 würden einfach zusammengeführt und nicht kopiert (siehe Git Cherry-Pick vs Merge Workflow )

Hier ist der Einstiegspunkt, aber angepasst an meinen idealisierten Workflow. Beachten Sie, dass das Endergebnis dieses alternativen Ergebnisses bereits genau ist, was Sie nach all dem Jonglieren erreicht haben, das oben unter 'Reorganisieren von Commits in ihre Zweigzweige' gezeigt wurde!

%Vor%

Beachten Sie, dass es in der Praxis nicht schwierig ist, zum a-Zweig zurückzukehren, um Ihre a3 / a4 / a5-Commits zu committen:

  • für den Fall, dass Sie nur bemerkt haben, dass Sie Dinge berührt haben, die zu diesem Zweig gehören, können Sie einfach in den a Zweig mit ausstehenden lokalen Änderungen wechseln 2
  • Sie dann selektiv (!!) Stellen Sie die Teile, die auf den Zweig a ( git add -i oder ähnlich in git guis oder zB vim fugitive )
  • commit auf a
  • Wechseln Sie zurück zum Zweig b ( git checkout b )
  • verbinde die restlichen Bits
  • rebase b auf die letzte Revision in a

2 solange sie nicht mit anderen Änderungen von a..b in Konflikt stehen; In diesem Fall hätten Sie git stash first und git stash apply , wenn Sie sich im a Zweig

befinden     
sehe 25.09.2011 14:47
quelle

Tags und Links