2013-02-12 15 views
11

Während der Entwicklung muss ich oft committen und push "intermediate" commits, dh mit dem Code nicht kompatibel oder in der Mitte etwas zu ändern, etc. Ich will nicht machen solche Commits, aber das ist für die einfache Fortsetzung meiner Arbeit von Büro zu Hause erforderlich, manchmal für andere Entwickler, um sie Basis, auf der sie ihre Arbeit beginnen können.Git fusionieren ohne Commits von einem Zweig zum anderen

Ich dachte, ich eine Lösung für dieses Problem gefunden hatte:

  1. ich einen separaten „dev“ Zweig erstellen und mache alle Zwischen Commits.

  2. Sobald der Code in gutem Zustand ist, führen Sie eine Zusammenführung zum Master durch. Der Master würde also keine "Zwischen" -Zulassungen enthalten, sondern nur "normale" Commits.

  3. Löschen Sie den Zweig "dev" mit allen Zwischenbefehlen.

Aber das funktioniert nicht. Wenn ich merge, wird nicht nur das Merge-Commit in den Master aufgenommen, sondern auch alle "intermediate" Commits vom "dev" -Verzweigungen. Das Löschen von "dev" branch gibt also nichts, seine "intermediate" Commits bleiben dort.

So lautet die Frage: ist es möglich, Merge in der Art und Weise, dass Master würde nur seine eigenen Commits + Merge Commit und nicht die Commits aus dem zweiten Zweig enthalten zu machen? Wenn es unmöglich ist, könnten Sie mir raten, wie ich mein Ziel erreichen kann - temporäre Ergebnisse zu speichern, aber auch später nahtlos zu löschen?

Antwort

16

Wenn Sie Ihre „dev“ Zweig in Master fusionieren, versuchen

git checkout master 
git merge --squash dev 
git commit -m "Add new feature." 

Die --squash Option werden alle Ihre Zwischen Änderungen in eine große Veränderung zerquetschen.

Sie können auch git rebase --interactive verwenden, wenn Sie mehr endliche Kontrolle benötigen (z. B. reordering commits und mehrere kleine Squashes machen). This answer erklärt die Unterschiede zwischen git merge --squash und git rebase --interactive.

+0

Ist Squash eine gute Idee, da er diese Commits mit anderen Entwicklern teilt? – jszakmeister

+1

+1 für die Erwähnung von 'git Rebase -i'. Dann würden die Leute * wirklich * nichts über den lokalen Dev-Zweig wissen. –

+1

@jszakmeister, da er Änderungen von einem lokalen Dev-Zweig zu seiner lokalen Kasse des Meisters zusammenführt, ist es in Ordnung. Wenn er seine Änderungen vorantreibt, wird es den anderen Entwicklern so erscheinen, als wären seine Änderungen ein riesiger Kompromiss. Mit anderen Worten, Squashing ermöglicht es Ihnen, ein Commit zu haben, das "Add new feature" anstelle von "Oops. Fix typo" sagt. –

-1

Sie können Commits während einer Zusammenführung nicht löschen. Sie können zwischenzeitliche Commits erzwingen, aber das ist eine schlechte Idee, die wahrscheinlich nicht für Sie funktioniert, wenn Sie sie veröffentlichen. Sie können sie auch in einen Master-Zweig zerquetschen, ohne eine Zusammenführung vorzunehmen (git merge --squash gefolgt von git commit) und dann den Master-Zweig in den Dev-Zweig zusammenführen.

+0

Bitte erläutern Sie Ihren Downvote. – wRAR

2

Was Sie wollen, ist eine „Squash“ merge:

git checkout master 
git merge --squash dev 
git commit -m 'current stable work from dev branch' 

Was das bedeutet ist, den gleichen Zustand in Ihrem Arbeits Baum als reguläres merge erstellen, wird aber keine merge commit mit allen Zwischen Commits erstellen als Vorfahren. Die Zwischen-Commits sind nicht Teil der Historie der master-Verzweigung. Die Dokumentation für diese Option aus dem git merge manpage sagt:

den Zustand Arbeits Baum und Index Produce, als ob eine echte merge passiert (mit Ausnahme der Verschmelzungsinformationen), aber nicht wirklich ein machen zu begehen oder die bewegen HEAD, noch notieren Sie $GIT_DIR/MERGE_HEAD, um den nächsten Git Commit-Befehl zum Erstellen eines Merge-Commits zu verursachen. Auf diese Weise können Sie ein Single-Commit über dem aktuellen Zweig erstellen, dessen Effekt mit einem anderen Zweig (oder mehr im Falle eines Octopus) übereinstimmt.

0

fügen Sie einen weiteren Zweig namens RC (Release Candidate) hinzu. Dieser Zweig enthält nur Zusammenführungen abgeschlossener Zweigstellen. Sie können Dev behalten, um unfertige Zweige zusammen auszuprobieren. Sie integrieren nur Master-Release-Kandidaten, die nur fertige Features enthalten.

Verwandte Themen