Ich arbeite derzeit für eine Firma, die VSTS für die Verwaltung von Git-Code verwendet. Die von Microsoft empfohlene Methode zum Zusammenführen eines Zweigs besteht darin, einen "Squash-Merge" durchzuführen. Dies bedeutet, dass alle Festschreibungen für diesen Zweig zu einer neuen Festschreibung zusammengefasst werden, in der alle Änderungen enthalten sind.
Das Problem ist, was passiert, wenn ich einige Änderungen in einer Verzweigung für ein Backlog-Element vornehme und dann sofort Änderungen in einer anderen Verzweigung für ein anderes Backlog-Element vornehmen möchte. Diese Änderungen hängen von den Änderungen der ersten Verzweigung ab?
Ich kann eine Verzweigung für dieses Rückstandselement erstellen und auf der ersten Verzweigung aufbauen. So weit, ist es gut. Wenn es jedoch an der Zeit ist, eine Pull-Anforderung für den zweiten Zweig zu erstellen, wurde der erste Zweig bereits in Master zusammengeführt. Da dies als Squash-Zusammenführung erfolgt, weist git auf eine Reihe von Konflikten hin. Dies liegt daran, dass git die ursprünglichen Commits, auf denen der zweite Zweig basiert, nicht sieht, sondern nur das Zusammenführen eines großen Kürbisses. Um den zweiten Zweig zum Master zusammenzuführen, wird versucht, alle Commits des ersten Zweigs erneut abzuspielen oben auf der Squash-Fusion, was zu vielen Konflikten führt.
Meine Frage ist also, ob es eine Möglichkeit gibt, dies zu umgehen (abgesehen davon, dass ich nie einen Feature-Zweig von einem anderen abstützt, was meinen Workflow einschränkt) oder ob das Zusammenführen von Squash nur den Zusammenführungsalgorithmus von Git unterbricht.
feature1
auf den Master durchführen und später einen Merge durchführen möchtenfeature2
. In diesem Fall würde der erste Ansatz nicht zu Konflikten führen, wenn git versucht, diefeature1
Commits erneut auf das gequetschte Commit anzuwenden , während git mit dem zweiten Ansatz feststellen könnte, dass diese Commits nicht zusammengeführt werden müssen.git clone
ich das Repo machte und meine geänderten Dateien kopierte!), Weil ich von einem Zweig abzweigte und dann der Betreuer den ersten Zweig zerquetschte. Bei meiner Arbeit machen sie auch Squash-Merges. Dies bedeutet, dass ich an einer Funktionb
, die von der Funktion abhängt, erst arbeiten kann,a
wenn die Funktiona
zusammengeführt wird.Das Zusammenführen von Squash unterbricht den Zusammenführungsalgorithmus für alle Zweige, die Commits enthalten, die durch den Squash entfernt wurden. Anders ausgedrückt, Rebases sind viral. Wenn Sie einen Zweig neu einrichten, müssen Sie alle anderen Zweige neu einrichten, die von diesem Zweig abhängen. Wenn Sie rerere verwenden , müssen Zusammenführungskonflikte, die Sie manuell in Ihrem lokalen Repo gelöst haben, nicht erneut manuell gelöst werden. Dies hilft jedoch nicht bei Konflikten, die von anderen Personen gelöst wurden.
Aus diesem Grund ist es unsere ungeschriebene Regel, dass es in Ordnung ist, Squash zu spielen, solange niemand sonst jemals von Ihrem Feature-Zweig abhängt, was in etwa 90% der Fälle der Fall ist. Andernfalls hilft eine direkte Zusammenführung allen, Probleme zu vermeiden.
quelle
feature-xyz
Niederlassung. Sie können einenfeature-xyz-squashed
Zweig erstellen, der mit dem gleichen Festschreiben wie der Zweig beginntfeature-xyz
,git cherry-pick
die Festschreibungen vonfeature-xyz
bisfeature-xyz-squashed
, sie dort zusammendrücken undfeature-xyz-squashed
nach zusammenführenmaster
. Sie sollten dann nicht zusammenführenfeature-xyz
. Manchmal ist das oben Genannte sinnvoll (z. B. möchten Sie keine Commits mit einem eingeschlichenen Kennwort einfügen), aber es ist eine Problemumgehung, kaum eine bewährte Methode.