2012-09-29 6 views
72

Szenario:Git sagt lokale Niederlassung hinter entfernten Zweig ist, aber es ist nicht

  1. ich eine Niederlassung
  2. Hack machen darauf
  3. begehen es
  4. Push es
  5. hack on it etwas mehr
  6. commit wieder
  7. versuchen Sie es erneut

Git reagiert zu drücken:

Updates abgelehnt wurden, weil die Spitze der aktuellen Zweig ist hinter seine Remote-Pendant. etc.

Ich bin der einzige Hacker auf diesem Zweig - niemand berührt es. Der Remote-Zweig ist eigentlich hinter der lokalen Niederlassung. Ich sollte überhaupt nicht ziehen müssen.

(Und wenn ich ziehen, Git berichtet Konflikte zwischen den beiden, und zwingt mich, den Zweig in sich selbst zu verschmelzen)

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

klar zu sein, ich bin Verzweigung nicht überall, und sonst niemand arbeitet daran:

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

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

C ist eine gerade Fortsetzung von B, beteiligt keine 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 geradlinige Fortsetzung von B.

+1

Die Ausgabe von 'git remote -V' und' git show remote origin' (vorausgesetzt Ursprung ist die Fernbedienung, die Sie Probleme haben mit) kann hilfreich sein –

Antwort

182

Sie haben wahrscheinlich einige Geschichte neu geschrieben? Ihr lokaler Zweig weicht von dem auf dem Server ab. Führen Sie diesen Befehl ein besseres Verständnis von dem, was passiert ist:

gitk HEAD @{u} 

ich Ihnen dringend empfehlen würde versuchen, zu verstehen, wo dieser Fehler herkommt. Um es zu beheben, führen Sie einfach:

git push -f 

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

+12

Das war es. In Schritt 2 habe ich einen "Amend Last Commit" gemacht, dann gedrängt, dann noch ein paar gehackt und dann nochmal versucht zu drücken. Ich habe die Arbeitsweise von Amend falsch verstanden. Vielen Dank! –

+3

Das scheint wirklich nützlich - aber könnte jemand die 'HEAD @ {u}' Syntax erklären? – ChrisV

+3

Sowohl der 'HEAD' als auch der' @ {u} 'beziehen sich auf Commits. Sie sagen gitk, welche Zweige angezeigt werden sollen. 'HEAD' bezieht sich auf den aktuell ausgecheckten Zweig,' @ {u} 'ist die Abkürzung für' HEAD @ {u} '', die den Upstream-Zweig des aktuell ausgecheckten Zweiges darstellt. Also für zB. "Meister", das ist normalerweise "Ursprung/Meister". – Chronial

4

Das ist mir passiert, als ich versuchte, den Zweig zu entwickeln (ich benutze git flow). Jemand hatte Push-Updates zu meistern.Um es zu beheben, tat ich:

git co master 
git pull 

Welche diese Änderungen abgerufen. Dann

git co develop 
git pull 

Was hat nichts getan. Ich denke der Entwicklerzweig hat trotz der Fehlermeldung schon gepusht. Alles ist jetzt auf dem neuesten Stand und keine Fehler.

0

Um dies zu diagnostizieren, folgen Sie this answer.

Aber um es zu beheben, zu wissen, Sie sind der einzige Veränderung es, tun:
1 - Sicherung Ihres Projekts (ich nur die Dateien auf git tat, ./src Ordner)
2-git pull
3 - Wiederherstellen Sie Backup über die vielen "vermessenen" Dateien (mit Merge-Indikatoren)

Ich versuchte git pull -s recursive -X ours aber nicht funktioniert, wie ich wollte, könnte es eine Option tho sein, aber Backup zuerst !!!

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

0

Die Lösung ist sehr einfach und funktionierte für mich.

Versuchen Sie folgendes:

git pull --rebase <url> 

dann

git push -u origin master