1122 Stimmen

Erzwingen von "git push" zum Überschreiben entfernter Dateien

Ich möchte meine lokalen Dateien pushen und sie in einem entfernten Repository haben, ohne mich mit Merge-Konflikten auseinandersetzen zu müssen. Ich möchte nur, dass meine lokale Version Vorrang vor der entfernten Version hat.

Wie kann ich das mit Git machen?

1467voto

Trevor Norris Punkte 18949

Sie sollten in der Lage sein, Ihre lokale Revision in das entfernte Projektarchiv zu übertragen, indem Sie

git push -f <remote> <branch>

(z.B.. git push -f origin master ). Weglassen <remote> y <branch> erzwingt einen Push aller lokalen Zweige, die die Option --set-upstream .

Seien Sie nur gewarnt, wenn andere Personen dieses Repository gemeinsam nutzen, wird ihr Revisionsverlauf mit dem neuen in Konflikt geraten. Und wenn sie nach dem Zeitpunkt der Änderung lokale Übertragungen haben, werden diese ungültig.

Update : Ich dachte, ich sollte eine Randbemerkung hinzufügen. Wenn Sie Änderungen erstellen, die von anderen überprüft werden, ist es nicht unüblich, einen Zweig mit diesen Änderungen zu erstellen und regelmäßig zu rebasen, um sie mit dem Hauptentwicklungszweig aktuell zu halten. Lassen Sie die anderen Entwickler einfach wissen, dass dies in regelmäßigen Abständen geschieht, damit sie wissen, was sie erwarten können.

Aktualisierung 2 : Aufgrund der zunehmenden Zahl von Zuschauern möchte ich einige zusätzliche Informationen darüber hinzufügen, was zu tun ist, wenn Ihr upstream erfährt einen Kraftschub.

Nehmen wir an, ich habe Ihr Repository geklont und ein paar Commits wie folgt hinzugefügt:

            D----E  topic
           /
A----B----C         development

Später jedoch wird die development Zweig wird mit einer rebase was dazu führt, dass ich eine Fehlermeldung wie die folgende erhalte, wenn ich git pull :

Unpacking objects: 100% (3/3), done.
From <repo-location>
 \* branch            development     -> FETCH\_HEAD
Auto-merging <files>
CONFLICT (content): Merge conflict in <locations>
Automatic merge failed; fix conflicts and then commit the result.

Hier konnte ich die Konflikte beheben und commit aber das würde mir eine wirklich hässliche Commit-Historie bescheren:

       C----D----E----F    topic
      /              /
A----B--------------C'  development

Es mag verlockend aussehen, die git pull --force aber seien Sie vorsichtig, denn das führt dazu, dass Sie mit gestrandeten Commits dastehen:

            D----E   topic

A----B----C'         development

Die beste Option ist also wahrscheinlich, eine git pull --rebase . Dies erfordert, dass ich alle Konflikte wie zuvor löse, aber für jeden Schritt werde ich anstelle von Commit die Option git rebase --continue . Am Ende wird der Commit-Verlauf viel besser aussehen:

            D'---E'  topic
           /
A----B----C'         development

Update 3: Sie können auch die --force-with-lease Option als "sicherere" Kraft schieben, wie von Cupcake in seinem Antwort :

Force Push mit einem "Lease" erlaubt es, dass der Force Push fehlschlägt, wenn es neue Commits auf der Gegenstelle gibt, die Sie nicht erwartet haben (technisch gesehen, wenn Sie sie noch nicht in Ihren Remote-Tracking-Zweig geholt haben), was nützlich ist, wenn Sie nicht versehentlich die Commits von jemand anderem überschreiben wollen Commits eines anderen überschreiben wollen, von denen Sie noch gar nichts wussten, und Sie wollen nur Ihre eigenen überschreiben wollen:

git push <remote> <branch> --force-with-lease

Weitere Einzelheiten über die Verwendung von --force-with-lease von einen der folgenden Punkte lesen:

162voto

Sie wollen Push erzwingen

Was Sie im Grunde tun wollen, ist, Ihren lokalen Zweig zu pushen, um den entfernten Zweig zu überschreiben.

Wenn Sie eine ausführlichere Erklärung der folgenden Befehle wünschen, lesen Sie bitte den Abschnitt "Details" weiter unten. Sie haben grundsätzlich 4 verschiedene Optionen für Force Pushing mit Git:

git push <remote> <branch> -f
git push origin master -f # Example

git push <remote> -f
git push origin -f # Example

git push -f

git push <remote> <branch> --force-with-lease

Wenn Sie eine ausführlichere Erklärung der einzelnen Befehle wünschen, lesen Sie bitte den Abschnitt mit den langen Antworten weiter unten.

Warnung: Wenn Sie das Pushen erzwingen, wird der entfernte Zweig mit dem Zustand des Zweigs, den Sie pushen, überschrieben. Vergewissern Sie sich, dass Sie das auch wirklich wollen, bevor Sie es verwenden, sonst überschreiben Sie möglicherweise Commits, die Sie eigentlich behalten wollen.

Details zum Schieben erzwingen

Angabe der entfernten Stelle und des Zweigs

Sie können bestimmte Zweige und einen Remote-Zweig vollständig angeben. Die -f Flagge ist die Kurzversion von --force

git push <remote> <branch> --force
git push <remote> <branch> -f

Weglassen der Verzweigung

Wenn der zu pushende Zweig nicht angegeben wird, findet Git ihn anhand Ihrer Konfigurationseinstellungen heraus. In Git-Versionen nach 2.0 hat ein neues Repo die Standardeinstellung, den aktuell ausgecheckten Zweig zu pushen:

git push <remote> --force

während vor 2.0 neue Repos standardmäßig so eingestellt sind, dass mehrere lokale Zweige gepusht werden. Die fraglichen Einstellungen sind die remote.<remote>.push y push.default Einstellungen (siehe unten).

Weglassen der Fernbedienung und der Verzweigung

Wenn sowohl die entfernte als auch die Verzweigung weggelassen werden, wird das Verhalten von nur git push --force wird bestimmt durch Ihre push.default Git-Konfigurationseinstellungen:

git push --force
  • Ab Git 2.0 ist dies die Standardeinstellung, simple pusht im Grunde nur Ihren aktuellen Zweig zu seinem entfernten Gegenstück im Upstream. Die Gegenstelle wird durch den Zweig der branch.<remote>.remote Einstellung und wird andernfalls auf das ursprüngliche Projektarchiv zurückgesetzt.

  • Vor Git Version 2.0 war dies die Standardeinstellung, matching schiebt im Grunde nur alle Ihre lokalen Zweige zu Zweigen mit dem gleichen Namen auf dem entfernten Rechner (der standardmäßig auf origin eingestellt ist).

Sie können mehr lesen push.default Einstellungen durch Lesen git help config o eine Online-Version der git-config(1) Manual Page .

Sicherer schieben mit --force-with-lease

Force-Push mit einem "lease" erlaubt es, dass der Force-Push fehlschlägt, wenn es neue Commits auf dem Remote gibt, die Sie nicht erwartet haben (technisch gesehen, wenn Sie sie noch nicht in Ihren Remote-Tracking-Zweig geholt haben), was nützlich ist, wenn Sie nicht versehentlich die Commits von jemand anderem überschreiben wollen, von denen Sie noch nicht einmal wussten, und Sie nur Ihre eigenen überschreiben wollen:

git push <remote> <branch> --force-with-lease

Weitere Einzelheiten über die Verwendung von --force-with-lease indem Sie einen der folgenden Texte lesen:

37voto

VonC Punkte 1117238

Eine andere Möglichkeit (um einen erzwungenen Push zu vermeiden, der für andere Beitragszahler problematisch sein kann) besteht darin:

  • Ihre neuen Übertragungen in einen eigenen Zweig stellen
  • zurücksetzen master sur origin/master
  • führen Sie Ihren eigenen Zweig zusammen mit master immer Commits aus dem dedizierten Zweig behalten (d.h. neue Revisionen über master die Ihren eigenen Zweig spiegelt).
    Siehe " git-Befehl, um einen Zweig wie einen anderen zu machen " für Strategien zur Simulation einer git merge --strategy=theirs .

Auf diese Weise können Sie den Master an die Fernbedienung übertragen, ohne etwas erzwingen zu müssen.

23voto

Jithish P N Punkte 1740

Funktioniert bei mir:

git push --set-upstream <remote> <branch> -f

14voto

Lando Ke Punkte 129

git push -f ist ein wenig destruktiv, weil es alle Fernänderungen zurücksetzt, die von anderen Teammitgliedern vorgenommen wurden. Eine sicherere Option ist

git push --force-with-lease

Quoi --force-with-lease weigert sich, einen Zweig zu aktualisieren, wenn er nicht den erwarteten Zustand hat, d.h. wenn niemand den Zweig upstream aktualisiert hat. In der Praxis funktioniert dies, indem wir überprüfen, ob die vorgelagerte Referenz das ist, was wir erwarten, da Referenzen Hashes sind und implizit die Kette der Eltern in ihrem Wert kodieren.

Sie können sagen --force-with-lease nach was genau geprüft werden soll, aber standardmäßig wird die aktuelle Fernreferenz geprüft. In der Praxis bedeutet das, dass wenn Alice ihren Zweig aktualisiert und ihn in das entfernte Repository hochschiebt, wird die Referenz, die auf den Kopf des Zweiges zeigt, aktualisiert. Wenn Bob nun keinen Pull aus dem entfernten Repository durchführt, ist sein lokaler Verweis auf das entfernte Repository nicht mehr aktuell. Wenn er einen Push mit --force-with-lease prüft git die lokale Referenz mit der neuen entfernten und verweigert den Push. --force-with-lease erlaubt Ihnen nur dann ein Force-Push, wenn niemand anderes in der Zwischenzeit Änderungen an der Fernbedienung vorgenommen hat. Es ist --force mit angelegtem Sicherheitsgurt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X