Zusammenarbeit bei der Behebung von Zusammenführungskonflikten

8

Szenario: Habe eine Verzweigung pro (aktivem) Release in git,

Sequenz ist:

  1. Bob nimmt Änderungen an R1 vor, schreibt, zieht R1 und schiebt R1 auf "shared". Aktualisiert R2 nicht für shared.
  2. Jane nimmt Änderungen an R1 , commits.
  3. vor
  4. Jane zieht R1 von geteilt, behandelt Konflikte und schiebt R1 .
  5. Gehen Sie einige Male erneut zu Schritt 1
  6. Jane wird gesagt, dass sie R2 mit Fixes von R1 aktualisieren müssen
  7. Jane zieht R1 und R2 von geteiltem
  8. Jane führt R1 lokal in R2 zusammen. Zusammenführen von Konflikten in einem Bereich des Codes, an dem Bob gearbeitet hat.

Jane muss R2 von shared holen und die Zusammenführung handhaben, bevor sie pushen kann. Aber sie weiß nicht, was sie mit Bobs Veränderungen machen soll.

Zweige: R1 , R2

%Vor%

Bob und Jane nehmen Änderungen an R1

vor

Jane möchte dann R1 in R2 zusammenführen, um die neueste Version zu aktualisieren. Sie löst die Zusammenführungskonflikte, die durch ihre Änderungen verursacht wurden, jedoch weiß sie nicht, wie sie die durch die von Bob vorgenommenen Änderungen verursachten Konflikte lösen kann.

Gibt es eine Möglichkeit für Jane, Git zu benutzen und Bob die Zusammenführung abzuschließen?

Ich weiß, idealerweise hätte Bob seine Änderungen bereits in R2 zusammengeführt, aber angenommen, das ist nicht der Fall.

Mögliche Problemumgehungen (Suche nach etwas Besserem)

  1. Jane ruft Bob zu ihrem Schreibtisch und Bob löst den Konflikt auf. Schwierig beim Telearbeit
  2. Jane speichert widersprüchliche Dateien und E-Mails an Bob, Bob repariert die Datei und sendet sie per E-Mail zurück an Jane, die sie dann in ihrem Commit verwendet.
Joseph Kingry 18.07.2013, 18:06
quelle

4 Antworten

4

Angenommen, Bob ist blockiert und Jane ist bestrebt, das Problem zu lösen, macht Jane ihren besten Versuch, die Zusammenführung durchzuführen.

%Vor%

Wip steht für work in progress und ist eine Konvention, die dem Team signalisiert, dass der Baum und die Geschichte einem radikalen Wandel unterliegen. Vielleicht möchte Jane wirklich, dass Bob ihre Auflösungen, die seinen Code von R1 beeinflussen, vor der Integration in die Baseline betrachtet. (Hinweis: Dies ist ein Anti-Pattern; ein besserer Ansatz wäre es, automatisierte Tests zu haben, die das gewünschte Verhalten für den neuen Code in R1 schützen und anderen Entwicklern als Bob erlauben, selbstbewusst zu verschmelzen.)

Jane macht ihren besten Versuch bei der Zusammenführung.

%Vor%

Der Zweig wip / R2-with-R1 kann sogar mehrere Checkpoint-Style-Commits enthalten. Ein weiteres gutes Signal für jeden würde das Team wissen lassen, dass es spekulativ ist.

%Vor%

Wenn sie bereit ist, dass Bob sie anschaut, schiebt sie sie zu einem Repository, das beide sehen können

%Vor%

Die Option --set-upstream ist für den Fall vorhanden, dass sie gemeinsam an der neuen Verzweigung arbeiten müssen.

Sie startet dann ihren Mail User Agent.

%Vor%

Nach Bobs Korrektur und einem Abruf ähnelt der Verlauf

%Vor%

An diesem Punkt möchte Jane die Zusammenführung beibehalten, möchte aber die hässlichen Checkpoint-Commits nicht beibehalten. Zurück zu einem Merge-Commit zu komplimentieren erfordert nur ein wenig Sorgfalt.

%Vor%

Dies hinterlässt eine Geschichte von

%Vor%

und R2 hat jetzt den gleichen Baum wie Bobs letzten Baum.

    
Greg Bacon 18.07.2013, 20:00
quelle
2

Anders als Jane Bob zu ihrem Schreibtisch ruft und die Änderungen an ihrem Computer überprüft, glaube ich nicht, dass dies in git gemacht werden kann.

Wenn die Zusammenführung aufgelöst wird, erstellen Sie eine neue Festschreibung, und das geschieht alles lokal. Jane konnte die Zusammenführung vornehmen und sich entschließen, die Änderungen nicht auf die Fernbedienung zu übertragen. Bis der Merge-Commit übertragen wurde, gibt es keine Möglichkeit zu wissen, ob jemand anderes in ihre Kopie der Remote-Datei eingebunden wurde. Jane muss die Commits auflösen, um die Zusammenführung abzuschließen, und das geschieht nur lokal.

Eine unzusammenhängende Änderung in der Fernbedienung scheint sowieso eine schlechte Idee zu sein. Angenommen, ich beginne mit dem Repo zu arbeiten und ziehe Änderungen, bevor Bob die Konflikte gelöst hat. Was dann?

Der andere Weg für Jane zu wissen, ob sie die Commits gelöst hat, wäre, dass sie eine Test-Suite laufen hat. Dann weiß sie, dass sie einen Fehler gemacht hat, als die Tests fehlgeschlagen sind.

    
Schleis 18.07.2013 18:14
quelle
1

Wenn ich die Reihenfolge der Aktionen richtig verstehe, ist das wie folgt:

  1. Bob nimmt Änderungen an R1 vor, legt fest, fusioniert mit seiner Kopie von R2 und drückt auf shared.
  2. Jane nimmt Änderungen an R1 vor, legt fest, verschmilzt mit ihrer Kopie von R2 und versucht, auf shared zu drücken, erhält aber einen veralteten Fehler.
  3. Jane muss R2 von shared holen und die Zusammenführung handhaben, bevor sie pushen kann. Aber sie weiß nicht, was sie mit Bobs Veränderungen anfangen soll.

In dieser Situation könnten Jane und Bob Folgendes tun:

  1. Jane kann eine Verzweigung erstellen, die ihre Änderungen in R2 enthält:

    %Vor%
  2. Jane kann dann / email / IM Bob anrufen und ihn bitten, seine Änderungen zusammenzuführen.
  3. Bob seufzt unzufrieden darüber, dass er es wieder tun muss , warum ist Jane immer so nervös, ihre Veränderungen mit seinen zu verschmelzen? Es ist dumm ... löst dann die Zusammenführung mit Janes Zweig vom Server auf:

    %Vor%
  4. Bob antwortet Jane, um ihr mitzuteilen, dass die Zusammenführung beendet ist.
  5. Jane entfernt ihren temporären Zweig vom Server:

    %Vor%

    und antwortet dann zurück, um Bob zu danken. Und bitten Sie ihn, vielleicht irgendwann mal Kaffee zu trinken ...

(Natürlich könnte Bob auch Janes temporären Zweig auf dem Server löschen, aber das passte auch nicht zur Erzählung.)

    
quelle
1

Wir befinden uns in einer ähnlichen Situation.

Hier ist der Weg, den wir gefunden haben, funktioniert nach ein paar verschiedenen fehlgeschlagenen Vorgehensweisen. Der Punkt war, wie man die widersprüchlichen Hunks über das Remote-Repository verteilt.

  1. Jane erstellt zwei Zweige von der Spitze von R2 und verbindet R1 mit ihnen mit einer Reihe von "komplementären" Merge-Strategien;

    %Vor%
  2. Jetzt

    %Vor%

    zeigt, dass R1 mit R2 in Konflikt gestanden hätte, weil '-s rekursiv -X unsere / ihre Merge-Strategie "zwingt, Konfliktstellen durch die Bevorzugung unserer Version automatisch sauber aufzulösen."

  3. Jane nimmt notwendige Änderungen an wip / merging vor, um die "virtuellen" Konflikte zu lösen, die durch ihre vorherigen Änderungen verursacht wurden und lässt Bob unberührt.

  4. Dann drückt Jane wip / referenz und wip / merging und ruft / IM / email / owlpost Bob um sie zu holen.

  5. Bob prüft die virtuellen Konflikte und die halbwegs aufgelöste Jane gemacht und macht weitere Veränderungen gegen die Konflikte seiner Vergangenheit zu ändern verursacht.

  6. Dann führt er wip / merging zurück zu R2, wenn er das Gefühl hat, alles sieht gut aus oder fragt George / Alice, weitere Resolutionen zu machen.

Wir untersuchen noch, wie sich das auf spätere Zusammenführungen auswirkt (d. h. wenn git rerere richtig funktioniert).

    
jeffi 30.01.2014 00:56
quelle

Tags und Links