Es wird oft gesagt, dass Sie Commits, die Sie bereits gepusht haben, nicht zurücksetzen sollten. Was könnte das bedeuten?
Es wird oft gesagt, dass Sie Commits, die Sie bereits gepusht haben, nicht zurücksetzen sollten. Was könnte das bedeuten?
Antworten:
Das ProGit-Buch hat eine gute Erklärung .
Die spezifische Antwort auf Ihre Frage finden Sie im Abschnitt " Die Gefahren des Wiederaufbaus ". Ein Zitat aus diesem Abschnitt:
Wenn Sie Inhalte neu erstellen, geben Sie vorhandene Commits auf und erstellen neue, die ähnlich, aber unterschiedlich sind. Wenn Sie Commits irgendwo pushen und andere sie nach unten ziehen und die Arbeit darauf aufbauen, und Sie diese Commits dann mit git rebase neu schreiben und wieder nach oben drücken, müssen Ihre Mitarbeiter ihre Arbeit neu zusammenführen, und die Dinge werden chaotisch, wenn Sie es versuchen ziehe ihre Arbeit zurück in deine.
Update:
Basierend auf Ihrem Kommentar unten scheint es, als hätten Sie Probleme mit Ihrem Git-Workflow. Hier sind einige Referenzen, die helfen können:
gitworkflows
Manpage: Siehe "Zusammenführen nach oben" und "Themenzweige"Um dies zu verstehen, müssen wir ein bisschen verstehen, wie Git funktioniert. Ein Git-Repository ist eine Baumstruktur, bei der die Knoten des Baums Commits sind. Hier ist ein Beispiel für ein sehr einfaches Repository:
Es gibt vier Commits im Hauptzweig, und jedes Commit hat eine ID (in diesem Fall a, b, c und d). Sie werden feststellen, dass d derzeit das letzte Commit (oder HEAD) des Hauptzweigs ist.
Hier haben wir zwei Zweige: Master und My-Zweig. Sie können sehen, dass Master und My-Branch Commits a und b enthalten, aber dann beginnen sie zu divergieren: Master enthält c und d, während My-Branch e und f enthält. b soll die "Merge-Basis" meines Zweigs im Vergleich zum Master sein - oder häufiger nur die "Basis". Es macht Sinn: Sie können sehen, dass my-branch auf einer früheren Version von master basiert.
Nehmen wir also an, mein Zweig ist veraltet und Sie möchten ihn mit der neuesten Version von master auf den neuesten Stand bringen. Anders ausgedrückt, mein Zweig muss c und d enthalten. Sie könnten eine Zusammenführung durchführen, dies führt jedoch dazu, dass der Zweig seltsame Zusammenführungs-Commits enthält, die das Überprüfen der Pull-Anforderung erheblich erschweren. Stattdessen können Sie eine Rebase durchführen.
Wenn Sie neu gründen, findet git die Basis Ihres Zweigs (in diesem Fall b), findet alle Commits zwischen dieser Basis und HEAD (in diesem Fall e und f) und spielt diese Commits auf dem HEAD des Zweigs erneut ab Sie basieren auf (in diesem Fall Master). Git erstellt tatsächlich neue Commits, die darstellen, wie Ihre Änderungen über dem Master aussehen: Im Diagramm werden diese Commits als e 'und f' bezeichnet. Git löscht Ihre vorherigen Commits nicht: e und f bleiben unberührt, und wenn bei der Rebase etwas schief geht, können Sie direkt zu dem zurückkehren, was früher war.
Wenn viele verschiedene Personen gleichzeitig an einem Projekt arbeiten, können Pull-Anforderungen schnell veralten. Eine "veraltete" Pull-Anforderung ist nicht mehr mit der Hauptentwicklungslinie auf dem neuesten Stand und muss aktualisiert werden, bevor sie in das Projekt integriert werden kann. Der häufigste Grund, warum Pull-Anforderungen veraltet sind, liegt in Konflikten: Wenn zwei Pull-Anforderungen ähnliche Zeilen in derselben Datei ändern und eine Pull-Anforderung zusammengeführt wird, tritt bei der nicht zusammengeführten Pull-Anforderung jetzt ein Konflikt auf. Manchmal kann eine Pull-Anforderung ohne Konflikte veraltet sein: Möglicherweise erfordern Änderungen in einer anderen Datei in der Codebasis entsprechende Änderungen in Ihrer Pull-Anforderung, um der neuen Architektur zu entsprechen, oder der Zweig wurde erstellt, als jemand versehentlich fehlgeschlagene Komponententests mit dem zusammengeführt hat Hauptzweig. Unabhängig vom Grund
Durch erneutes Basieren wird der Verlauf neu geschrieben. Wenn niemand etwas über diese Geschichte weiß, ist das vollkommen in Ordnung. Wenn diese Geschichte jedoch öffentlich bekannt ist, funktioniert das Umschreiben der Geschichte in Git genauso wie in der realen Welt: Sie brauchen eine Verschwörung.
Verschwörungen sind wirklich schwer zusammenzuhalten, deshalb vermeiden Sie es besser, öffentliche Zweige überhaupt neu zu gründen.
Beachten Sie, dass es sind Beispiele für erfolgreiche Verschwörungen: Der pu
Zweig der Junio C. Hamano git - Repository (das offizielle Repository des Git SCM) wird häufig indexiert. Dies funktioniert so, dass so ziemlich jeder, der sie verwendet, pu
auch die Git-Entwickler-Mailingliste abonniert hat und die Tatsache, dass der pu
Zweig neu basiert, auf der Mailingliste und der Git-Website weit verbreitet ist.
pu
Zweig von git.git ist ein äußerst hilfreiches Beispiel für die Verwendung von Rebase in einem (öffentlichen) Workflow. Für diejenigen, die nicht damit vertraut sind, besteht die allgemeine Idee darin, Themenzweige, in denen keine Commits vorhanden sind next
(der instabile Zweig unmittelbar vor dem Zusammenführen mit dem Master), neu zu gründen und dann den pu
Zweig durch Zurücksetzen auf next
und Zusammenführen aller Themenzweige neu zu erstellen . (Quelle: Documentation / howto /tenance-git.txt git.kernel.org/?p=git/git.git;a=blob;f=Documentation/howto/… )
Eine Rebase ändert den Verlauf Ihres Repositorys. Wenn Sie Commits an die Welt senden, dh sie anderen zur Verfügung stellen und dann Ihre Sicht auf den Commit-Verlauf ändern, wird es schwierig, mit jemandem zusammenzuarbeiten, der Ihren alten Verlauf hat.
Rebase als schädlich angesehen, ist eine gute Übersicht, denke ich.
git rebase
(--interactive?) Verwenden, um diesen Verlauf neu zu schreiben. Dies ist sicher ein Fehlerrezept. Andererseits, wenn ich bestimmte Änderungen am Thema neu festgelegt habe Verzweigen Sie (von Zweig X) und drücken Sie ihn. Es ist völlig normal, erneut zu starten, nachdem ein anderer Entwickler den Themenzweig geändert hat. Im Wesentlichen benutze ich seit einiger Zeitmerge
, aber wir sitzen im selben Boot wie darwinweb.net/articles/86 und die Geschichte ist fast unbrauchbar.