wake-up-neo.com

Wie erzwinge ich einen Git-Push richtig?

Ich habe ein Remote-Repo eingerichtet und es auf meinen Computer geklont. Ich habe einige lokale Änderungen vorgenommen, mein lokales Repository aktualisiert und die Änderungen auf mein Remote-Repository übertragen. Bis zu diesem Punkt war alles in Ordnung.

Jetzt musste ich etwas am Remote-Repo ändern. Dann habe ich etwas in meinem lokalen Repo geändert. Mir wurde klar, dass der Wechsel zum Remote-Repo nicht nötig war. Also habe ich versucht, git Push von meinem lokalen Repo auf mein fernes Repo zu kopieren, aber ich habe eine Fehlermeldung wie:

Um zu verhindern, dass Sie den Verlauf verlieren, wurden Aktualisierungen ohne Schnellvorlauf abgelehnt. Führen Sie die Remote-Änderungen zusammen, bevor Sie sie erneut übertragen. Weitere Informationen finden Sie im Abschnitt 'Hinweis zum Schnellvorlauf' von git Push --help.

Ich dachte, dass wahrscheinlich ein

git Push --force

würde meine lokale Kopie dazu zwingen, Änderungen auf die entfernte zu übertragen und sie gleich zu machen. Das Update wird erzwungen , aber wenn ich zum Remote - Repo zurückkehre und ein Commit durchführe, stelle ich fest, dass die Dateien veraltete Änderungen enthalten (solche, die das Hauptfernbedienung hatte zuvor).

Wie ich in den Kommentaren zu einer der Antworten erwähnt habe :

[Ich] habe versucht zu erzwingen, aber wenn ich zum Master-Server zurückkehre, um die Änderungen zu speichern, erhalte ich veraltete Staging-Einstellungen. Wenn ich also ein Commit durchführe, sind die Repositorys nicht dieselben. Und wenn ich versuche, Git Push erneut zu verwenden, erhalte ich den gleichen Fehler.

Wie kann ich dieses Problem beheben?

1172
Spyros

Mach einfach:

git Push Origin <your_branch_name> --force

oder wenn Sie ein bestimmtes Repo haben:

git Push https://git.... --force

Dadurch werden Ihre vorherigen Festschreibungen gelöscht und Ihre aktuellen weitergeleitet.

Es mag nicht richtig sein, aber wenn jemand auf diese Seite stößt, denkt er, er möchte vielleicht eine einfache Lösung ...

Kurze Fahne

Beachten Sie auch, dass -f für --force steht

git Push Origin <your_branch_name> -f

wird auch funktionieren.

2137
Katie

Und wenn _Push --force_ nicht funktioniert, können Sie Push --delete tun. Schau dir 2 annd Zeile in dieser Instanz:

_git reset --hard HEAD~3  # reset current branch to 3 commits ago
git Push Origin master --delete  # do a very very bad bad thing
git Push Origin master  # regular Push
_

Aber Vorsicht...

Gehen Sie niemals auf eine öffentliche Git-Geschichte zurück!

Mit anderen Worten:

  • Nicht immer force auf ein öffentliches Repository pushen.
  • Tun Sie dies oder nichts, was jemandes pull kaputt machen könnte.
  • Niemals reset oder rewrite in einem repo Verlauf, den möglicherweise bereits jemand gezogen hat.

Natürlich gibt es auch bei dieser Regel außergewöhnlich seltene Ausnahmen, aber in den meisten Fällen ist dies nicht erforderlich, und es entstehen Probleme für alle anderen.

Machen Sie stattdessen eine Rückgängigmachung.

Und sei immer vorsichtig mit dem, was du in ein öffentliches Repo schiebst . Zurücksetzen:

_git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git Push Origin master  # regular Push
_

Tatsächlich werden sowohl Ursprungs-KÖPFE (von zurückgesetzt als auch von evil reset ) enthält dieselben Dateien.


bearbeiten, um aktualisierte Informationen und weitere Argumente um _Push --force_ hinzuzufügen.

Ziehen Sie es in Betracht, die Kraft mit Leasing anstelle von Push zu drücken, ziehen Sie jedoch die Wiederherstellung vor

Ein weiteres Problem, das _Push --force_ mit sich bringen kann, ist, wenn jemand etwas vor Ihnen drückt, aber nachdem Sie es bereits abgerufen haben. Wenn Sie Ihre rebasierte Version erzwingen, werden Sie die Arbeit anderer ersetzen .

_git Push --force-with-lease_, eingeführt in git 1.8.5 ( dank @VonC Kommentar zu der Frage) versucht, dieses spezielle Problem anzugehen. Grundsätzlich führt dies zu einem Fehler und nicht zu Push, wenn die Fernbedienung seit dem letzten Abruf geändert wurde.

Dies ist gut, wenn Sie wirklich sicher sind, dass ein _Push --force_ benötigt wird, aber dennoch weitere Probleme vermeiden möchten. Ich würde so weit gehen, zu sagen, dass dies das Standardverhalten von _Push --force_ sein sollte. Aber es ist noch lange keine Ausrede, um ein Push zu erzwingen. Leute, die vor Ihrem abgerufen haben, werden immer noch viele Probleme haben, die leicht vermieden werden könnten, wenn Sie ) hätten + zurückgesetzt stattdessen.

Und da es sich um _git --Push_ Instanzen handelt ...

Warum sollte jemand zwingen wollen, zu schieben?

@linquize brachte ein gutes Push Force Beispiel zu den Kommentaren: sensible Daten . Sie haben fälschlicherweise Daten verloren, die nicht gepusht werden sollten. Wenn Sie schnell genug sind, können Sie "fix" _*_ durch Erzwingen eines Push-on-Top.

_*_ Die Daten werden weiterhin auf der Fernbedienung gespeichert , es sei denn, Sie führen auch eine Müllabfuhr oder bereinigen Sie sie irgendwie durch. Es besteht auch das offensichtliche Potenzial, dass es von anderen verbreitet wird, die es bereits abgerufen haben, aber Sie haben die Idee.

233
cregox

Zunächst einmal würde ich keine Änderungen direkt im "Haupt" -Repo vornehmen. Wenn Sie wirklich ein "Haupt" -Repo haben möchten, sollten Sie es nur pushen, niemals direkt ändern.

Haben Sie in Bezug auf den Fehler, den Sie erhalten, versucht, git pull von Ihrem lokalen Repo und dann git Push zum Haupt-Repo zu senden? Was Sie gerade tun (wenn ich es richtig verstanden habe), ist, den Push zu erzwingen und dann Ihre Änderungen im "Haupt" -Repo zu verlieren. Sie sollten die Änderungen zuerst lokal zusammenführen.

18
ubik

Wenn ich mich in meinem lokalen Zweig A befinde und Push für lokalen Zweig B in den Ursprungszweig C erzwingen möchte, kann ich die folgende Syntax verwenden:

git Push --force Origin B:C
15
IcedDante

Ich würde wirklich empfehlen:

  • Nur zum Hauptrepo schieben

  • stellen Sie sicher, dass das Haupt-Repo ein nacktes Repo ist, um niemals ein Problem damit zu haben, dass der Haupt-Repo-Arbeitsbaum nicht mit seiner .git -Basis synchronisiert ist. Siehe " Wie schiebe ich ein lokales Git-Repository auf einen anderen Computer? "

  • Wenn Sie Änderungen am Haupt-Repository vornehmen müssen, klonen Sie es (auf dem Hauptserver), nehmen Sie die Änderungen vor und drücken Sie es zurück

Mit anderen Worten, halten Sie ein nacktes Repo sowohl vom Hauptserver als auch vom lokalen Computer aus zugänglich, um ein einziges Upstream-Repo zu haben, von dem/zu dem/zu dem gezogen werden soll.

11
VonC

benutze diesen folgenden Befehl:

git Push -f Origin master
8
mustafa Elsayed

Dies war unsere Lösung zum Ersetzen des Masters in einem gitHub-Unternehmensrepository unter Beibehaltung des Verlaufs.

Push -f für die Verwaltung von Unternehmens-Repositorys ist häufig deaktiviert, um den Zweigstellenverlauf zu verwalten. Diese Lösung hat bei uns funktioniert.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get Origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

Schieben Sie Ihre Filiale auf desiredOrigin und erstellen Sie eine PR

5
mihai

Ich hatte die gleiche Frage, fand sie aber endlich heraus. Was Sie höchstwahrscheinlich tun müssen, ist, die folgenden zwei git-Befehle auszuführen (Hash durch die Revisionsnummer für das git-Commit zu ersetzen):

git checkout <hash>
git Push -f HEAD:master
1
Brian