AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Werkzeuge Verständnissfrage zu Mercurial (TortoiseHg)

Verständnissfrage zu Mercurial (TortoiseHg)

Ein Thema von Mavarik · begonnen am 20. Dez 2013 · letzter Beitrag vom 31. Dez 2013
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.958 Beiträge
 
Delphi 10.3 Rio
 
#1

Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 10:44
Hallo!

Ja ich habe auf Mercurial (TortoiseHg) umgestellt. Danke erst mal an alle die mit Nachdruck mich dazu gebracht haben.

Folgendes Problem im Workflow stellt sich mir jedoch, vielleicht mache ich etwas falsch?

Gegeben sei die Datei "Datei.pas". Diese Datei ist bei User A und bei User B GLEICH!

User A macht Änderungen an "Datei.pas" (Revision 20)
User B schick A Dateien per eMail inkl. "Datei.pas" die von User B nicht geändert wurde.
User A checkt die Änderungen die per eMail gekommen sind in einen eigenen Zweig aus. (Revision 21)
User A arbeiten in seien Zweig weiter bis Revision 27
Jetzt soll der Zweig von User B mit User A zusammengefügt werden.
Leider ist nach der Zusammenführung der Inhalt der "Datei.Pas" der von User B und nicht der von User A (Ich gehe davon aus, weil die Revisionsnummer der Datei im Zweig von User B höher ist als die letzte Änderung von User A.

Frage: Wie kann ich Mercurial mitteilen, dass obwohl eine Datei in einem Zweig mit höherer Revisionsnummer geändert wurde, beim zusammen führen die Datei des Zielzweiges übernehmen soll die von Änderungsdatum neuer ist?

oder

Frage: Wie bringe ich Dateien in mein Repository (aus anderen Quellen z.b. per Download) unter, so das das Änderungsdatum nicht die Revisionsnummer für eine Zusammenführung genommen wird?

Mavarik
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.902 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 11:00
Du solltest diesen 2. Branch von der Stelle aus machen, von der User B angefangen hat zu arbeiten. Sonst bekommst du gar nicht alle potentiellen Konflikte mit.

In dem Fall gäbe es für HG ja auch keine Änderungen und er müsste beim Merge auch nix auf einen alten Stand bringen.

Es ist ja auch rein vom logischen Standpunkt aus einfacher nachzuvollziehen, wenn man den Branch da setzt als dein Kollege er die Dateien von dir bekommen hat. Nicht nur um Mercurial einen Dienst zu erweisen.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.958 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 11:09
Du solltest diesen 2. Branch von der Stelle aus machen, von der User B angefangen hat zu arbeiten. Sonst bekommst du gar nicht alle potentiellen Konflikte mit.
Das hab ich ja, aber der Ur-Branch wurde in der Vergangenheit schon mit meinem zusammengeführt.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.899 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 11:26
Irgendwie habe ich noch nicht verstanden, was da genau abgelaufen ist. Insbesondere der Schritt 3 ist mir noch nicht klar.

Sind die Dateien als Email-Patch geschickt worden oder ganz normal die einzelnen Dateien als Anhang an eine Email? Quasi analog zum Kopieren der Dateien über einen USB-Stick?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 17:21
Ich habe dein Problem auch nicht so ganz verstanden. Das Änderungsdatum ist für die Zusammenführung (Merge) eigentlich völlig unerheblich.

Denke immer daran, woraus die Revisionen bestehen: Das sind Diffs zu einer vorhergehenden Version. Das Diff entspricht quasi dem Edit.

Bei einem Merge werden jetzt alle Edits zusammengefügt, das heißt, es werden vom Ausgangspunkt aus erst alle Diffs des einen Branches angewendet, und dann alle Diffs des zweiten Branches (zumindest kann man es sich so vorstellen). So erhält man dann eine Datei, die alle Edits, die in beiden Branches gemacht wurden, beinhaltet – theoretisch. Manchmal kommt es natürlich zu Konflikten. Um diese zu lösen, gibt es von Mercurial zum Teil Heuristiken, aber oft bleibt einem nichts anderes übrig, als die Konflikte manuell zu beheben.

Mir war das ganz am Anfang auch noch nicht ganz klar, aber im Grunde ist ein Merge auch nur ein ganz normales Commit. Du hast also 100% Einfluss darauf, was übernommen wird. Prinzipiell kann das Merge-Commit am Ende auch völlig andere Daten enthalten als die beiden Quellversionen... wäre nur halt nicht sinnvoll .

TortoiseHG zeigt dir, wenn es beim Merge Konflikte feststellt, alle beteiligten Dateien in einer Liste an. Du kannst dann auswählen, was wie du verfahren willst: Du kannst die Heuristik von HG darauf anwenden, du kannst aber auch sagen, „übernimm nur meine Datei und vergiss die andere Version“ oder du kannst sagen „übernimm nur die andere Datei und vergiss meine“. Wenn du nur die neuere Datei erhalten willst und die alte verwerfen willst, dann wähle einfach eine dieser beiden Optionen. Das ist oft bei Binärdateien das einzig sinnvolle.

Falls du aber die Änderungen aus beiden Dateien erhalten willst, und die Heuristik die Konflikte nicht auflösen konnte, dann musst du selbst ran. Wähle „Tool Resolve“. Das startet in der Regel TortoiseDiff oder KDiff3.

In beiden Programmen ist dein Bildschirm dreigeteilt: Auf der einen Seite ist die Version des einen Branches, auf der andereren die Version des anderen Branches, und in der Mitte bzw. unten ist die zusammengeführte Version. Stellen, an denen sich Konflikte befinden, sind hier mit roten Fragezeichen markiert (zumindest bei TortoiseDiff).

In den Ansichten für die Quelldateien aus den Branches, kannst du Zeilen selektieren und dann mit Rechtsklick im Kontextmenü dem Tool sagen „diesen Textblock übernehmen“. Dann wird der Teil im unteren bzw. mittleren Fenster an der entsprechenden Stelle eingefügt.

Du kannst aber auch den Text der gemergeten Version manuell editieren, indem du einfach das Fenster fokussierst und wie in einem normalen Texteditor darin rumeditierst.

Am Ende musst du den gemergeten Text noch speichern (Strg+S). Dann kannst du das Tool schließen und Mercurial mitteilen, dass du den Konflikt behoben hast. Wenn ich mich nicht irre, ging das, indem du im Explorer (oder welchen Dateimanager du auch benutzt) zur entsprechenden Datei navigierst, das TortoiseHG-Kontextmenü aufrufst und dort die entsprechende Option auswählst.

Wenn du alle Konflikte behoben hast, dann machst du ein Commit.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.958 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 17:45
Irgendwie habe ich noch nicht verstanden, was da genau abgelaufen ist. Insbesondere der Schritt 3 ist mir noch nicht klar.

Sind die Dateien als Email-Patch geschickt worden oder ganz normal die einzelnen Dateien als Anhang an eine Email? Quasi analog zum Kopieren der Dateien über einen USB-Stick?
Genau... Als Anhang wie per UPS-Stick..

@Namenloser Danke für Deine ausführliche Anleitung! Das habe ich schon verstanden.

Mein Problem ist, dass ich, obwohl ich die Version der "Datei.pas" als letzter editiert habe, diese Datei bei mergen aus dem anderen Brach überschrieben wird.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 17:57
Es ist immer noch recht abstrakt, wenn man die entsprechende Datei nicht vor sich hat. Welches Problem entsteht denn konkret dadurch, dass die andere Datei „übernommen“ wird? Ist dadurch Code, den du hinzugefügt hast, verloren gegangen? Oder hast du vielleicht Ballast-Code ausgemistet und er ist jetzt wieder drin?

Und hat Mercurial beim Merge überhaupt einen Konflikt angezeigt oder ging der Merge von vornherein automatisch durch? Sind Bedienfehler ausgeschlossen? Könnte ja sein, dass du versehentlich im Konfliktfenster voreilig einen der Buttons gedrückt hast . Dass Mecurial von alleine einfach Änderungen überschreibt, kann ich mir eigentlich nicht vorstellen. Es sei denn, die Datei wäre im Binärmodus, aber dann hätte imo die aktuellere Version übernommen werden müssen.

Generell denke ich jedenfalls nicht, dass die Revisionsnummer direkt etwas damit zu tun hat.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.958 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 18:07
Es ist immer noch recht abstrakt
OK Nochmal!

gegeben ist ein Verzeichniss mit 400 *.pas Files.

Die "Datei.Pas" hab ich bearbeite und bearbeitet und bearbeitet...

Dann erhalte ich vom Kollegen einen Zip-File mit diesen 400 Dateien... (Seine Version)
Diese kopiere ich in mein Verzeichnis und Committe diese in einen eigenen Branch.
Dann aktualisiere ich meine Workcopy wieder auf meinen stand und arbeite weiter.
Die "Datei.pas" habe ich das letzte mal vor dem Kopieren der Zip Datei geändert.
Wenn ich 10 Revisionen später dann den Brach merge übernimmt Mercurial die Datei vom Kollegen, da diese Datei eine höhere Revision hat als meine letzte Änderung der Datei. Kein Konflikt!

Wo liegt mein Fehler?

Mavarik
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 18:30
Achso, ich glaube jetzt verstehe ich das. Allerdings ist das genau das Verhalten, was ich von Mercurial an der Stelle erwartet hätte.

Code:

Branch mit Version vom Kollegen:            .-> 4 (Dateien mit Dateien vom Kollegen überschrieben) -----.
Dein Branch:                    1 -> 2 -> 3 +-----> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 +-> 15 (merge)
Die Branches bilden eigentlich parallele Prozesse ab.

Dein Denkfehler besteht darin, dass du die Reihenfolge, in der du die alternativen Realitäten (Branches) manipuliert hast, gleichsetzt mit der zeitlichen Abfolge innerhalb der Realitäten selbst. In Revision 4 hast du Schrödingers Katze umgebracht, dann bist du in der Zeit zurückgereist zu Revision 3, und diesmal hast du seine Katze leben lassen (Revision 5). In welcher Reihenfolge du das gemacht hast und ob du zwischendurch noch einen Kaffee getrunken hast, ist Schrödingers Katze egal, sie kriegt davon auch gar nichts mit .

Um von Schrödinger wegzukommen: Es hätte auch sein können, dass nicht du selbst beide Branches bearbeitest, sondern nur deinen eigenen und ein Kollege den anderen. Dann wäre 3 der letzte gemeinsame Stand gewesen, von dort aus hast du Revision 5 entwickelt und der Kollege Revision 4.

Anschließend wurden beide Branches gemerged. Da der Kollege die Datei nach Revision 3 noch bearbeitet hat, du aber nicht, wird natürlich die vom Kollegen bearbeitete Version übernommen.

Geändert von Namenloser (20. Dez 2013 um 18:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.899 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Verständnissfrage zu Mercurial (TortoiseHg)

  Alt 20. Dez 2013, 19:18
Die "Datei.Pas" hab ich bearbeite und bearbeitet und bearbeitet...
Ich nehme an, du machst jetzt ein Commit und die Revision bekommt die Nr. 20

Dann erhalte ich vom Kollegen einen Zip-File mit diesen 400 Dateien... (Seine Version)
Diese kopiere ich in mein Verzeichnis und Committe diese in einen eigenen Branch.
Hier ist offenbar das Problem. Das Repo kennt deine Änderungen an der Datei in Revision 20. Der Branch, der hier entsteht basiert auf diesem Stand, bekommt aber eine alte Datei beim Commit untergejubelt. Diese wird dann natürlich als die aktuelle Version behandelt und ist "neuer" als die aus der Revision 20.

Du müsstest eigentlich vor dem Kopieren der Kollegen-Files erst wieder auf den Stand updaten, der dem gemeinsamen Branch entspricht. Dort hat die besagte Datei ja noch den ursprünglichen Zustand und beim Commit wird keine Änderung erkannt. Damit ist deine Version aus Revision 20 die aktuellere.

Ich verwende für solche Synchronisationsarbeiten mit nicht HG-Teilnehmern immer einen eigenen Clone, den ich dann per Push/Pull mit meinem Arbeits-Clone abgleiche.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf