Eine Sache, die ich nicht mit Git mag, ist die Menge an Commits. Versteh mich nicht falsch, es ist eine sehr bequeme Methode, deine Arbeit sicher zu speichern, aber auf lange Sicht gibt es zu viel Granularität, um darin zu suchen.Git Merge einfach vs Squash. Was ist der Zweck? Wie verfolge ich ein Commit pro Feature?
Lassen Sie mich das folgende Szenario während der Entwicklung mit Feature-Zweigen von Entwicklung entwickeln beschreiben.
- Feature1 aus verzweigten entwickeln und hat 5 begeht
- Feature2 von entwickeln verzweigt ist und 3 begeht
- Feature3 von Feature1 verzweigt ist und 5 +2 verpflichtet.
Der Grund, warum es drei Zweige gibt, liegt daran, dass ein Team am Repository arbeitet. Feature3 geht davon aus, dass die Feature1 getan wird, warten auf zusammengeführt werden in entwickeln. Es gibt andere Anwendungsfälle dafür, aber dies ist das einfachste Beispiel.
Mein Ziel ist es, drei Commits auf entwickeln zu haben, wenn alle Funktionen erledigt sind.
git merge/Pull
Das obige Szenario funktioniert gut. Weil im Wesentlichen beide Befehle Commits in den Entwicklungszweig verschieben. Wenn Feature1 zusammengeführt wird, entwickeln Referenzen es ist fünf commits. Wenn Feature3 wird zusammengeführt werden, werden nur die letzten beiden Commits in entwickeln zusammengeführt werden.
Der einzige negative Aspekt davon ist, dass entwickeln bekommt zu viele Commits. Das bedeutet, dass beim Zusammenführen in Master all das "Rauschen" sich bewegt. Deshalb wird mein Ziel nicht erreicht.
git mit Squash fusionieren
Wenn Feature1 verschmolzen wird, wird entwickeln eine neue begehen, welche die Aggregation aller Feature1. Das ist sehr nett, da das Feature jetzt mit nur einem Commit verfolgt wird. Wenn Feature1 entfernt wird, sind alle Zwischen-Commits nicht mehr sichtbar, wodurch das Tracking vereinfacht wird. Dies entspricht auch Konzepten wie einer Pull-Anfrage und einem GitHub-Problem.
Wenn Feature3 zusammengeführt wird, gibt es Konflikte und das Problem beginnt. Um dies zu beheben, müssen Sie die Entwicklung zurück zu feature3 zusammenführen. mit Konflikten. Dies führt zu einem neuen Commit, bei dem null Dateien geändert wurden.Und jetzt verbinden wir Squash Feature3 zu entwickeln.
Mein Ziel ist erreicht, aber mit viel Micro-Management Opfer.
Fragen/Bemerkungen
Soweit ich verstehe dies die git Realität ist. Ein Rat, den ich gelesen habe, besteht darin, einen Nebenzweig zu erstellen, der den zerdrückten Merge-Commit enthält. Verwenden Sie den Nebenzweig für die Pull-Anforderung, wodurch die Verwendung eines Commits pro Feature erzwungen wird. Dies löst nicht die Konflikte, die beim Zusammenführen der anderen Zweige, insbesondere derjenigen, die von anderen Feature-Zweigen erben, erzeugt werden.
- Kann ich einen internen Squash innerhalb desselben Zweigs machen? Ich denke nicht, aber tut nicht weh zu fragen.
- Ich vermisse ich etwas?
- Ist das der Kompromiss von Squash Merge? Lösen von Konflikten, die möglicherweise keine Codeänderungen haben?
- Lohnt es sich, nach dem "one commit per feature" Konzept zu gehen?
- Wenn nicht, was ist der Zweck von Squash? Wer benutzt das?
Ich habe Alternative mit rebase lesen und Simulation des Squash mit Reset nach merge, aber soweit ich verstehe nichts löst das Kopf erwähnt Feature3 zu verschmelzen.
Ich glaube nicht, dass die 'git Rebase --onto' funktioniert. '' ' dev - F [dev + zerquetscht feature1] \ ABC [Feature1] \ ED [Feature3] ' '' Wenn ich ausführen 'git rebase --onto dev feature1 feature3' ich > fatal: Benötigt eine einzige Revision > Zeigt nicht auf ein gültiges Commit: dev Nachdem ich ein wenig mehr darüber gelesen habe, verstehe ich als commits A, B, C sind keine Referenzen vom dev-Zweig, da das F commit das ist Ansammlung (Squash) von ihnen. –