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?
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:
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.
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
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).
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.
--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:
Eine andere Möglichkeit (um erzwungene Pushs zu vermeiden, die für andere Mitwirkende problematisch sein können) ist:
master
auf Origin/master
zurückmaster
zusammen, und behalten Sie dabei stets die Commits des dedizierten Zweigs bei (dh, Sie erstellen neue Revisionen über master
, die Ihren dedizierten Zweig widerspiegeln).git merge --strategy=theirs
.Auf diese Weise können Sie den Master auf die Fernbedienung verschieben, ohne etwas erzwingen zu müssen.
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.
funktioniert bei mir git Push --set-upstream Origin master -f