Frage Wie verwende ich git merge - squash?


Ich habe einen Remote-Git-Server, hier ist das Szenario, das ich ausführen möchte:

  • Für jeden Bug / Feature erstelle ich einen anderen Git-Zweig

  • Ich verfolge weiterhin meinen Code in diesem Git-Zweig mit nicht offiziellen Git-Nachrichten

  • Im Top-Repository müssen wir einen Commit für einen Bug mit offizieller Git-Nachricht durchführen

Wie kann ich meine Verzweigung mit der Remote-Verzweigung verbinden, so dass sie nur ein Commit für alle meine Check-Ins erhalten (ich möchte sogar eine Commit-Nachricht dafür bereitstellen)?


763
2018-03-15 07:47


Ursprung


Antworten:


Angenommen, Ihr Bugfix-Zweig wird aufgerufen bugfix und du willst es zusammenführen master:

git checkout master
git merge --squash bugfix
git commit

Dies wird alle Verpflichtungen aus dem übernehmen bugfix Verzweige, zerquetsche sie in 1 Commit und füge sie mit deinem ein master Ast.


Erläuterung:

git checkout master

Wechselt zu Ihrem master Ast.

git merge --squash bugfix

Nimmt alle Verpflichtungen von der bugfix verzweigen und es mit Ihrer aktuellen Filiale zusammenführen.

git commit

Erstellt eine einzelne Festschreibung aus den zusammengeführten Änderungen.

Das weglassen -m Mit Parameter können Sie eine Entwurfs-Commit-Nachricht bearbeiten, die jede Nachricht aus Ihren gedrückten Commits enthält, bevor Sie Ihre Festschreibung abschließen.


1259
2018-03-15 08:16



Sie möchten mit der Squash-Option zusammenführen. Das ist, wenn Sie es Zweig für Zweig machen wollen.

git merge --squash feature1

Wenn Sie alle Zweige gleichzeitig als einzelne Commits zusammenführen möchten, interferentieren Sie zuerst interaktiv und quetschen Sie dann jede Funktion und dann die Oktopus-Zusammenführung:

git checkout feature1
git rebase -i master

Squash in einen Commit und dann für die anderen Features wiederholen.

git checkout master
git merge feature1 feature2 feature3 ...

Diese letzte Zusammenführung ist eine "Oktopus-Zusammenführung", da sie viele Zweige gleichzeitig zusammenführt.

Hoffe das hilft


84
2018-03-15 08:08



Was das für mich endlich klar machte, war ein Kommentar Zeigt das:

git checkout main
git merge --squash feature

ist das Äquivalent zu tun:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

Wenn ich einen Feature-Zweig mit 105 (!!) Commits verschmelzen will und alle in einen zerquetscht habe, will ich nicht git rebase -i origin/master weil ich Merge-Konflikte für trennen muss jeder der Zwischen-commits (oder zumindest diejenigen, die git nicht selbst herausfinden können). Verwenden git merge --squash bringt mir das Ergebnis, das ich möchte, eines einzigen Commits zum Zusammenführen eines ganzen Feature-Zweiges. Und ich muss höchstens eine manuelle Konfliktlösung machen.


81
2017-08-19 15:59



Wenn du schon hast git merge bugfix auf main, können Sie Ihren Merge-Commit in einen komprimieren mit:

git reset --soft HEAD^1
git commit

19
2018-03-13 17:50



Verschmelzen newFeature verzweigen in master mit einem benutzerdefinierten Commit:

git merge --squash newFeature && git commit -m 'Your custom commit message';

Wenn Sie es stattdessen tun

git merge --squash newFeature && git commit

Sie erhalten eine Commit-Nachricht, die alle enthält newFeature Branch Commits, die Sie anpassen können.


6
2018-03-17 11:10



Für Git

Erstellen Sie ein neues Feature

über Terminal / Shell:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

Dies wird nicht festgelegt, ermöglicht es Ihnen, es zuerst zu überprüfen.

Dann commit, und beenden Sie die Funktion von diesem neuen Zweig, und löschen / ignorieren Sie den alten (den, den Sie entwickelt haben).


0
2017-10-05 14:33