2015-12-04 17 views
7

Ich habe einen lokalen Zweig, wir verwenden git-flow mit Pull Requests und ich möchte ein paar Commits quittieren, nachdem ich PR-Feedback erhalten habe.Wie ich meinen git-Zweig in den gleichen Zweig zerquetsche, ohne ihn umzubauen?

Wie kann ich alle meine Commits (von PR's zum Beispiel) in den gleichen Zweig quetschen?

stelle ich mir es so etwas wie wäre:

git checkout master     # For master 
git pull        # Get all branches up-to-date 
git checkout feature1     # Checkout the branch 
git checkout -b feature1_squash  # Make a copy of the branch 
git branch -D feature1     # Delete original branch 
git checkout master     # (?) Branch off latest master for safety 
git checkout -b feature1    # Make new (empty) original branch 
git merge --squash feature1_squash  # Merge with squash into it 
git push -f feature1     # Push, force will be required 

aber ich bin nicht sicher.
Mit diesen vielen Schritten scheint es auch ein guter Fall für die Verwendung einer Funktion, um alles zusammen zu binden und übergeben Sie einfach den Zweig Name als Parameter. Natürlich würde dies bedeuten, dass man Fehler, Ausnahmen, Randfälle usw. behandeln muss.

Ich möchte keine interaktive Rebase verwenden, weil es für neue Anfänger, die ich trainiere, ein bisschen schwierig ist. Ich möchte auch nicht die Anzahl der Commits wissen, ich möchte nur alle, die in dieser Branche existieren.

+1

Ich verstehe nicht genau, was du willst. Haben Sie mehrere Zweige mit unterschiedlichen Commits auf jedem Zweig und Sie möchten sie alle in einen Commit auf einem Zweig setzen, wodurch der Entwicklungsverlauf verloren geht? – houtanb

+1

Ich habe 1 Zweig ('feature1') mit mehreren Commits und ich möchte, dass es 1 Commit gibt. –

Antwort

1

Ich denke, was Sie vorschlagen, ist unkonventionell, und schwieriger für Anfänger als mit rebase -i zu Squash.

Was ist schwierig über git rebase -i HEAD~N (mit N ist die Anzahl der Commits, um zurück zum Quetschen zu gehen)? Sie lesen einfach die Liste und zerquetschen die Commits, wie Sie brauchen. Der "Rewriting History" Leitfaden hat mehr Details, und ich denke, es ist perfekt für einen neuen Benutzer geeignet.

Sie können jederzeit einen Demo-Zweig für Ihre Auszubildenden erstellen. Machen Sie einfach 5-6 Commits zu einem Zweig für Demozwecke, und lassen Sie den Trainee die Commits mit interaktiver Rebase quetschen, dann machen Sie eine PR zu Ihnen, um zu beweisen, dass sie in einem Live-Zweig damit umgehen können.

+0

Danke. Rebasing hat uns Probleme bereitet.(zu) lange Geschichte. Wenn meine Schritte in eine Funktion gepackt werden können, würde dies die Komplexität verbergen. Wir können einen Demo-Zweig erstellen, aber wir werden immer noch mit Fällen enden, in denen Pull-Request-Kommentare eingehen und wir eine kleine Änderung vornehmen, und wir wollen sie zerquetschen. –

+1

Ich glaube immer noch, dass das Ausblenden der Komplexität (und auch das Umgehen der typischen Anwendungsfälle des Tools und das Verwenden externer Tools, um das gleiche Verhalten zu verursachen) Ihren Auszubildenden schadet. Ich glaube, dass als kompetente Programmierer, sobald sie ein paar Mal umgestoßen haben, es zur zweiten Natur wird. Sie können auch Tools wie Gitosis (https://git-scm.com/book/en/v1/Git-on-the-Server-Gitosis) verwenden, um den Zugriff auf verschiedene Funktionen zu steuern, obwohl es auch eine eigene Schicht von Komplexität. Auf jeden Fall, viel Glück, ich hoffe, dass sie gut lernen können! – Todd

+0

Vergessen Sie Gitosis, es wird nicht mehr gepflegt. Gitolit ersetzt es und es wird beibehalten. –

4

Die Antwort von VonC ist fast da. aber zu wissen, dass du 3 Commits zurückgehen willst, ist hart.

stattdessen sollten Sie merge-base

git reset --soft $(git merge-base YOUR_BRANCH WHERE_YOU_BRANCHED_FROM) 
git commit 

verwenden und Ihre Nachricht bearbeiten (oder git commit -m statt)

, wenn Ihr auf diesen Zweig, können Sie HEAD verwenden und vorausgesetzt, Sie von Master verzweigten Ihre Befehle wären (origin/master aufgrund lokalen Master mit veraltet potentiell)

git reset --soft $(git merge-base HEAD origin/master) 
git commit 

Wenn Sie kippt erinnern, wo Sie verzweigte von, der Platz, den du die PR zurück integrierst, ist wahrscheinlich richtig

+0

plus eine für die Notwendigkeit, die Anzahl der Commits zu kennen –