2012-04-04 3 views
0

Ich habe ein Git-Repository, das ich auf Master Zweig in und ich glaube, dass Master sollte nicht eine lange laufenden Zweig zu entwickeln begonnen haben. Wie andere denke ich, dass die Meisterbranche immer das stabile Produkt hält.Ändern des Entwicklungs-Workflow in der Mitte des Projekts in Git

Also, ich möchte einen neuen Zweig mit dem Namen entwickeln öffnen und dieser Zweig wird ein lang laufender Entwicklung Zweig sein, aber ich bin mir nicht sicher, was wäre der beste Ansatz hier zu wechseln. Meine aktuelle Lösung ist dies:

die Niederlassung Aufmachen und schieben Sie es auf GitHub:

git checkout -b develop 
git push origin develop 

Dann master-Zweig zurück und stoppen Sie alle Dateien, Tracking mit Ausnahme README.md und schieben zum entfernten Repository (GitHub, in diesem Fall):

git checkout master 
git rm . --cached -r 
git add README.md 
git commit -m "cleaned up the master branch" 
git push origin master 

Was sind Ihre Gedanken?

+0

Das ergibt keinen Sinn. Können Sie erklären, was Sie erreichen wollen, indem Sie Ihren "Master" Zweig ausblenden? Das hat nichts damit zu tun, es stabil zu machen, es macht es einfach leer und nutzlos. Ich bin auch verwirrt, was Sie mit "lang laufenden" Zweigen meinen. Der Master sollte der * längste * laufende Zweig sein. Per Konvention sollte es der einzige Zweig sein, der immer in der Geschichte Ihres Projekts existiert. – meagar

+0

@meagar Ich denke, ich habe erklärt, was ich will: * Meister sollte kein langlaufender Zweig sein. Wie andere denke ich, dass die Master-Branche immer das stabile Produkt hält. Mit * long running * meinte ich Entwicklungszweig. – tugberk

+0

Der Zweig * master * kann und sollte das stabile Produkt enthalten, aber das bedeutet (wie gesagt), dass es der * am längsten laufende Zweig * sein sollte. Es sollte immer existieren, während Ihre Entwicklungs- und Feature-Zweige verschmelzen und verzweigen und verschwinden. – meagar

Antwort

2

Ihr Problem ist, mit dem Namen "Master"..

Ein Zweig ist ein Zweig. Keiner von ihnen ist wirklich wichtiger als jeder andere. Der Name ist im wahrsten Sinne des Wortes nur ein Tag - eine Zeichenfolge, die den aktuellen HEAD identifiziert und mit dem HEAD einhergeht. Aber die "Master" -Neigung eines Zweiges ist nur wichtig, weil das der Name ist, den git dem ersten Zweig gibt, den er in einem Projekt erstellt. Aber das ist nur ein Name. Nehmen wir Ihren aktuellen Master-Zweig und geben Sie ihm einen neuen Namen. Da, wie Sie es nennen, irrelevant ist, wählen wir "Steve".

git branch -m master steve 

Großartig. Jetzt hast du keinen Meisterzweig! Aber Sie haben den alten Steve Zweig, der historische Arbeit in sich hat. Das ist es wert, herum zu haben, aber weil du gerade eine Linie in den Sand in der Geschichte ziehst, wirst du wahrscheinlich nie wieder hineintauchen.

Also dann dev Zweig auszuchecken, arbeiten daran, etc. Und wenn es stabil (was immer das in Ihrem speziellen Fall bedeutet), erstellen Sie einen neuen Master

git checkout -b master 

Ha ha! Das erste Commit auf diesem Master-Zweig ist stabil, und Sie können sicherstellen, dass alle zukünftigen Commits auch sind! (BTW du willst --no-ff auf alle merges von devel in master, diese intermediate potenziell nicht-stable commits aus deinem glänzenden neuen "master" zweig zu halten.)

+2

+1; Dies war wahrscheinlich eine bessere (geduldiger) Art, Dinge zu erklären. @tugberk Als eine Randnotiz, wenn es "historisch" instabiler Code ist, den Sie vom Master fernhalten wollen (dh jeder Commit auf Master sollte stabil sein), ist dies unmöglich. Der Master wird (wenn du "checkout -b master" ausgibst) alle Entwicklungs-Commits enthalten, die du auf "develop" (oder "steve" in diesem Fall) gemacht hast. Sie können nicht "instabile" Sachen in diesem Sinne vom Meister fernhalten. In Git funktionieren Zweige einfach nicht so. – meagar

+0

@maegar - Shh! Ich habe versucht, dass er das nicht bemerkt! ;-) –

1

Das ist überhaupt nicht, wie Niederlassungen in Git arbeiten. Es gibt keinen Grund, alle Ihre Dateien von master zu entfernen, und tatsächlich wird dies master für die spätere Zusammenführung völlig nutzlos machen. Sie zwingen Ihre master und develop Zweige in einer grundlegenden Weise zu divergieren.

Nur auschecken Sie Ihre develop Zweig, und tun Sie Ihre Entwicklung dort arbeiten. Wenn es als "stabil" gilt, überprüfen Sie master und git merge develop, um Ihren stabilen Code in den Master zu bringen. Dann drücken Sie beide Zweige.

Sie sollten auch Ihre ändern git push origin develop-u enthalten Ihre develop Zweig automatisch --set-upstream für, so dass Sie Änderungen schieben und ziehen:

git push -u origin develop 

Als Nachtrag zu Dan Ray's answer, wenn Sie wirklich wollen, rückwirkend machen master leer, bis Sie git merge --no-ff develop, müssen Sie Master zu zerstören, und (jetzt oder wenn Sie bereit sind, zu fusionieren) neu erstellen, um auf den frühesten Commit in Ihrem Repo zeigen. Dann master und develop haben wird zum frühestmöglichen Zeitpunkt abwich, und sie können zusammengeführt werden, um die Illusion zu geben, dass „Meister war immer stabil“:

  • Kasse Ihr develop Zweig: git checkout -b develop
  • löschen master: git branch -d master
  • finden frühestens in der Zeit zu diesem frühen Zeitpunkt über git log
  • recreate Master in Ihrem Repository commit: git branch master <early commit id>
  • verschmelzen schließlich in Master: git checkout master && git merge --no-ff develop

nun Ihr Master-Zweig hat "immer" leer, bis die Entwicklung Code in verschmolzen wurde

+0

Dies löst nicht mein Hauptproblem. Ich möchte keinen stabilen Code in meinem Master-Zweig haben. Mein aktueller Code ist instabil im Master ist instabil und nicht bereit für die Entwicklung. Ich bin mir nicht sicher, ob Sie bekommen, was ich hier möchte. – tugberk

+0

Das ergibt keinen Sinn. Es gibt nichts * falsch * mit instabilem Code im Master während der frühen Entwicklung. Hör einfach auf, deine Entwicklungsarbeit dort zu erledigen und dann, wenn du bereit bist, füge deine stabilen Sachen wieder zusammen. Das Entfernen aller Dateien macht keinen Sinn. Es wäre besser, den "Master" Zweig vollständig zu löschen und ihn dann neu zu erstellen, wenn Sie Ihren Code als "stabil" betrachten. – meagar

+0

Das mag für dich keinen Sinn ergeben, aber es ist sehr gut für mich. Ich glaube, der Master-Zweig hat immer den stabilen Code und ich bin hier danach. – tugberk

0

Es klingt wie, was Sie tun möchten eine Kombination des Erstellens einer neuen develop Verzweigung von master und this answer für How to insert a commit as the first, shifting all the others?.

Angenommen, Sie haben eine Geschichte wie folgt aus:

$ git --version 
git version 1.7.9.rc2.1.g69204 
$ git log --oneline --decorate --all 
3047e68 (HEAD, master) D 
d5b5fdb C 
4a26775 B 
c53013b A 
2a984b8 initial 

Erstellen Sie einen neuen develop Zweig vom master Zweig:

$ git branch develop 
$ git log --oneline --decorate --all 
3047e68 (HEAD, master, develop) D 
d5b5fdb C 
4a26775 B 
c53013b A 
2a984b8 initial 

Erstellen einer neuen Anfangs begehen und es einrichten, wie Sie möchten :

$ git symbolic-ref HEAD refs/heads/newroot 
$ git rm --cached -r . 
$ git add README.md 
$ git clean -f -d 
$ git commit -m 'new initial' 
$ git log --oneline --decorate --all 
8b9881c (HEAD, newroot) new initial 
3047e68 (master, develop) D 
d5b5fdb C 
4a26775 B 
c53013b A 
2a984b8 initial 

Jetzt machen newroot der develop Zweig und die neuen Anfangs verpflichten, die master Zweig:

$ git rebase --onto newroot newroot develop 
$ git branch -d newroot 
$ git log --oneline --decorate --all 
3d589b6 (HEAD, develop) D 
f6a83da C 
6c8bdc9 B 
f8dd99f A 
79706b0 initial 
8b9881c new initial 
3047e68 (master) D 
d5b5fdb C 
4a26775 B 
c53013b A 
2a984b8 initial 

Jetzt, nachdem Sie sicher sind Sie der bestehenden master Geschichte loswerden wollen und machen die new initialmaster ‚s begehen HEAD:

$ git reset --hard 8b9881c 
HEAD is now at 8b9881c new initial 
$ git log --oneline --decorate --all 
3d589b6 (develop) D 
f6a83da C 
6c8bdc9 B 
f8dd99f A 
79706b0 initial 
8b9881c (HEAD, master) new initial 

und wenn der develop Zweig ist stabil und bereit für master:

$ git checkout master 
$ git merge --no-ff develop 
$ git log --oneline --graph --decorate --all 
* e8a5c32 (HEAD, master) Merge branch 'develop' 
|\ 
| * 3d589b6 (develop) D 
| * f6a83da C 
| * 6c8bdc9 B 
| * f8dd99f A 
| * 79706b0 initial 
|/ 
* 8b9881c new initial 
Verwandte Themen