git: Dein Zweig ist durch X Commits voraus

379

Wie kommt das eigentlich zustande?

Ich arbeite momentan alleine in einem Repo, also ist dies mein Workflow:

  1. Dateien ändern
  2. Verpflichten
  3. Wiederholen Sie 1-2 bis zufrieden
  4. Zum Master drücken

Wenn ich dann eine mache git status, wird mir mitgeteilt, dass mein Zweig um X Commits voraus ist (vermutlich die gleiche Anzahl von Commits, die ich gemacht habe). Liegt es daran, dass beim Pushen des Codes Ihre lokal zwischengespeicherten Dateien (in den .git-Ordnern) nicht aktualisiert werden? git pullscheint diese seltsame Nachricht zu "reparieren", aber ich bin immer noch neugierig, warum es passiert, vielleicht verwende ich Git falsch?


einschließlich des Zweigs, der in der Nachricht gedruckt wird

Meine lokale Niederlassung ist dem Meister voraus

Wo drückst / ziehst du den aktuellen Zweig?

Ich drücke auf GitHub und ziehe auf den Computer, an dem ich gerade arbeite. Meine lokale Kopie ist immer auf dem neuesten Stand, da ich der einzige bin, der daran arbeitet.

Das Remote-Repo wird nicht überprüft

Das dachte ich mir, ich dachte mir, ich würde sicherstellen, dass ich es richtig verstehe.

Übergeben Sie einige zusätzliche Argumente?

Keine, die ich sehen kann, vielleicht läuft an meinem Ende eine lustige Konfiguration?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
SeanJA
quelle
Wie machst du das pushund was sind deine Remote- und Branch-Konfigurationseinstellungen?
CB Bailey
2
Das Remote-Repo wird nicht überprüft. Sie müssen nach dem Push einen Git-Abruf durchführen, um die neuesten Informationen zum Remote-Repo abzurufen. Dadurch wird der lokale "Remote" -Zweig aktualisiert, anhand dessen das Tracking durchgeführt wird.
Sekhat
2
@Sekhat: git statusÜberprüft zwar nicht das Remote-Repository, git pulltut es aber. Wenn Sie einen Tracking-Zweig für ein Repository haben, an das Sie einen Push senden, git pushwird Ihr lokaler Tracking-Zweig aktualisiert, um den neuen Status des Remote-Zweigs widerzuspiegeln, wenn Ihr Push erfolgreich ist. Aus diesem Grund habe ich nach der Konfiguration des Fragestellers gefragt, da bei einem nicht korrekten Vorgang wahrscheinlich ein Konfigurationsfehler vorliegt.
CB Bailey
git status? Ja wirklich? Meiner git statussagt mir nie, wie weit mein Zweig voraus ist. Geben Sie ihm einige zusätzliche Argumente?
Hasen
4
@hasen j: Geht git statusnicht zum Remote-Repository, um zu überprüfen, ob der Remote-Zweig aktualisiert wurde. Hier erfahren Sie, wie weit Ihre lokale Niederlassung im Vergleich zu Ihrer lokal gespeicherten Remote-Tracking-Niederlassung voraus ist . Das Problem ist, dass ein Normaler git push(sowie Abrufen und Ziehen) den Remote-Tracking-Zweig aktualisieren sollte und für den Fragesteller dies anscheinend nicht funktioniert. Um zu sehen, warum wir sowohl die genaue Form der git pushverwendeten als auch die Konfiguration des lokalen Repositorys sehen müssen, kann ich dies derzeit nicht sehen, da der Fragesteller bereits eine Antwort akzeptiert hat.
CB Bailey

Antworten:

508

Wenn Sie diese Meldung nach a erhalten git pull remote branch, versuchen Sie, sie mit a zu verfolgen git fetch. (Optional können Sie git fetch -pgelöschte Zweige aus dem Repo entfernen.)

Fetch scheint die lokale Darstellung des Remote-Zweigs zu aktualisieren, was nicht unbedingt der Fall ist, wenn Sie a ausführen git pull remote branch.

Reich
quelle
1
Bravo. Das war wirklich das Problem. Ich habe zunächst ein Repository für Google-Code erstellt. Dann habe ich dieses Repository auf meinen Laptop geklont und arbeite dort und drücke die Änderungen, Laptop => code.google. Ich habe diese Nachricht auf meinem Server erhalten, auf dem ich einen Klon des Code-Repositorys code.google erstellt und die Änderungen abgerufen habe. Ich denke, Fetch ist erforderlich, um die lokale Datenbank zu aktualisieren.
rjha94
2
Wir hatten hier das gleiche Problem, weil ein anderer Zweig (A) auf das gleiche Commitid des Masters zeigte. Das Ziehen von A und dann das Ziehen des Masters führte zu derselben Situation. Wenn git A gezogen hat, wurde die Commit-ID auf die letzte aktualisiert, sodass beim Ziehen des Masters nichts zu ziehen ist. Git hat die letzte Commit-ID des Masters nicht aktualisiert und warnte davor, "vor dem Master" zu sein.
Uberto
8
Danke, obwohl ich eine seltsame Sache bemerkt habe. "git fetch origin master" hilft nicht, "git fetch origin" jedoch. Ich bin in der Hauptniederlassung, daher bin ich mir nicht sicher, wie "git fetch origin" im Kontext etwas anderes bewirken würde.
Parag
2
@Parag Unter stackoverflow.com/questions/26350876/… finden Sie eine Erläuterung der Unterschiede zwischen diesen beiden Befehlen und Informationen zum Ändern der Konfigurationsdatei, um das Verhalten zu ändern git_status meldet nicht 'voraus von'.
Anatortoise House
2
@Parag, auch stackoverflow.com/questions/7365415/… Antwort beschreibt die Details von ORIG_HEAD und FETCH_HEAD, die nicht synchron sind und die Statuswarnung und mögliche Korrekturen der Konfigurationsdatei verursachen.
Anatortoise House
138

Verwenden

git pull --rebase

Die Option --rebase bedeutet, dass git Ihr lokales Commit beiseite schiebt, mit der Fernbedienung synchronisiert und dann versucht, Ihre Commits aus dem neuen Status anzuwenden.

Marian Zburlea
quelle
3
Ein wirklich guter Weg, um nutzlose Verschmelzungen zu verhindern und einen saubereren Baum im Ursprung zu haben!
Hatef
1
Ich habe diesen Befehl ausprobiert, aber ich habe immer noch das gleiche Problem ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh
4
Diese Antwort ist falsch: Wenn Sie sie verwenden, ohne die Situation zu verstehen, verursachen Sie möglicherweise Probleme für die kommenden Zeiten (neu geschriebener Verlauf!). Wenn Sie die Situation verstehen, ist dies nicht die Lösung dafür. Denken Sie bitte nach, bevor Sie tippen git, und schreiben Sie den Verlauf niemals sinnlos neu!
cmaster
80

Verwenden Sie diese 3 einfachen Befehle

Schritt 1 :git checkout <branch_name>

Schritt 2 :git pull -s recursive -X theirs

Schritt 3 :git reset --hard origin/<branch_name>

Weitere Details: https://stackoverflow.com/a/39698570/2439715

Genießen.

Abhishek Goel
quelle
3
Dies ist die einzige Antwort, die das Problem für mich behoben hat. Die obigen Befehle haben es seltsamerweise von 12 auf 7 Commits niedergeschlagen, und dies hat diese endgültig entfernt
Ieuan
1
Ich stimme zu, dass dies das einzige ist, was für mich funktioniert hat. Ich bin überzeugt, dass GIT manchmal eine multiple Persönlichkeitsstörung hat.
ksed
11
Wie bei @leuan hat nichts als git reset --hard origin/masteres für mich geklärt.
Dave Land
Auch hier sind dies die einzigen Schritte, die für mich funktioniert haben
Shard_MW
51

Ich denke, Sie verstehen die Nachricht falsch - Ihre Niederlassung ist nicht voraus master, das ist sie master . Es ist vor origin/master, die eine ist Remote - Tracking - Zweig , der den Status des Remote - Repository von Ihrem letzten aufzeichnet push, pulloder fetch. Es sagt dir genau, was du getan hast; Sie sind der Fernbedienung vorausgegangen und es erinnert Sie daran, zu drücken.

Josh Lee
quelle
22
Dies ist eigentlich, nachdem ich gedrückt habe. Ich musste ziehen (oder möglicherweise holen?), Um diese Nachricht nicht zu erhalten.
SeanJA
26

Jemand sagte, Sie könnten Ihre Nachricht falsch lesen, das sind Sie nicht. Dieses Problem hat tatsächlich mit Ihrer <project>/.git/configDatei zu tun . Darin wird ein ähnlicher Abschnitt sein:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Wenn Sie die Abrufzeile aus der .git / config-Datei Ihres Projekts entfernen, wird die Meldung "Ihr Zweig liegt durch NCommits vor 'origin / master'" gestoppt . Ärger vom Auftreten.

Zumindest hoffe ich. :) :)

Fake Code Monkey Rashid
quelle
Ich werde das überprüfen, wenn ich das nächste Mal die ahead by x commitsNachricht sehe . Ich habe die Nachricht eine Weile nicht gesehen.
SeanJA
Ich habe die Nachricht eine Weile nicht gesehen. Ich denke, das liegt daran, dass ich angefangen habe, das Git-Repo lokal zu erstellen und es dann auf ein Remote-Repo zu verschieben, anstatt umgekehrt ...
SeanJA
Ich habe dies versucht, aber es hat dazu geführt, dass eGit in Eclipse beim Versuch, einen Commit durchzuführen, mit "internem Fehler" angezeigt wird. Git selbst schien jedoch gut zu funktionieren.
user4815162342
18
Was macht diese Linie? und was verpasse ich, wenn ich es entferne? (abgesehen von dem Ärger)
John Mee
1
Das hat funktioniert, aber es ist eher so, als würde man den Fehler unterdrücken. Fügen Sie die Zeile wieder hinzu und Sie erhalten erneut eine Warnung.
Krishna Pandey
15

Ich hatte dieses Problem auf meinem Bühnenserver, wo ich nur ziehe. Und ein Hard-Reset hat mir geholfen, HEAD auf die gleiche Weise wie Remote zu reinigen.

git reset --hard origin/master

Also jetzt habe ich wieder:

On branch master
Your branch is up-to-date with 'origin/master'.
Anatolii Pazhyn
quelle
Ich habe es zuerst ohne die --hard Flagge versucht und es hat funktioniert!
Kroiz
12

Das hat bei mir funktioniert

git reset --hard origin/master

Die Ausgabe muss so aussehen

On branch dev HEAD is now at ae1xc41z Last commit message

Али Палитаев
quelle
11

In meinem Fall lag es daran, dass ich mit Master auf Master umgestiegen bin

 git checkout -B master

Nur um die neue Version davon statt zu ziehen

 git checkout master

Der erste Befehl setzt den Master-Kopf auf meine letzten Commits zurück

ich benutzte

git reset --hard origin/master

Um das zu beheben

AxCoder
quelle
9

Ich habe jede Lösung auf dieser Seite durchgesehen und zum Glück hat @ anatolii-pazhyn einen Kommentar abgegeben, weil seine Lösung funktioniert hat. Leider habe ich nicht genug Ruf , um ihn zu bewerten, aber ich empfehle, zuerst seine Lösung auszuprobieren:

git reset --hard origin/master

Welches gab mir:

HEAD is now at 900000b Comment from my last git commit here

Ich empfehle auch:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

Sie können auch verwenden:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

Viel Glück

Ryan Erwin
quelle
4

Ich hatte das gleiche Problem auf einem Windows-Computer. Wenn ich einen git pull origin masterBefehl ausführte, erhielt ich die Warnung "Vor 'Ursprung / Master' durch X-Commits". Ich stellte fest, dass ich git pull origindie Warnung nicht mehr erhalten würde , wenn ich stattdessen ausgeführt und den Zweig NICHT angegeben hätte.

Der Code Vater
quelle
Ich glaube, dass dies effektiv git fetchhinter den Kulissen geschieht .
Brian Peterson
"git fetch" hat mein Problem nicht gelöst, das hat es getan. Ich habe eine Liste der neu hinzugefügten Zweige und die Meldung "Sie haben nach einem Abruf vom Remote-Upstream gefragt, aber keinen Zweig angegeben. Da dies nicht der standardmäßig konfigurierte Remote für Ihren aktuellen Zweig ist, müssen Sie im Befehl einen Zweig angeben Linie." und der nächste Befehl "git status" zeigte die Warnung nicht an.
Krishna Pandey
2

Es erinnert Sie nur an die Unterschiede zwischen dem aktuellen Zweig und dem Zweig, der die aktuelle Spur erstellt. Bitte geben Sie weitere Informationen an, einschließlich des Zweigs, der in der Nachricht gedruckt ist, und wo Sie den aktuellen Zweig drücken / ziehen.

wRAR
quelle
2

Obwohl diese Frage etwas alt ist ... Ich war in einer ähnlichen Situation und meine Antwort hier half mir, ein ähnliches Problem zu beheben, das ich hatte

Versuchen Sie es zuerst mit push -foder erzwingen Sie die Option

Wenn dies nicht funktioniert hat, werden möglicherweise (wie in meinem Fall) die Remote-Repositorys (oder vielmehr die Verweise auf Remote-Repositorys, die angezeigt werden git remote -v) möglicherweise nicht aktualisiert.

Das Ergebnis davon ist, dass Ihr Push Ihren lokalen Zweig / Zweig mit Ihrem Remote / Zweig synchronisiert hat. Der Cache in Ihrem lokalen Repo zeigt jedoch weiterhin das vorherige Commit (von lokal / Zweig ... vorausgesetzt, es wurde nur ein einziges Commit gepusht) als HEAD an.

Um dies zu bestätigen, klonen Sie das Repo an einem anderen Ort und versuchen Sie, den lokalen / Zweig-HEAD und den Remote / Zweig-HEAD zu vergleichen. Wenn beide gleich sind, stehen Sie wahrscheinlich vor dem Problem, das ich gemacht habe.

Lösung:

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)

Gehen Sie nun push -fwie folgt vor

git push -f github master ### Beachten Sie, dass Ihr Befehl nicht originmehr hat!

Mach git pulljetzt ein git pull github master

auf git statusempfangen

# On branch master

nothing to commit (working directory clean)

Ich hoffe, dass dies für jemanden nützlich ist, da die Anzahl der Aufrufe so hoch ist, dass bei der Suche nach diesem Fehler dieser Thread fast immer ganz oben aufgeführt wird

Siehe auch gitref für Details

Vikram
quelle
2

Ich hatte dies tatsächlich, als ich mit TortiseGIT einen Wechsel / Checkout durchführte.

Mein Problem war, dass ich den Zweig basierend auf einem anderen lokalen Zweig erstellt hatte. Es wurde ein "Zusammenführungs" -Eintrag erstellt /.git/config, der ungefähr so ​​aussah:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

Wo immer ich zum "Web" -Zweig wechselte, sagte es mir, dass ich mehr als 100 Commits vor der Entwicklung hatte. Nun, ich habe mich nicht mehr verpflichtet, mich zu entwickeln, also stimmte das. Ich konnte diesen Eintrag einfach entfernen und er scheint wie erwartet zu funktionieren. Es wird ordnungsgemäß mit dem Remote-Ref verfolgt, anstatt sich darüber zu beschweren, dass es sich hinter dem Entwicklungszweig befindet.

Wie Vikram sagte, ist dieser Stapelüberlauf-Thread das beste Ergebnis in Google bei der Suche nach diesem Problem, daher dachte ich, ich würde meine Situation und Lösung teilen.

Dustin Graham
quelle
2

Ich möchte das gleiche wiederholen, wie es von @Marian Zburlia oben erwähnt wurde. Es hat bei mir funktioniert und würde es auch anderen empfehlen.

git pull origin develop

sollte gefolgt werden von $ git pull --rebase.

Dadurch werden die Kommentare entfernt, die $ git statusnach dem letzten Pull angezeigt werden.

Partho Chatterjee
quelle
2

git fetch wird dies für Sie lösen

Wenn mein Verständnis korrekt ist, ist Ihre lokale (zwischengespeicherte) origin/masterveraltet. Dieser Befehl aktualisiert den Repository-Status vom Server.

Guillaume Racicot
quelle
1
Bitte fügen Sie eine Beschreibung hinzu
Mathews Sunny
2

Wenn ich dann einen Git-Status mache, wird mir mitgeteilt, dass mein Zweig um X Commits voraus ist (vermutlich die gleiche Anzahl von Commits, die ich gemacht habe ).

Meine Erfahrung ist in einer Teamumgebung mit vielen Niederlassungen. Wir arbeiten in unseren eigenen Feature-Zweigen (in lokalen Klonen) und es war einer von denen, die git statuszeigten, dass ich 11 Commits voraus war. Meine Arbeitsannahme war, wie der Autor der Frage, dass +11 von meinen eigenen Verpflichtungen stammt .

Es stellte sich heraus, dass ich developviele Wochen zuvor Änderungen aus dem allgemeinen Zweig in meinen Feature-Zweig übernommen hatte - aber vergessen! Als ich heute meinen lokalen Feature-Zweig erneut besuchte und einen machte, git pull origin developsprang die Zahl auf +41 Commits voraus. Es wurde viel Arbeit geleistet, developund so war mein lokaler Feature-Zweig dem Feature-Zweig im originRepository noch weiter voraus .

Wenn Sie diese Nachricht erhalten, denken Sie an alle Pulls / Merges zurück, die Sie möglicherweise von anderen Zweigen (von Ihnen selbst oder von anderen) durchgeführt haben, auf die Sie Zugriff haben. Die Nachricht signalisiert nur, dass Sie git pushdiese pullÄnderungen originvon Ihrem lokalen Repo zurück zum Repo ('Tracking Branch') benötigen, um die Synchronisierung durchzuführen.

FPGA-Typ
quelle
1

Die Antworten, die vorschlagen git pulloder git fetchrichtig sind.
Die Nachricht wird generiert, wenn git statusein Unterschied zwischen .git/FETCH_HEADund .git/refs/remotes/<repository>/<branch>(z .git/refs/remotes/origin/master. B. ) festgestellt wird .

Die letztere Datei zeichnet den HEAD vom letzten Abruf (für das Repository / den Zweig) auf. Dadurch werden git fetchbeide Dateien auf den aktuellen HEAD des Zweigs aktualisiert.
Wenn es nichts zu holen gibt (weil das lokale Repository bereits auf dem neuesten Stand ist), .git/FETCH_HEADändert sich dies natürlich nicht.

NoBrassRing
quelle
Dies scheint für mich nicht der Fall zu sein: .git/FETCH_HEADenthält 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLund .git/refs/remotes/origin/masterenthält 9f7336c873ccffc772168bf49807e23ff74014d3, aber ich erhalte die Nachricht immer noch und löse sie weder git pullnoch git fetchlöse sie
Davide
0

Wenn Sie diese Meldung nach einem Commit erhalten, um die Verfolgung der Datei in der Verzweigung aufzuheben, versuchen Sie, Änderungen an einer beliebigen Datei vorzunehmen, und führen Sie ein Commit durch. Anscheinend können Sie kein einzelnes Commit durchführen, das nur das Aufspüren der zuvor verfolgten Datei umfasst. Schließlich half mir dieser Beitrag, das ganze Problem zu lösen: https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Ich musste nur die Datei aus dem Repository-Verlauf entfernen.

nurb
quelle