If you do get conflicts during rebasing however, Git will pause on the conflicting commit, allowing you to fix the conflict before proceeding. Solving conflicts in the middle of rebasing a long chain of commits is often confusing, hard to get right, and another source of potential errors.
Also dass ist ja wohl der absolute Quatsch.
Tatsächlich ist dies der Hauptgrund, warum ich rebase (und viele kleine Commits) benutze!
Bei mir sind die Regeln so:
Master
muss immer kompilieren.
Wenn ich ein Feature entwickle wird nach jeder TDD-Mikroiteration committet, also ein Zustand, in dem das Projekt compiliert und alle Tests grün sind.
Wenn jetzt bei einem rebase Konflikte auftreten ist es entgegen der Behauptung des Autors überhaupt nicht schwierig herauszufinden, wie der gewünschte Zustand ist. Erstens können bei kleinen Änderungen auch nur wenige überschaubare Konflikte auftreten die sich mit der Message des aktuellen Kommits abgleichen lassen (wenn man vernünftige Messages macht) Und weil die Vorbedinung für den Commit war, dass das Projekt kompiliert muss das nach dem Rebase jedes einzelnen Commits wieder so sein. Wenn dann die Kompilierfehler beseitigt sind sagen mir anschließend die Unittests, ob die Funktionalität noch stimmt.
Ich finde es im Gegenteil viel schwieriger die Konflikte eines Merge aufzulösen.
Consider the case where a dependency that is still in use on feature
has been removed on master
Ich kenne natürlich seine Umgebung nicht, aber in den Projekten, in denen ich bisher so gearbeitet habe wurde niemals je ein Feature aus master
entfernt. Scheint mir, als würde hier ein extremer Sonderfall zum NoGo-Kriterium aufgeblasen.
Because it is our most important tool for tracking down the source of bugs in our code. Git is our safety net.
Da hat er wohl die Rolle von git
falsch verstanden: Das „safey net“ sind die UnitTests, nicht git
.
A while back, I had to bisect through several hundred commits to track down a bug in our system. The faulty commit was located in the middle of a long chain of commits that didn’t compile, due to a faulty rebase a colleague had performed.
Ja, der Kollege hat einen Fehler gemacht. Offenbar hat er weder während der Konfliktauflösung noch nach dem Rebase versucht das Projekt zu kompilieren. Ergo wäre der Fehler auch bei einem normalen Merge aufgetreten. Denn wenn er den Kompiler nach dem Rebase nicht angeworfen hat, warum sollte er das dann nach einem Merge machen?
So how can we avoid these chains of broken commits during rebasing?
Beide vorgeschlagenen Methoden sind unbrauchbar. Die erste ist im Prinzip genau der Merge, die zweite einfach overkill und unnötig. Rebase selbst erzeugt keine Fehler (wenn keine Konflikte auftreten). Und wenn beim rebase konflikte auftreten hat mans einfacher, wenn es prüfbare Zielbedingungen gibt: Projekt kompiliert, Unittests sind grün.
Alles andere ist Unsinn.
There is; Git merge. It’s a simple, one-step process, where all conflicts are resolved in a single commit.
Was ich (wie beschrieben) ehr als Nachteil empfinde.
The resulting merge commit clearly marks the integration point between our branches,
Den erhalte ich auch wenn ich das Feature nach dem Rebase mittels --no-ff
nach master merge.
What motivates people to rebase branches?
I’ve come to the conclusion that it’s about vanity. Rebasing is a purely aesthetic operation.
Für mich gibt es handfeste Vorteile gerade bei der Auflösung von Konflikten wenn ich währen der Entwicklung des Features die Aktualisierungen im master integrieren will.
The apparently clean history appeals to us as developers, but it can’t be justified, from a technical nor functional standpoint.
Das ist der einzige Punkt, in dem ich dem Autor zustimme. Der trifft aber nicht auf das rebase zu, sondern auf das weit verbreitete squash. In einigen Projekten der Community darf ein Feature, dass man beisteuern möchte, nur einen einzigen Commit haben. Das ist dann „a purely aesthetic operation“ und eine Verfälschung der Historie.
bye
TT