2013-06-24 6 views
5

Die Frage ist, über einige Randfall git-flow Methodikgit-Flow: Wie einige Änderungen am Release-Zweig vorgenommen, um zu verhindern zurück zur Entwicklung verschmelzenden

Ich habe eine Art von typischen git-Flow Geschichte wie folgt aus:

 o---o---o---o [release-3.5.0] 
    /
----o---o---o---o---o [development] 

Git-flow sagte uns Release-3.5.0 Niederlassung in Entwicklung dann verschmelzen lassen Sie bereit ist. Also, schließlich werden wir ALLE Änderungen erhalten, die bei Release-Zweig in Entwicklung Zweig gemacht werden.

 o---o---o---o 
    /   \ 
----o---o---o---o---o [development] 

Nun stell dir vor, wir haben eine Festschreibung ‚X‘ auf Release-Zweig, was wir NICHT an Entwicklungszweig will, zum Beispiel ist es eine Art von Hack/Hotfix oder anderes, das bereits in der Entwicklung festgelegt ist in vernünftige Weise (dh durch begehen Y)

 o---X---o---o [release-3.5.0] 
    /
----o---o---o---Y---o [development] 

so ist die wichtigste Frage, wie man mit solchen Situationen umgehen? Wie kann verhindert werden, dass dieses Commit (oder Commit) wieder in die Entwicklung zurückkehrt?

+0

Mögliches Duplikat [git - Skipping spezifischer Commits beim Einarbeiten] (http ://Paketüberfluss.com/questions/727994/git-skipping-specific-commits-wenn-merging) – Lu55

Antwort

7

Während die Antworten rebase empfehlen und/oder fusionieren/Revert/Squash funktionieren wird, ich persönlich denke, die bessere Antwort sein würde:

git checkout development 
git merge --no-commit release-3.5.0 
# make whatever changes you need to fixup the "hack" and/or clean up any conflicts 
git commit 
+0

Das '--no-commit' erzeugt keine 'merge info'. Release-Zweig wird im Verlauf nicht als zusammengeführt angezeigt, nicht als durch einen Befehl wie 'git branch --merged' zusammengefasst. So kann man es aus Versehen versehentlich wieder zusammenführen. – Olegas

+2

@Olegas Während Ihr Kommentar technisch korrekt ist, wird * nach dem obigen vollständigen Workflow * "merge info" erstellen (unter der Annahme, dass Sie damit eine Kombination aus der merge-formatierten Commit-Nachricht und/oder den übergeordneten Zeigern meinen, die eine Zusammenführung erzeugen History DAG), aber es ist der letzte 'git commit', der diese erstellt. Das 'git merge --no-commit' richtet nur Dinge ein, damit die entsprechenden Metadaten erzeugt werden. Wenn Sie 'git branch --merged' vor dem letzten 'git commit' versuchen, wird es korrekt anzeigen, dass die Verzweigung noch nicht zusammengeführt wurde, da die Zusammenführung nicht festgeschrieben wurde ... – twalberg

+1

ja, Sie haben Recht. Nach der Festschreibung alles in Ordnung ist, einschließlich Merge-Informationen, ich habe mich geirrt. – Olegas

1

haben Sie mehrere Möglichkeiten:

1) git rebase -i

In diesem Modus können Sie Ihren Release-Zweig auf dem Entwicklungszweig rebase und der X-te verpflichten auszuschließen.

Warnung Sie verwirren die bestehende geklonte Repositories in diesem Fall.

2) verwenden git cherry-pick

In diesem Modus werden Sie die Möglichkeit haben, verpflichtet sich einer nach dem anderen zu holen.

3) verwenden git rebase -i auf einem separaten Zweig und verschmelzen sie danach, wie es in dieser Antwort angegeben: Is it possible to exclude specific commits when doing a git merge?

+0

'rebase' ist nicht geeignet Ursache 'die Warnung, die Sie notiert,' Cherry-Pick' ist akzeptabel, aber zu kompliziert Ursache' Release-Zweig Ich habe auch viele commit (aber es kann irgendwie automatisiert werden). – Olegas

+1

cherry-pick erlaubt tatsächlich die Auswahl einer Reihe von Commits (http://stackoverflow.com/a/1994491/696792), aber dies beinhaltet auch einige Probleme (in der verknüpften Antwort angegeben) – StKiller

+0

Die Antwort mit dem dritten Weg aktualisiert. – StKiller

2

In solchen Szenarien Sie immer wollen vollständig die Release (-ähnlichen) Zweige zusammenführen. Stellen Sie also sicher, dass nichts fehlt.

Aber während der Zusammenführung können Sie den Inhalt frei ändern - einschließlich einige Änderungen zu löschen oder zu wiederholen. In Ihrem Beispielfall führen Sie den Zweig zusammen, setzen Sie den Commit, den Sie nicht mögen, zurück und zerquetschen Sie diesen in den Merge-Commit. Offensichtlich notieren Sie sich in der Merge-Commit-Nachricht dieser Aktion.

Wenn sich das Update bereits auf devel befindet, wird es einfach übersprungen, oder Sie lösen den Konflikt, indem Sie die devel-Version auswählen.

Der Punkt ist, Sie wollen die Geschichte zeigen als Ihre zweite Figur, und der Staat, wie es am besten Sinn macht.