2016-09-02 5 views
2

So von meinem Verständnis Kirschen-Kommissionierung von einem Zweig zu einem anderen schafft eine völlig neue Hash-Signatur, obwohl die tatsächlichen Code-Änderungen die gleichen sind. Ich glaube, das liegt daran, dass die Hash-Signatur für das Commit unter anderem von dem Namen des Zweigs und der Commit-Zeit abhängt.Cherry Picking Fehler behoben

Aus diesem Grund wurde ich zu der Überzeugung geführt, dass, wenn ein Fehler in einem Feature-Zweig behoben wurde und ein anderer Entwickler dieses Update benötigt, die richtige Lösung ist, dieses Update in einen eigenen Zweig aufzunehmen und diesen Zweig zusammenzuführen in den gemeinsamen Zweig verzweigen sich beide Zweigzweige. Dann sollte das ursprüngliche bufix-Commit im Feature-Zweig gelöscht werden und schließlich werden beide Feature-Zweige einfach auf dem gemeinsamen Zweig, der jetzt den Bugfix enthält, neu aufgesetzt.

Es scheint jedoch, dies ist nicht, wie andere interpretieren mit Kirsch-Pick. Ich dachte, wenn ein Commit von einem Feature-Zweig in einen anderen übernommen wird und beide wieder in den gemeinsamen zusammengeführt werden, dann verursachen diese separaten Commits eines von drei Dingen;

  • ‚Duplikat‘ begeht in der Geschichte, die der gleiche Code einführen ändert
  • ein Merge Konflikt, der manuell
  • Einführung von duplizierten Codezeilen behandelt werden muss.

Habe ich Kirsche Pick falsch interpretiert?

+0

In meinem Fall sollten zwei identische Commits in verschiedenen Zweigen (eine Kirsche ausgewählt) keinen Zusammenführungskonflikt oder doppelte Codezeilen verursachen. Warum bist du dir da sicher? – lubilis

+0

@lubilis Ich bin mir nicht sicher, um ehrlich zu sein. Ich erlebe es oft genug, um mich zu fragen, ob wir Kirschenpickel oder etwas anderes verwenden. – myol

Antwort

2

Nein, wenn Sie ein Commit von einem Zweig in einen anderen auswählen, wird es einen anderen Hash erhalten, ja. Nicht wegen des Zweignamens ist ein Zweig nur ein Post-It, das an ein Commit angehängt wird. Aber die gesamte Geschichte eines Commits ist ein Teil der Hash-Berechnung, so dass zwei Commits, die die gleichen Änderungen einführen, aber zusätzlich zu einer anderen History, im Wesentlichen zwei verschiedene Commits sind, die dieselben Änderungen einführen.

Wenn Sie einen Zweig auf einen anderen umstellen und beide die gleichen Änderungen einführen (die von einem zum anderen ausgewählt wurden), enthält der referenzierte Zweig nicht beide Commits, sondern das Commit, das auf den Verlauf referenziert wird Änderung wird bereits eingeführt wird weggelassen werden, wie es nie getan wurde.

Wenn Sie die Zweige zusammenführen, wird es keinen Konflikt aufgrund der Rosinenpickerei geben, da beide Zweige die gleichen Änderungen vorgenommen haben und Git dies sieht und korrekt verarbeitet. Wenn Sie jedoch andere Änderungen an denselben Dateien vornehmen, können diese Änderungen zu Konflikten führen, die Sie beheben müssen.

+0

Vielen Dank für die Erläuterung und Erklärung. Nur um zu bestätigen, dass beim Zusammenführen beider Zweige zurück in den gemeinsamen Zweig (anstatt einen auf den anderen zu übertragen) der zweite zusammengewachsene Zweig übersprungen wird. – myol

+0

Nein, wenn Sie zusammenführen, wird die Festschreibung nicht übersprungen, da eine Zusammenführung nicht commit-weise funktioniert. Ein Rebase funktioniert Commit-weise, da er die Commits, die Sie rebase, anwendet und sie einzeln auf das neue Basis-Commit anwendet, wobei Commits ausgelassen werden, die keine Änderungen einführen, wie es bei Cherry-Picked-Commits der Fall ist. Eine Zusammenführung vergleicht, was geändert wurde und wendet das sofort an. Da die eingeführten Änderungen jedoch dieselben sind, wird es keinen Konflikt geben, weil dasselbe zweimal zu tun kein Konflikt ist oder vielmehr automatisch gelöst wird. – Vampire

+0

Ok ich sehe, der Konflikt wird automatisch gelöst, aber beide Commits erscheinen dann die gemeinsame Zweighistorie? – myol