Warum nicht ungelöste Änderungen vornehmen?


15

In einem herkömmlichen VCS kann ich verstehen, warum Sie keine ungelösten Dateien festschreiben, weil Sie den Build unterbrechen könnten. Ich verstehe jedoch nicht, warum Sie nicht aufgelöste Dateien in einem DVCS nicht festschreiben sollten (einige von ihnen verhindern tatsächlich, dass Sie die Dateien festschreiben).

Stattdessen denke ich, dass Ihr Repository für Push und Pull gesperrt sein sollte , aber nicht für Commits.

Das Festschreiben während des Zusammenführungsprozesses hat mehrere Vorteile (wie ich es sehe):

  • Die tatsächlichen Änderungen der Zusammenführung sind im Verlauf.
  • Wenn die Zusammenführung sehr umfangreich war, konnten Sie regelmäßige Festschreibungen vornehmen.
  • Wenn Sie einen Fehler gemacht haben, ist es viel einfacher, ein Rollback durchzuführen (ohne die gesamte Zusammenführung wiederholen zu müssen).
  • Die Dateien können als ungelöst markiert bleiben, bis sie als aufgelöst markiert werden. Dies würde ein Drücken / Ziehen verhindern.

Möglicherweise kann auch eine Reihe von Änderungssätzen als Zusammenführung fungieren, anstatt nur einer. Auf diese Weise können Sie weiterhin Tools wie verwenden git rerere.

Warum wird das Festschreiben mit nicht aufgelösten Dateien verpönt / verhindert? Gibt es einen anderen Grund als die Tradition?


1
Von wem wird es missbilligt oder verhindert?
pdr

@pdr Einige Entwickler, mit denen ich zusammengearbeitet habe, haben es verpönt. Zumindest hg 1.6nach einer Zusammenführung werden Dateien als ungelöst markiert. hgwird nicht lassen Sie sich verpflichten , bis Sie sie als gelöst markiert haben (nicht notwendigerweise bedeutet , man muss sie eigentlich lösen, aber ich würde davon ausgehen , dass die Idee ist).
Explosion Pills

1
Meinen Sie mit "ungelösten Dateien" eigentlich "ungelöste Zusammenführungen"?
pdr

@pdr nein, verwaltet hgtatsächlich eine Liste der Dateien, die als "gelöst" (mit hg resolve) markiert wurden oder nicht . Wenn sich Uauf dieser Liste Dateien befinden , können Sie keine Commits ausführen.
Explosion Pills

1
hg resolvewird speziell für Zusammenführungen mit Konflikten verwendet; Siehe selenic.com/mercurial/hg.1.html#resolve . Note that Mercurial will not let you commit files with unresolved merge conflicts. You must use hg resolve -m ... before you can commit after a conflicting merge.
Mike Partridge

Antworten:


6

Das größte Problem, das ich sehen kann, ist, dass ein Fenster mit Festschreibungen erstellt wird, in dem die Dinge zur Hälfte zusammengeführt werden und (wahrscheinlich) nicht richtig funktionieren. Wenn Sie die letzten lokalen Festschreibungen vornehmen, werden alle diese Zwischenfestschreibungen auch für alle anderen angezeigt. In einer idealen Welt sollte ich in der Lage sein, ein Commit auszuführen, und der Code sollte funktionieren. Wenn Sie mitten in Zusammenführungen mit dem Festschreiben beginnen, ist der Status des Codes nicht genau definiert.

Eine Sache, die Sie tun können, ist, lokale Commits für Ihre Zusammenführung zu erstellen und diese dann zu einem großen Commit zu bündeln, wenn Sie Pushs ausführen (obwohl ich nicht sicher bin, wie (wenn?) Ein vcs dies unterstützt). Obwohl dies einige der von Ihnen genannten Vorteile mit sich bringt, bin ich mir nicht sicher, ob es die zusätzliche Komplexität wert ist (wir haben es bereits mit einem ziemlich verwirrenden und komplexen Bereich zu tun).


5
Ich weiß nicht , dass ich mit der Fähigkeit zustimmen jeder zu ziehen begehen und haben es arbeiten .. viele der Punkt in einer DVCS zu begehen ist Ihr zu begehen Fortschritt , so Sachen , gebrochen werden gebunden ist oder unvollständig viel von der Zeit .
Explosion Pills

2
Immer einen Job zu haben, hat einige nette Vorteile. Wenn Sie beispielsweise versuchen, den Zeitpunkt zu ermitteln, zu dem ein Fehler aufgetreten ist, ist es hilfreich, den Verlauf zu durchsuchen, um festzustellen, wann ein Fehler aufgetreten ist (vcs verfügen sogar über Befehle zum Durchführen einer binären Suche über den Verlauf). Wenn Sie keine funktionierenden Commits haben, können Sie Fehler nicht so effektiv aufspüren.
Oleksi

1
Git unterstützt gebündelte Commits.
Deltree

3

Ich kenne mich am besten mit Git aus, daher werde ich mich für diese Perspektive einsetzen.

Ich sehe keinen Grund, warum Sie oder ein gutes VCS das Festschreiben einer nicht zusammengeführten Datei zulassen möchten, insbesondere wenn es sich um Code handelt. Sie müssen das Repository in einem konsistenten Zustand halten, und was Sie vorschlagen, würde die Atomarität des Commits verletzen. Viele VCS ändern die Datei physisch, um anzuzeigen, wo die Konflikte auftreten - Git, SVN und CVS verwenden >>>> <<<< Typmarkierungen. In einem VCS mit Commits und Merges auf atomarer Repository-Ebene hätten Sie nur einen Knoten erstellt, der für niemanden außer Ihnen Sinn macht. In der Softwareentwicklung konnte Ihr Projekt nicht erstellt werden. Im Dokument einer Gruppe weiß niemand, welche Änderungen richtig sind.

Git stellt nun einige Tools zur Verfügung, die dies erleichtern könnten, sofern die von Ihnen vorgeschlagene Art der Festschreibung zulässig ist. Sie könnten beispielsweise alle von Ihnen zusammengeführten Commits zusammenpressen, bevor Sie einen Push ausführen. Dies entspricht einem typischen Merge-Commit.

Besondere Bedenken hinsichtlich Ihrer Liste der Vorteile:

  1. Die tatsächlichen Änderungen der Zusammenführung sind im Verlauf. Warum brauchen Sie zusätzliche Informationen? DVCS sind sehr gut darin, Konflikte auf begrenzte Bereiche zu beschränken. Wenn Sie sich für einen Änderungssatz entschieden haben, erhalten Sie genau dies, wenn Sie die Kopie des Merge-Commit-Knotens mit der vorherigen Kopie vergleichen.
  2. Wenn die Zusammenführung sehr umfangreich war, konnten Sie regelmäßige Commits durchführen. Dies ist eine berechtigte Sorge, aber Sie sollten niemals hierher kommen. Zweige sollten ständig Änderungen im Vorfeld vornehmen, damit dies nie passiert. Tools wie rebaseoder das Auswählen eines Commits nach dem anderen können Ihnen in bestimmten Situationen auch dabei helfen.
  3. Wenn Sie einen Fehler gemacht haben, ist es viel einfacher, ein Rollback durchzuführen (ohne die gesamte Zusammenführung wiederholen zu müssen). Siehe oben - Ihre Konflikte sollten nicht so unüberschaubar werden.

Der einzige Weg, wie dieser Vorschlag funktionieren könnte, wäre, wenn der Zweig eine atomare Zusammenführung wäre - Sie könnten eine Reihe von Festschreibungen sehen, aber dies wären nur Schritte in einer größeren Zusammenführungsfestschreibung, die als ein Knoten in der Festschreibungsstruktur behandelt werden müssten . Ich glaube nicht, dass ein aktuelles VCS diese Art von Workflow unterstützt, und ich denke nicht, dass dies notwendig ist.


Konflikte sollten wahrscheinlich nicht so unüberschaubar werden, sind es aber häufig (zumindest nach meiner Erfahrung). Ich denke , dass die ganze merge sollte atomar sein; das ist was ich vorschlage. Vielleicht nicht nötig, ich frage mich nur, warum es nicht gemacht wurde. Sie können auch nicht unbedingt die eine oder andere Option in einem Konflikt auswählen. manchmal ist es eine Kombination aus beiden Änderungen. Das ist besonders verwirrend.
Explosion Pills

Msgstr "Sie müssen das Repository in einem konsistenten Zustand halten". Ich glaube nicht, dass das stimmt. Ein lokales Repository ist ein Arbeitsbereich , kein Schrein. Wenn es hilfreich ist, mitten in einer Zusammenführung ein Commit durchzuführen, tun Sie es IMHO. Wenn Sie dies tun, weil Sie es nicht besser wissen, würde ich vorschlagen, es nicht zu tun. Wenn Sie jedoch ein erfahrener Programmierer sind, sollten Sie das tun, was für Sie am besten funktioniert. Seien Sie nicht dogmatisch, wenn es darum geht, Ihr lokales Repository makellos zu halten.
Bryan Oakley

1

Meine Haupterfahrung liegt bei Mercurial, obwohl ich Git auch sporadisch benutze.

Mercurial verbietet Ihnen nicht, ungelöste Dateien zu übertragen, sondern entmutigt Sie nur. Gleiches gilt für das Drücken vor dem Ziehen von Änderungen, die Sie nicht haben.

Alles, was Sie in Mercurial tun müssen, ist, wenn Sie die Dateien so haben, wie Sie sie festschreiben möchten:

hg resolve --mark --all
hg commit -m "I'm such a rebel"

--mark markiert Dateien als aufgelöst, ohne dass Sie dazu aufgefordert werden, das Zusammenführungs-Tool zu verwenden. --all sorgt dafür, dass alle Dateien mit Konflikten markiert werden.

Wenn Sie pushen möchten, ohne zu ziehen (und folglich die Änderungen anderer zusammenführen müssen), machen Sie es wie ein Jedi :

hg push --force

Der nächste Spieler, der zieht, erhält +1 Kopf (kein Wortspiel beabsichtigt)

Ich bin mir sicher, dass es eine Möglichkeit gibt, dasselbe mit Git zu tun (obwohl es wahrscheinlich komplizierter ist).


1

Beim Zusammenführen in git werden alle Änderungen (einschließlich der Zusammenführungskonflikte) sofort übernommen. Anschließend löse ich bei meinen nächsten Commits die Zusammenführungskonflikte mit einem Texteditor. Nachdem die Konflikte gelöst sind, drücke ich dann auf Wunsch.

Ehrlich gesagt verstehe ich nicht, warum andere es nicht so machen oder git es nicht erzwingt.

  • Das "Merge Commit" ist jetzt ein sauberer Verlauf dessen, was zusammengeführt werden musste.
  • Die folgenden Festschreibungen zeigen genau, was Sie getan haben, um die Zusammenführungskonflikte zu lösen.
  • Wenn Sie pushen, werden Konflikte bis dahin gelöst und der Build an der Spitze des Zweigs wird nicht unterbrochen.
  • Wenn Sie die Konfliktlösung vermasseln, können Sie jederzeit einfach zu einem der "Post Merge" -Commits zurückkehren und es erneut versuchen.

Ein großer Nachteil des Standard-Workflows zum Lösen von Konflikten vor dem Festschreiben besteht darin, dass sich Änderungen an Ihrer lokalen Kopie einschleichen können. Die Ergänzungen werden durch den massiven Merge Diff vor der Codeüberprüfung verborgen, sodass Sie nicht bemerken, dass Sie versehentlich eine API festgelegt haben Schlüssel oder etc.

Mein oben beschriebener Workflow vermeidet dieses lokale Kopierproblem und ermöglicht es den Code-Überprüfern, (nur) die Details Ihrer Zusammenführungsauflösung in einem Commit-Diff zu untersuchen, der genau wie ein Standard-Commit-Diff aussieht.


0

Ich denke, es ist am besten, kleine Änderungen zu pushen und oft zu pushen, wenn es möglich ist (und natürlich nicht immer), und keinen Code zu schreiben, der nicht erstellt wird oder halb vollständig ist (wir machen alle Fehler, aber machen keine Fehler) nicht absichtlich machen). Ich komme auch aus Git, und eines der besten Dinge, die ich denke, ist die Tatsache, dass Sie eine funktionsfähige Kopie des Repos auf Ihrem Desktop haben können ... die Sie dann nach Herzenslust ändern können. Wenn Ihre großen Änderungen abgeschlossen sind, senden Sie es weg.

Eine Menge Open Source mit Git zu machen. Die größte Frustration für mich war, dass der halbe Code in das Repo gepackt wurde und versucht wurde, einen Build zu erstellen, was aber nicht gelang, da der Typ die halbe Arbeit erledigte und sagte: "Ich bin jetzt beschäftigt Ich werde es in einer Woche beenden ". Also müsste ich es irgendwann ausrangieren (was den Kerl ärgern würde) oder mir die Zeit nehmen, es fertigzustellen und vollständig zu integrieren.

Ich denke aus meiner Sicht, behalte das Zeug für den halben Hintern vor Ort, schicke das gute Zeug über den Draht.


0

Sei kein Sklave deiner Werkzeuge.

Das Ziel eines VCS ist es, Sie in die Lage zu versetzen, Ihre Arbeit zu erledigen. Ihre Aufgabe ist es nicht , ein makelloses lokales Repository zu führen, sondern Code zu schreiben. Wenn Sie frühzeitig und häufig vor Ort ein Commit durchführen, können Sie besser arbeiten.

Sie sollten jedoch keinen fehlerhaften Code in den Upstream übertragen.


0

Grundsätzlich ist es eine schlechte Idee - es führt Sie zu einem Repository, das sich in einem schlechten Zustand befindet (und es ist ein Ausschlag anzunehmen, dass Sie jemals irgendwohin pushen werden, obwohl man argumentieren würde, dass Sie immer mindestens eine Kopie haben sollten).

Ich kann sehen, dass Sie im Falle einer großen / komplexen Zusammenführung möglicherweise Ihre laufenden Arbeiten speichern und einen Referenzpunkt festlegen möchten, das System jedoch weiterhin in einem Zustand der Unordnung belassen, der behoben werden muss.

Und es gibt Alternativen - Sie haben die Möglichkeit, von früher als dem Kopf zusammenzuführen -, die Ihnen die Möglichkeit geben, sich an Änderungen anzupassen, ohne epische Zusammenführungen (oder zumindest mit größeren Zusammenführungen, die leichter zu verstehen sind).

Dies ist der Fall, für den ich die Rebase von Git besonders nützlich finde (unter Berücksichtigung der üblichen Einschränkungen beim Rebasing), da Sie Ihre Änderungen auf dem aktuellen Stand wiedergeben, auf dem Sie Konflikte in kleineren Teilen beheben können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.