wake-up-neo.com

Erzwinge "git Push", um entfernte Dateien zu überschreiben

Ich möchte meine lokalen Dateien pushen und sie auf einem Remote-Repository haben, ohne mit Zusammenführungskonflikten umgehen zu müssen. Ich möchte nur, dass meine lokale Version Vorrang vor der Remote-Version hat.

Wie kann ich das mit Git machen?

666
opensas

Sie sollten in der Lage sein, Ihre lokale Revision mit dem Remote-Repo zu erzwingen

git Push -f <remote> <branch>

(z. B. git Push -f Origin master). Wenn Sie <remote> und <branch> deaktivieren, werden alle lokalen Zweige, für die --set-upstream festgelegt wurde, gepusht.

Seien Sie gewarnt, wenn andere Personen dieses Repository freigeben, kollidiert ihr Revisionsverlauf mit dem neuen. Und wenn sie nach dem Zeitpunkt der Änderung lokale Verpflichtungen haben, werden sie ungültig.

Update : Dachte, ich würde eine Randnotiz hinzufügen. Wenn Sie Änderungen erstellen, die von anderen überprüft werden, ist es nicht ungewöhnlich, einen Zweig mit diesen Änderungen zu erstellen und regelmäßig zu aktualisieren, um sie mit dem Hauptentwicklungszweig auf dem neuesten Stand zu halten. Lassen Sie einfach andere Entwickler wissen, dass dies in regelmäßigen Abständen geschieht, damit sie wissen, was sie zu erwarten haben.

Update 2 : Aufgrund der zunehmenden Anzahl von Zuschauern möchte ich einige zusätzliche Informationen darüber hinzufügen, was zu tun ist, wenn Ihr upstream auftritt eine Kraft Push.

Angenommen, ich habe Ihr Repo geklont und ein paar Commits wie folgt hinzugefügt:

 D ---- E topic 
 /[.____.‹A----B----C development 

Aber später wird der Zweig development mit einem rebase getroffen, was dazu führt, dass ich eine Fehlermeldung erhalte, wenn ich git pull ausführe:

 Objekte entpacken: 100% (3/3), erledigt. 
 Von <Repo-Speicherort> 
 * Zweigentwicklung -> FETCH_HEAD 
 Automatisch zusammenführen <Dateien > 
 CONFLICT (Inhalt): Zusammenführungskonflikt in <Speicherorten> 
 Automatische Zusammenführung fehlgeschlagen; Beheben von Konflikten und Festschreiben des Ergebnisses. 

Hier könnte ich die Konflikte und commit beheben, aber das würde mich mit einer wirklich hässlichen Commit-Geschichte zurücklassen:

 C ---- D ---- E ---- F-Thema 
//[.____.‹A----B---------- ---- C 'Entwicklung 

Es mag verlockend aussehen, git pull --force zu verwenden, aber seien Sie vorsichtig, da Sie dadurch gestrandete Commits erhalten:

 D ---- E Thema 
 
 A ---- B ---- C 'Entwicklung 

Die wahrscheinlich beste Option ist es, einen git pull --rebase zu machen. Dies erfordert, dass ich Konflikte wie zuvor löse, aber für jeden Schritt verwende ich statt des Festschreibens git rebase --continue. Am Ende wird die Commit-Historie viel besser aussehen:

 D '--- E' Topic 
 /[.____.‹A----B----C 'Development 

Update 3: Sie können die Option --force-with-lease auch als "sichereren" Push verwenden, wie von Cupcake in seiner Antwort :

Das erzwungene Pushen mit einem "Lease" führt dazu, dass das erzwungene Pushen fehlschlägt, wenn auf der Fernbedienung neue Commits vorhanden sind, die Sie nicht erwartet haben (technisch gesehen, wenn Sie sie noch nicht in Ihren Remote-Tracking-Zweig abgerufen haben). Dies ist hilfreich, wenn Sie möchten nicht versehentlich die Commits eines anderen Benutzers überschreiben, von denen Sie noch nicht einmal wussten, und Sie möchten nur Ihre eigenen überschreiben:

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

Weitere Informationen zur Verwendung von --force-with-lease finden Sie in den folgenden Abschnitten:

952
Trevor Norris

Sie möchten Push erzwingen

Was Sie grundsätzlich tun möchten, ist das Erzwingen des Push Ihrer lokalen Niederlassung, um die entfernte Niederlassung zu überschreiben.

Wenn Sie eine detailliertere Erläuterung der folgenden Befehle wünschen, lesen Sie den Abschnitt "Meine Details" weiter unten. Grundsätzlich haben Sie 4 verschiedene Möglichkeiten, um mit Git zu pushen:

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 detailliertere Erläuterung der einzelnen Befehle wünschen, lesen Sie den Abschnitt mit den langen Antworten weiter unten.

Warnung: Durch erzwungenes Drücken wird der Remote-Zweig mit dem Status des Zweigs überschrieben, den Sie drücken. Stellen Sie sicher, dass Sie dies wirklich tun möchten, bevor Sie es verwenden. Andernfalls können Sie Commits überschreiben, die Sie tatsächlich behalten möchten.

Details erzwingen

Remote und Zweig angeben

Sie können bestimmte Zweige und ein Remote vollständig angeben. Das -f Flag ist die Kurzversion von --force

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

Zweigstelle weglassen

Wenn die Verzweigung zu Push-Verzweigung weggelassen wird, berechnet Git sie anhand Ihrer Konfigurationseinstellungen. In Git-Versionen nach 2.0 hat ein neues Repo Standardeinstellungen, um den aktuell ausgecheckten Zweig zu pushen:

git Push <remote> --force

während vor 2.0 neue Repos über Standardeinstellungen verfügen, um mehrere lokale Zweige zu pushen. Bei den fraglichen Einstellungen handelt es sich um die Einstellungen remote.<remote>.Push und Push.default (siehe unten).

Die Fernbedienung und den Zweig weglassen

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

git Push --force
  • Ab Git 2.0 wird die Standardeinstellung simple im Grunde genommen nur Ihren aktuellen Zweig zu seinem vorgelagerten Remote-Gegenstück verschieben. Die Fernbedienung wird durch die branch.<remote>.remote -Einstellung des Zweigs bestimmt, andernfalls wird standardmäßig das Origin-Repo verwendet.

  • Vor Git Version 2.0 werden mit der Standardeinstellung matching alle Ihre lokalen Zweige einfach an Zweige mit demselben Namen auf der Fernbedienung übertragen (standardmäßig Origin).

Sie können weitere Einstellungen für Push.default lesen, indem Sie git help config oder eine Online-Version der Handbuchseite von git-config (1) lesen.

Erzwinge sichereres Drücken mit --force-with-lease

Das erzwungene Pushen mit einem "Lease" führt dazu, dass das erzwungene Pushen fehlschlägt, wenn auf der Fernbedienung neue Commits vorhanden sind, die Sie nicht erwartet haben (technisch gesehen, wenn Sie sie noch nicht in Ihren Remote-Tracking-Zweig abgerufen haben). Dies ist hilfreich, wenn Sie möchten nicht versehentlich die Commits eines anderen Benutzers überschreiben, von denen Sie noch nicht einmal wussten, und Sie möchten nur Ihre eigenen überschreiben:

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

Weitere Informationen zur Verwendung von --force-with-lease finden Sie in den folgenden Abschnitten:

118
user456814

Eine andere Möglichkeit (um erzwungene Pushs zu vermeiden, die für andere Mitwirkende problematisch sein können) ist:

  • legen Sie Ihre neuen Commits in einer eigenen Filiale ab
  • setze dein master auf Origin/master zurück
  • führen Sie Ihren dedizierten Zweig zu master zusammen, und behalten Sie dabei stets die Commits des dedizierten Zweigs bei (dh, Sie erstellen neue Revisionen über master, die Ihren dedizierten Zweig widerspiegeln).
    Unter " Befehl git, um einen Zweig wie einen anderen zu machen " finden Sie Strategien zur Simulation eines git merge --strategy=theirs.

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

29
VonC

git Push -f ist ein bisschen destruktiv, weil es alle Remote-Änderungen zurücksetzt, die von jemand anderem im Team vorgenommen wurden. Eine sicherere Option ist {git Push --force-with-lease}.

{--Force-with-lease} weigert sich, einen Zweig zu aktualisieren, es sei denn, dies ist der erwartete Zustand. niemand hat den Zweig stromaufwärts aktualisiert. In der Praxis funktioniert dies, indem überprüft wird, ob der vorgelagerte Ref das ist, was wir erwarten, da Refs Hashes sind und die Kette der Eltern implizit in ihren Wert codieren. Sie können {--force-with-lease} genau mitteilen, worauf zu prüfen ist, aber standardmäßig wird die aktuelle Remote-Referenz überprüft. In der Praxis bedeutet dies, dass, wenn Alice ihren Zweig aktualisiert und in das Remote-Repository hochschiebt, der Verweiskopf des Zweigs aktualisiert wird. Wenn Bob nicht von der Fernbedienung abzieht, ist sein lokaler Verweis auf die Fernbedienung nicht mehr aktuell. Wenn er mit {--force-with-lease} zu Push geht, prüft git die lokale Referenz mit der neuen Fernbedienung und lehnt es ab, den Push zu erzwingen. {--force-with-lease} ermöglicht es Ihnen effektiv nur, Push zu erzwingen, wenn in der Zwischenzeit kein anderer Benutzer Änderungen an die Fernbedienung übertragen hat. Es ist {--force} mit dem Sicherheitsgurt an.

3
Lando Ke

funktioniert bei mir git Push --set-upstream Origin master -f

0
Jithish P N