Unser Unternehmen verwendet derzeit ein einfaches Trunk- / Release- / Hotfixes-Verzweigungsmodell und möchte Ratschläge dazu, welche Verzweigungsmodelle für Ihr Unternehmen oder Ihren Entwicklungsprozess am besten geeignet sind.
Workflows / Verzweigungsmodelle
Im Folgenden sind die drei Hauptbeschreibungen aufgeführt, die ich gesehen habe, aber sie widersprechen sich teilweise oder gehen nicht weit genug, um die nachfolgenden Probleme zu lösen, auf die wir gestoßen sind (wie unten beschrieben). Daher verwendet unser Team bisher standardmäßig nicht so gute Lösungen. Machst du etwas besseres
Zusammenführen gegen erneutes Basieren (Wirren gegen sequentielle Geschichte)
Sollte man
pull --rebase
oder mit dem Zusammenführen zur Hauptlinie warten, bis Ihre Aufgabe beendet ist? Persönlich neige ich zur Verschmelzung, da dadurch eine visuelle Darstellung erhalten bleibt, auf welcher Basis eine Aufgabe gestartet und beendet wurde, und ich bevorzuge sogarmerge --no-ff
diesen Zweck. Es hat jedoch andere Nachteile. Viele haben auch die nützliche Eigenschaft des Zusammenführens nicht erkannt - dass es nicht kommutativ ist (das Zusammenführen eines Themenzweigs mit dem Master bedeutet nicht, dass der Master mit dem Themenzweig zusammengeführt wird).Ich suche einen natürlichen Workflow
Manchmal passieren Fehler, weil unsere Verfahren eine bestimmte Situation nicht mit einfachen Regeln erfassen. Zum Beispiel sollte ein Fix, der für frühere Releases benötigt wird, natürlich so weit stromabwärts basieren, dass er stromaufwärts in alle erforderlichen Zweige integriert werden kann (ist die Verwendung dieser Begriffe klar genug?). Es kommt jedoch vor, dass ein Fix es in den Master schafft, bevor der Entwickler erkennt, dass er weiter stromabwärts platziert werden sollte, und wenn dies bereits vorangetrieben ist (noch schlimmer, zusammengeführt oder etwas, das darauf basiert), bleibt die verbleibende Option Kirschpflücken mit die damit verbundenen Gefahren. Welche einfachen Regeln wie diese verwenden Sie?Darin ist auch die Unbeholfenheit eines Themenzweigs enthalten, der notwendigerweise andere Themenzweige ausschließt (vorausgesetzt, sie sind von einer gemeinsamen Grundlinie verzweigt). Entwickler möchten eine Funktion nicht beenden, um eine andere zu starten. Sie haben das Gefühl, dass der Code, den sie gerade geschrieben haben, nicht mehr vorhanden ist
Wie vermeide ich Zusammenführungskonflikte (aufgrund von Cherry-Pick)?
Ein sicherer Weg, einen Zusammenführungskonflikt zu erzeugen, besteht darin, zwischen Zweigen zu wählen. Sie können nie wieder zusammengeführt werden. Würde das Anwenden des gleichen Commits beim Zurücksetzen (wie geht das?) In beiden Zweigen möglicherweise diese Situation lösen? Dies ist ein Grund, warum ich es nicht wage, auf einen weitgehend auf Zusammenführungen basierenden Workflow zu drängen.
Wie zerlegt man sich in aktuelle Zweige?
Wir sind uns bewusst, dass es fantastisch wäre, eine fertige Integration aus Themenzweigen zusammenzustellen, aber oft ist die Arbeit unserer Entwickler nicht klar definiert (manchmal so einfach wie "Stöbern") und wenn ein Code bereits in ein "anderes" Thema eingegangen ist, es kann dort nicht wieder herausgenommen werden, gemäß der obigen Frage? Wie arbeiten Sie mit der Definition / Genehmigung / Abschluss / Freigabe Ihrer Themenbereiche?
Richtige Verfahren wie Codeüberprüfung und Abschluss wären natürlich sehr schön.
Aber wir können die Dinge einfach nicht genug entwirren, um dies zu bewältigen - irgendwelche Vorschläge? Integrationszweige, Illustrationen?
Unten finden Sie eine Liste verwandter Fragen:
- Welche guten Strategien ermöglichen es, dass bereitgestellte Anwendungen Hotfixing-fähig sind?
- Workflow-Beschreibung für die Verwendung von Git für die Eigenentwicklung
- Git-Workflow für die Entwicklung von Linux-Kerneln für Unternehmen
- Wie pflegen Sie Entwicklungscode und Produktionscode? (Danke für dieses PDF!)
- Git veröffentlicht Management
- Git Cherry-Pick gegen Merge Workflow
- Wie man mehrere Commits auswählt
- Wie füge ich ausgewählte Dateien mit git-merge zusammen?
- So wählen Sie eine Reihe von Commits aus und verschmelzen zu einem anderen Zweig
- ReinH Git Workflow
- Git-Workflow zum Vornehmen von Änderungen, die Sie niemals zum Ursprung zurückschieben werden
- Wählen Sie eine Zusammenführung aus
- Richtiger Git-Workflow für kombiniertes Betriebssystem und privaten Code?
- Projekt mit Git pflegen
- Warum kann Git keine Änderungen an Merge-Dateien mit einem geänderten übergeordneten / Master ändern?
- Git Branching / Rebasing Good Practices
- Wann bringt mich "git pull --rebase" in Schwierigkeiten?
- Wie wird DVCS in großen Teams eingesetzt?
Lesen Sie auch, was Plastic SCM über die aufgabengesteuerte Entwicklung schreibt. Wenn Sie sich nicht für Plastic entscheiden, lesen Sie das Verzweigungsmodell von nvie und seine unterstützenden Skripte .
Antworten:
Das beunruhigendste Merkmal, das neue Entwickler von DVCS erkennen müssen, betrifft den Veröffentlichungsprozess :
Daher können Sie einige Regeln einhalten, um Ihre Fragen zu vereinfachen:
Jetzt:
Workflows / Verzweigungsmodelle :
Jeder Workflow unterstützt einen Release-Management-Prozess , der auf jedes Projekt zugeschnitten ist.
Was ich dem von Ihnen erwähnten Workflow hinzufügen kann, ist: Jeder Entwickler sollte keinen Feature-Zweig erstellen, sondern nur einen "aktuellen Entwickler" -Zweig, denn die Wahrheit ist: Der Entwickler weiß oft nicht, was genau sein Zweig produzieren wird: einen Feature, mehrere (weil es ein zu komplexes Feature war), keines (weil es nicht rechtzeitig zur Veröffentlichung bereit war), ein anderes Feature (weil das Original "verwandelt" hatte), ...
Nur ein "Integrator" sollte offizielle Feature-Zweige in einem "zentralen" Repo einrichten, die dann von Entwicklern abgerufen werden können, um den Teil ihrer Arbeit, der zu diesem Feature passt, neu zu starten / zusammenzuführen.
Zusammenführen gegen erneutes Basieren (Wirren gegen sequentielle Geschichte) :
Ich mag meine Antwort, die Sie erwähnen (" Workflow-Beschreibung für die Verwendung von Git für die interne Entwicklung ")
Ich suche einen natürlichen Workflow :
Bei Korrekturen kann es hilfreich sein, jede Korrektur mit einem Ticket aus einer Fehlerverfolgung zu verknüpfen. Auf diese Weise kann sich der Entwickler daran erinnern, wo (dh in welchem Zweig, dh in einem dedizierten Zweig "für Korrekturen") solche Änderungen vorgenommen werden sollten.
Dann können Hooks helfen, ein zentrales Repo vor Pushs vor nicht validierten Bugfixes oder vor Zweigen zu schützen, von denen aus man nicht pushen sollte. (Keine spezifische Lösung hier, all dies muss an Ihre Umgebung angepasst werden)
Wie vermeide ich Zusammenführungskonflikte (aufgrund von Cherry-Pick)?
Wie Jakub Narębski in seiner Antwort feststellte , sollte das Pflücken von Kirschen seltenen Situationen vorbehalten sein, in denen dies erforderlich ist.
Wenn Ihr Setup viel Kirschernte beinhaltet (dh "es ist nicht selten"), ist etwas nicht in Ordnung.
git revert
sollte sich darum kümmern, aber das ist nicht ideal.Solange eine Branche noch nicht überall vertreten ist, sollte ein Entwickler seine Commit-Historie neu organisieren (sobald er / sie endlich sieht, dass die Entwicklung eine endgültigere und stabilere Form annimmt) in:
Richtige Verfahren wie Codeüberprüfung und Abschluss?
Integrationszweige (in einer dedizierten Integration) repo kann dem Entwickler helfen:
quelle
rebase --interactive --autosquash
werden automatisch alle Commits mit demselben Beginn einer anderen Commit-Nachricht verschoben. Wenn diese Commits eine Ticketnummer verwenden (zum Beispiel), ermöglicht der Autosquash eine schnelle Neuordnung dieser Commits, auch wenn die mit diesem Ticket verbundenen Korrekturen zu diesem Zeitpunkt nicht nacheinander vorgenommen wurden.Ich denke, und ich könnte mich irren, dass eines der Dinge, die am meisten an Git missverstanden werden, seine verteilte Natur ist. Dies macht es ganz anders, Subversion in der Art und Weise zu sagen, wie Sie arbeiten können, obwohl Sie das SVN-Verhalten nachahmen können, wenn Sie möchten. Das Problem ist, dass so ziemlich jeder Workflow funktioniert, was großartig, aber auch irreführend ist.
Wenn ich die Kernelentwicklung richtig verstanden habe (ich werde mich darauf konzentrieren), hat jeder sein eigenes Git-Repository für die Entwicklung des Kernels. Es gibt ein Repository, linux-2.6.git, das von Torvalds betreut wird und als Release-Repository fungiert. Die Leute klonen von hier aus, wenn sie ein Feature für den Zweig "Release" entwickeln möchten.
Andere Repositories entwickeln sich weiter. Die Idee ist, von Linux-2.6 zu klonen und so oft zu verzweigen, wie Sie möchten, bis Sie eine funktionierende "neue" Funktion haben. Wenn dies fertig ist, können Sie es einer vertrauenswürdigen Person zur Verfügung stellen, die diesen Zweig aus Ihrem Repository in ihr Repository zieht und ihn in den Mainstream einfügt. Im Linux-Kernel geschieht dies auf mehreren Ebenen (vertrauenswürdige Leutnants), bis es Linux-2.6.git erreicht und an diesem Punkt "der Kernel" wird.
Hier wird es verwirrend. Zweigstellennamen müssen überhaupt nicht in allen Repositorys konsistent sein. So kann
git pull origin master:vanilla-code
ich einen Zweig vomorigin
Master in einem Zweig in meinem Repository namens abrufenvanilla-code
. Vorausgesetzt, ich weiß, was los ist, spielt es keine Rolle - es wird in dem Sinne verteilt, dass alle Repositorys Peers miteinander sind und nicht nur auf mehreren Computern wie SVN gemeinsam genutzt werden.Vor diesem Hintergrund:
head
. Releases können Tags oder Zweige sein, und Hotfixes sind wahrscheinlich Zweige für sich. In der Tat würde ich wahrscheinlich Releases als Zweige machen, damit Sie sie weiter patchen können.origin
Sie sollten in Ihrem Repository, wahrscheinlich einen anderen Zweig machen und die neuesten verschmelzenmaster
inyourbranch
so , dass jemand anderes Ihre Änderungen mit so wenig Aufwand ziehen kann möglich. Nach meiner Erfahrung besteht sehr selten die Notwendigkeit, wirklich neu zu gründen.git add .
und danngit commit
.Ich hoffe das hilft. Mir ist klar, dass VonC gerade eine sehr ähnliche Erklärung gepostet hat ... Ich kann nicht schnell genug tippen!
Bearbeiten Sie einige weitere Gedanken zur Verwendung von Git in einer kommerziellen Umgebung, da dies aus den Kommentaren für das OP relevant erscheint:
product.git
, ist für eine Reihe von erfahrenen Programmierern / Technikern zugänglich, die für die eigentliche Pflege des Produkts selbst verantwortlich sind. Sie sind analog zur Rolle der Betreuer in OSS.Was passiert also? Nun, jeder zieht zu Beginn eines jeden Tages aus der "Upstream" -Quelle, dh dem Release-Repository (das wahrscheinlich auch das neueste Material aus der Entwicklung der vorherigen Tage enthalten wird). Jeder macht das direkt. Dies wird in einem Zweig in ihrem Repository geschehen, wahrscheinlich "Master" genannt, oder wenn Sie mich "Neueste" nennen. Der Programmierer erledigt dann einige Arbeiten. Diese Arbeit könnte etwas sein, bei dem sie sich nicht sicher sind, also machen sie einen Zweig, erledigen die Arbeit. Wenn es nicht funktioniert, können sie den Zweig löschen und zurückgehen. In diesem Fall müssen sie in den Hauptzweig übergehen, an dem sie gerade arbeiten. Wir werden sagen, dass dies ein UI-Programmierer ist, an dem
latest-ui
er arbeitet,git checkout latest-ui
gefolgt vongit merge abc-ui-mywhizzynewfeature
. Dann sagt er seinem technischen Leiter (dem UI-Leiter), hey, ich habe eine solche Aufgabe erledigt, zieh mich zurück. Der UI-Lead tut dies alsogit pull user-repo lastest-ui:lastest-ui-suchafeature-abc
. Der UI-Leiter sieht es sich dann in diesem Zweig an und sagt, eigentlich ist das sehr gut, ich werde es zusammenführenui-latest
. Er könnte dann jedem unter ihm sagen, erui-latest
solle an seinen Zweigen oder dem Namen, den sie ihnen gegeben haben, von ihm abziehen , und so wird die Funktion von den Entwicklern untersucht. Wenn das Team zufrieden ist, kann der UI-Leiter den Testleiter bitten, sich von ihm zu lösen und die Änderungen zusammenzuführen. Dies wird an alle (nach der Änderung) weitergegeben, die sie testen und Fehlerberichte usw. einreichen. Wenn die Funktion die Tests usw. besteht, wird sie möglicherweise von einem der wichtigsten technischen Leiter in die aktuelle Arbeitskopie des Programms eingefügt Alle Änderungen werden dann wieder nach unten weitergegeben. Und so weiter.Es ist keine "traditionelle" Arbeitsweise und wurde eher als "Peer-gesteuert" als als "hierarchisch" wie SVN / CVS konzipiert. Im Wesentlichen hat jeder Commit-Zugriff, jedoch nur lokal. Es ist der Zugriff auf das Repository und das Repository, das Sie als Release-Repo festlegen, mit dem Sie die Hierarchie verwenden können.
quelle
Ein Modell, das ich mit guten Ergebnissen verwendet habe, ist das folgende:
Ein "gesegnetes" Repo, das jeder schiebt und von / zu zieht, im Grunde eine Client-Server-Topologie.
Es gibt keinen Hauptzweig, so dass kein Entwickler Code in "mainline" verschieben kann.
Alle Entwicklungen finden in Themenbereichen statt. Wir haben Namen benannt, um leicht zu erkennen, wer dafür verantwortlich ist: jn / newFeature oder jn / issue-1234
Es gibt auch eine 1: 1-Zuordnung zwischen Zweigen und Kanban / Scrum-Karten auf dem Whiteboard.
Um einen Zweig freizugeben, wird er in das gesegnete Repo geschoben und die Kanban-Karte wird zur Überprüfung bereitgelegt.
Wenn der Zweig dann von der Überprüfung akzeptiert wird, ist er ein Kandidat für eine Freigabe.
Eine Freigabe erfolgt, wenn eine Reihe akzeptierter Zweige zusammengeführt und mit einer Versionsnummer versehen werden.
Durch Verschieben des neuen Tags in das gesegnete Repo entsteht eine neue mögliche Basis für neue Funktionen.
Um Zusammenführungskonflikte zu vermeiden, werden Entwickler gebeten, ihre unveröffentlichten Zweige auf das neueste Release-Tag zu aktualisieren (zusammenzuführen).
quelle
Persönlich versuche ich, nur Release-fähigen Code in der Hauptniederlassung zu behalten.
Wenn ich an einer neuen Funktion oder einem neuen Bugfix arbeite, mache ich das in einem Zweig. Ich habe auch Unit-Test in der Branche. Wenn alles in Ordnung ist, füge ich erst dann wieder den Master hinzu.
Ich versuche auch, gängige Namenskonventionen für Zweige zu verwenden, wie z.
quelle