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?
quelle
hg 1.6
nach einer Zusammenführung werden Dateien als ungelöst markiert.hg
wird 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).hg
tatsächlich eine Liste der Dateien, die als "gelöst" (mithg resolve
) markiert wurden oder nicht . Wenn sichU
auf dieser Liste Dateien befinden , können Sie keine Commits ausführen.hg resolve
wird 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.
Antworten:
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).
quelle
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:
rebase
oder das Auswählen eines Commits nach dem anderen können Ihnen in bestimmten Situationen auch dabei helfen.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.
quelle
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:
--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 :
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).
quelle
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.
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.
quelle
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.
quelle
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.
quelle
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.
quelle