2016-04-05 1 views
3

Ich bin ziemlich neu zu git und arbeite nur von mir selbst, also verwende ich nicht viele der Funktionen, die es tun kann, aber ich laufe in einen Prozess, an den ich entweder denke es falsch oder etwas falsch machen.Wie verwende ich richtig git merge --squash

Ich habe einen Master-Zweig mit 1 commit (init).

Ich habe einen Entwicklungszweig mit 180 commits.

Heute bin ich endlich bereit, den Entwicklungszweig zum Meister zu verschmelzen, ich habe etwas gelesen und etwas über Squash herausgefunden. Dies scheint etwas Nützliches zu sein, da ich den Master-Zweig nicht mit den gleichen WIP-Commits verseuchen würde, die sich im Develop-Zweig befinden.

So lief ich

git checkout master 
git merge --squash develop 
git commit 

Von hier alles sieht aus, als ich erwartet hatte, master hat 2 Commits, develop hat noch 180. In meinem Kopf jetzt ich develop wieder überprüfen und weiter zu arbeiten. Ich drückte auf bitbucket und warf einen Blick um an meinem Projekt dieses merge zu sehen und bemerkte folgendes:

1 commit(s) on master and not on develop 
179 commit(s) on develop and not on master 

Ist das nur das erwartete Verhalten und ich soll es ignorieren oder habe ich etwas falsch gemacht.

Antwort

2

Dies wird erwartet, da git alle Ihre Commits zu einem einzigen Commit zusammenführt, der ein anderer als der in Ihrem Entwicklungszweig ist. Stellen Sie sich die Commits als Container einer Reihe von Änderungen vor, wenn Sie den Inhalt ändern, haben Sie einen anderen.

Sie müssen entweder dieses Szenario akzeptieren, oder Sie können Ihren Workflow anpassen, indem Sie in Feature-Zweigen arbeiten, z. Meister - Entwicklung - Feature-Zweig.

Sobald ein Feature fertig ist, machen Sie einen Squash-Merge vom Feature-Zweig, um den Feature-Zweig zu entwickeln und zu löschen. Jetzt können Sie Zusammenführungen von Entwicklung zu Master ohne alle WIP-Commits, z. wenn du neue Veröffentlichungen oder ähnliches machst.

+0

Sinn macht. Ich denke, ich werde es einfach akzeptieren müssen. Der Feature-Zweig macht Sinn, aber wahrscheinlich werde ich am Ende mehrere Funktionen zusammenführen, bevor ich das in den Master bringe, so dass ich im selben Boot landete, nur ein paar Level tief. – mgabe

0

Wenn Sie Squash in Git committieren, kombiniert es sie zu einem einzigen Commit. Wenn Sie jedoch Änderungen aus mehreren Commits in ein neues Commit zusammenführen möchten, führen Sie eine Zusammenführung durch.

In Ihrem Fall, was ich glaube, dass Sie vorhatten, war eine Zusammenführung ohne "fastforwarding". Mit dieser Art der Zusammenführung hätte man am Ende 2 commits in master (initial und merge) und 180 commits in dev.

Der Code wäre (nach dem letzten in dev begehen):

git checkout master 
git merge dev --no-ff 
+0

Das klingt wie das, was ich will, aber ich habe es gerade ausprobiert und es endet mit 180 Commits in beiden. – mgabe

+0

Das passiert nur, wenn die Zusammenführung schnell durchgeführt wird. Mit no-fastforward bleiben die 180 commits in dev, während Sie in master einen commit haben, bei dem alle Änderungen gequetscht werden. Hast du den genauen Code ausprobiert? – josemigallas

+0

Ja, der genaue Code ergab 181 Commits in Master und 180 Commits in Develop. Überprüft von 'git rev-list --count HEAD' – mgabe