OK, ich dachte, das wäre ein einfaches Git-Szenario. Was vermisse ich?
Ich habe einen master
Zweig und einen feature
Zweig. Ich arbeite daran master
, einige daran feature
und dann noch mehr master
. Am Ende habe ich so etwas (die lexikografische Reihenfolge impliziert die Reihenfolge der Commits):
A--B--C------F--G (master)
\
D--E (feature)
Ich habe kein Problem damit git push origin master
, die Fernbedienung auf dem neuesten master
Stand zu halten oder eine Remote-Sicherung für meine Arbeit zu verwalten git push origin feature
(wenn diese aktiviert ist feature
) feature
. Bis jetzt sind wir gut.
Aber jetzt möchte ich mich zusätzlich feature
zu den F--G
Commits auf Master neu gründen , also ich git checkout feature
und git rebase master
. Immer noch gut. Jetzt haben wir:
A--B--C------F--G (master)
\
D'--E' (feature)
Problem: In dem Moment, in dem ich die neue feature
verzweigte Verzweigung sichern möchte git push origin feature
, wird der Push abgelehnt, da sich der Baum aufgrund der Neubasierung geändert hat. Dies kann nur mit gelöst werden git push --force origin feature
.
Ich hasse es zu benutzen, --force
ohne sicher zu sein, dass ich es brauche. Also brauche ich es? Ist die Rebasieren unbedingt bedeuten , dass der nächste push
sein sollte --force
ful?
Dieser Feature-Zweig wird nicht mit anderen Entwicklern geteilt, daher habe ich de facto kein Problem mit dem Force-Push. Ich werde keine Daten verlieren. Die Frage ist konzeptioneller.
git pull feature-branch
, wird ein neues Zusammenführungs-Commit generiert (durch Zusammenführen von Remote- und lokalen Versionen des Feature-Zweigs). Entweder erhalten Sie nach dem erneuten Basieren eine unnötige Zusammenführung, oder Sie drücken mit--force
.push --force
ist dies kein Problem), um den Commit-Verlauf ohne Zusammenführungs-Commits linear zu halten.--force-with-lease
wie @hardev vorgeschlagen ist eine großartige OptionAnstelle von -f oder --force sollten Entwickler verwenden
Warum? Weil es den Remote-Zweig auf Änderungen überprüft, was absolut eine gute Idee ist. Stellen wir uns vor, James und Lisa arbeiten an demselben Feature-Zweig und Lisa hat ein Commit vorangetrieben. James stößt jetzt seine lokale Niederlassung zurück und wird abgelehnt, wenn er versucht zu pushen. Natürlich glaubt James, dass dies auf Rebase zurückzuführen ist und verwendet --force und würde alle Änderungen von Lisa neu schreiben. Wenn James --force-with-lease verwendet hätte, hätte er eine Warnung erhalten, dass es Commits gibt, die von jemand anderem gemacht wurden. Ich verstehe nicht, warum irgendjemand --force anstelle von --force-with-lease verwenden würde, wenn er nach einer Rebase pusht.
quelle
git push --force-with-lease
hat mir einen Haufen gerettet.--force-with-lease
das--force
Ich würde stattdessen "checkout -b" verwenden und es ist leichter zu verstehen.
Wenn Sie löschen, verhindern Sie, dass ein vorhandener Zweig mit einer anderen SHA-ID eingegeben wird. In diesem Fall lösche ich nur den Remote-Zweig.
quelle
push --force
, ist also nur ein Weg, um ein Git-Repo zu verhindern--force
. Daher halte ich dies nicht für eine gute Idee - entweder das Repo erlaubt espush --force
oder aus gutem Grund deaktiviert es es. Die Antwort von Nabi ist besser geeignet, wenn sie--force
auf dem Remote-Repo deaktiviert ist, da nicht das Risiko besteht, dass Commits von anderen Entwicklern verloren gehen oder auf andere Weise Probleme verursachen.Eine Lösung hierfür besteht darin, das zu tun, was das Rebasing-Merge- Skript von msysGit tut - nach dem Rebase den alten Kopf von
feature
with zusammenzuführen-s ours
. Am Ende erhalten Sie das Commit-Diagramm:... und Ihr Push-of
feature
wird ein schneller Vorlauf sein.Mit anderen Worten, Sie können tun:
(Nicht getestet, aber ich denke das ist richtig ...)
quelle
git rebase
(anstattmaster
wieder in Ihren Feature-Zweig zu wechseln) ist die Erstellung eines sauberen Verlaufs linearer Commits. Mit Ihrem Ansatz wird die Geschichte noch schlimmer. Und da durch das erneute Basieren neue Commits ohne Bezugnahme auf ihre vorherigen Versionen erstellt werden, bin ich mir nicht einmal sicher, ob das Ergebnis dieser Zusammenführung angemessen sein wird.merge -s ours
ist, dass künstlich ein übergeordneter Verweis auf die vorherige Version hinzugefügt wird. Sicher, die Geschichte sieht nicht sauber aus, aber der Fragesteller scheint besonders gestört zu sein, wenn er den Druck desfeature
Zweigs erzwingen muss , und das umgeht das. Wenn Sie neu aufbauen möchten, ist es mehr oder weniger das eine oder andere. :) Generell finde ich es interessant, dass das msysgit-Projekt dies tut ....ours
Strategie schon einmal gesehen , aber ich dachte, sie gilt nur für Konfliktsituationen, indem sie automatisch mithilfe von Änderungen in unserer Branche gelöst werden. Es stellte sich heraus, dass es anders funktioniert. Und auf diese Weise zu arbeiten ist sehr nützlich, wenn Sie eine neu basierte Version benötigen (z. B. damit der Repo-Betreuer sie sauber anwenden kannmaster
), aber ein erzwungenes Drücken vermeiden möchten (wenn viele andere Personen aus irgendeinem Grund Ihren Feature-Zweig verwenden).Es kann sein, dass sich in diesem Zweig nur ein Entwickler befindet oder nicht, der jetzt (nach der Rebase) nicht mit dem Ursprung / der Funktion übereinstimmt.
Als solches würde ich vorschlagen, die folgende Sequenz zu verwenden:
Ja, neuer Zweig, dies sollte dies ohne --force lösen, was meiner Meinung nach im Allgemeinen ein großer Nachteil ist.
quelle
Ich vermeide den Force Push, indem ich einen neuen Zweig erstelle und die Arbeit an diesem neuen Zweig fortsetze und nach einiger Stabilität den alten Zweig entferne, der neu basiert wurde:
quelle
Andere haben Ihre Frage beantwortet. Wenn Sie einen Zweig neu gründen, müssen Sie erzwingen, um diesen Zweig zu verschieben.
Rebase und ein gemeinsam genutztes Repository verstehen sich im Allgemeinen nicht. Dies schreibt die Geschichte neu. Wenn andere diesen Zweig verwenden oder von diesem Zweig verzweigt haben, ist eine erneute Basis ziemlich unangenehm.
Im Allgemeinen funktioniert Rebase gut für das lokale Filialmanagement. Die Remote-Zweigstellenverwaltung funktioniert am besten mit expliziten Zusammenführungen (--no-ff).
Wir vermeiden auch, Master in einen Feature-Zweig zusammenzuführen. Stattdessen werden wir auf Master zurückgesetzt, jedoch mit einem neuen Zweignamen (z. B. Hinzufügen eines Versionssuffix). Dadurch wird das Problem der erneuten Basierung im gemeinsam genutzten Repository vermieden.
quelle
Was ist los mit einem
git merge master
auf demfeature
Ast? Dadurch bleibt Ihre Arbeit erhalten, während Sie sie vom Hauptzweig trennen.Edit: Ah sorry hat deine Problemstellung nicht gelesen. Sie benötigen Kraft, wenn Sie a
rebase
. Alle Befehle, die den Verlauf ändern, benötigen das--force
Argument. Dies ist ausfallsicher, um zu verhindern, dass Sie Arbeit verlieren (die alteD
undE
würde verloren gehen).Sie haben also eine ausgeführt,
git rebase
die den Baum so aussehen ließ (obwohl er teilweise versteckt istD
undE
sich nicht mehr in einem benannten Zweig befindet):Wenn Sie also versuchen, Ihren neuen
feature
Zweig (mitD'
undE'
darin) zu verschieben, verlieren SieD
undE
.quelle
Für mich funktionieren folgende einfache Schritte:
Nachdem Sie alle oben genannten Schritte ausgeführt haben, können Sie auch den myFeature-Zweig mit dem folgenden Befehl löschen:
quelle
Folgendes funktioniert für mich:
git push -f origin branch_name
und es entfernt keinen meiner Codes.
Wenn Sie dies jedoch vermeiden möchten, können Sie Folgendes tun:
Dann können Sie alle Ihre Commits für die neue Niederlassung auswählen.
git cherry-pick COMMIT ID
und dann schieben Sie Ihren neuen Zweig.quelle
-f
ist ein Alias für--force
, was die Frage nach Möglichkeit zu vermeiden versucht.Da das OP das Problem versteht, sucht es nur nach einer schöneren Lösung ...
Wie wäre es damit als Übung?
Haben Sie auf tatsächlichen Feature-Entwicklungszweig (wo Sie nie neu gründen und erzwingen, damit Ihre Kollegen Feature-Entwickler Sie nicht hassen). Hier können Sie diese Änderungen regelmäßig mit einer Zusammenführung von main abrufen. Messier Geschichte , ja, aber das Leben ist einfach und niemand wird in seiner Arbeit unterbrochen.
Haben Sie einen zweiten Zweig zur Entwicklung von Funktionen, in dem ein Mitglied des Feature-Teams alle Feature-Commits regelmäßig dazu drängt, tatsächlich neu zu gründen, tatsächlich zu erzwingen. Also fast sauber basierend auf einem relativ neuen Master Commit. Wenn die Funktion abgeschlossen ist, schieben Sie diesen Zweig auf den Master.
Möglicherweise gibt es bereits einen Musternamen für diese Methode.
quelle