Laut Git befindet sich der lokale Zweig hinter dem Remote-Zweig, aber nicht

82

Szenario:

  1. Ich mache einen neuen Zweig
  2. Hack drauf
  3. begehen Sie es
  4. Drück es
  5. hacke es noch ein bisschen weiter
  6. erneut festschreiben
  7. versuchen Sie es erneut

Git antwortet:

Aktualisierungen wurden abgelehnt, da sich die Spitze Ihres aktuellen Zweigs hinter dem Remote-Gegenstück befindet. etc.

Ich bin der einzige, der diesen Zweig hackt - niemand anderes berührt ihn. Der Remote-Zweig befindet sich tatsächlich hinter dem lokalen Zweig. Ich sollte überhaupt nicht ziehen müssen.

(Und wenn ich ziehe, meldet Git Konflikte zwischen den beiden und zwingt mich, den Zweig in sich zusammenzuführen.)

Warum passiert das (wahrscheinlich)? Und wie kann ich es diagnostizieren / beheben?

Um es klar auszudrücken, ich verzweige nirgendwo und niemand anderes arbeitet daran:

Remote: Commit A -------- Commit B  

Local:  Commit A -------- Commit B -------- Commit C  

C ist eine gerade Fortsetzung von B, ohne Verzweigung. Aber Git denkt, C ist ein Zweig von A:

Remote: Commit A -------- Commit B  

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  

Es ist nicht; es ist eine gerade Fortsetzung von B.

Tim Janke
quelle
1
Die Ausgabe von git remote -vund git show remote origin(vorausgesetzt, der Ursprung ist die Fernbedienung, mit der Sie Probleme haben) kann hilfreich sein
Ben Graham

Antworten:

196

Sie haben wahrscheinlich die Geschichte neu geschrieben? Ihre lokale Niederlassung weicht von der auf dem Server ab. Führen Sie diesen Befehl aus, um besser zu verstehen, was passiert ist:

gitk HEAD @{u}

Ich würde Ihnen dringend empfehlen, zu verstehen, woher dieser Fehler kommt. Um das Problem zu beheben, führen Sie einfach Folgendes aus:

git push -f

Das -fmacht es zu einem „Zwang Push“ und überschreibt den Zweig auf dem Server. Das ist sehr gefährlich, wenn Sie im Team arbeiten. Aber da Sie alleine sind und sicher sind, dass Ihr lokaler Staat korrekt ist, sollte dies in Ordnung sein. Sie riskieren, den Commit-Verlauf zu verlieren, wenn dies nicht der Fall ist.

Chronial
quelle
13
Das war's. In Schritt 2 habe ich ein "Amend Last Commit" durchgeführt, dann gepusht, dann noch etwas gehackt und dann erneut versucht zu pushen. Ich habe die Arbeitsweise von Amend falsch verstanden. Vielen Dank!
Tim Janke
4
Dies scheint wirklich nützlich zu sein - aber könnte jemand die Syntax 'HEAD @ {u}' erklären?
ChrisV
5
Sowohl das HEADals auch das @{u}beziehen sich auf Commits. Sie teilen gitk mit, welche Zweige angezeigt werden sollen. HEADbezieht sich auf den aktuell ausgecheckten Zweig, @{u}ist die Abkürzung für HEAD@{u}, die den Upstream-Zweig des aktuell ausgecheckten Zweigs darstellt. Also zum Beispiel. master, das ist normalerweise origin/master.
Chronial
Hatte das gleiche Szenario - musste einen erneuten Scan durchführen und Konflikte zusammenführen. Verwenden hat sehr gitkgeholfen!
Brichins
Passiert mir, wenn ich viele einfache Commits vor Ort mache (nicht wieder gut mache) und versuche zu pushen. Ich weiß, dass niemand anderes Dinge auf Github ändert. Gitk zeigte wirklich, dass die Fernbedienung anders war als die lokale, obwohl erwartet wird, dass die lokale als neuere Version als die Fernbedienung und nicht die Fernbedienung als Gabel angezeigt werden sollte (sah so aus, ich weiß nicht viel zu erzählen)
Wassermann Power
5

Die Lösung ist sehr einfach und hat bei mir funktioniert.

Versuche dies :

git pull --rebase <url>

dann

git push -u origin master
theRana
quelle
4

Dies passierte mir, als ich versuchte, den Entwicklungszweig zu verschieben (ich verwende Git Flow). Jemand hatte Push-Updates zu meistern. um es zu beheben, habe ich:

git co master
git pull

Welches diese Änderungen holte. Dann,

git co develop
git pull

Welches hat nichts getan. Ich denke, der Entwicklungszweig hat trotz der Fehlermeldung bereits gepusht. Alles ist jetzt auf dem neuesten Stand und keine Fehler.

Daniel
quelle
0

Folgen Sie dieser Antwort , um die Diagnose zu stellen .

Aber um das Problem zu beheben, wissen Sie, dass Sie der einzige sind, der es ändert:
1 - Sichern Sie Ihr Projekt (ich habe nur die Dateien in git, ./src Ordner erstellt)
2 - git pull
3 - Stellen Sie Ihre Sicherung über die vielen "durcheinandergebrachten" Dateien wieder her ( mit Zusammenführungsindikatoren)

Ich habe es versucht, git pull -s recursive -X oursaber es hat nicht so funktioniert, wie ich es wollte. Es könnte eine Option sein, aber zuerst sichern !!!

Stellen Sie sicher, dass die Unterschiede / Änderungen (bei git gui) keine sind. Dies ist mein Fall, es gibt überhaupt nichts zu verschmelzen, aber Github sagt immer wieder, ich sollte zusammenführen ...

Wassermann-Kraft
quelle