3 Stimmen

Warum muss ich die Änderungen, die ich gerade aus dem Ursprung in Git gezogen habe, erneut pushen?

Ich habe ein Git-Repository auf meinem lokalen Rechner, das ich von meinem Remote-Server geklont habe. Das Git-Repository, das ich geklont habe, ist ein Bare-Repository.

Eine Sache, die mich immer noch verwirrt, ist, dass, wenn Änderungen auf Origin vorgenommen wurden und ich git pull origin master ausführe, um mein lokales Repository zu aktualisieren, mir git status dann sagt, dass ich X Commits vor origin liege, wobei X die Anzahl der gerade gezogenen Commits ist.

Dies passiert, obwohl die Commit-Logs bereits identisch sind.

Also führe ich immer git push origin master danach aus, aber ich frage mich nur, ob jemand erklären könnte, warum das notwendig ist und ob ich dabei einen Fehler mache.

Es scheint mir, dass, wenn ich die Änderungen von Origin gerade gezogen habe, die zwei Repos identisch sein sollten. Warum wird mir dann gesagt, dass ich vor Origin liege? Hängt das damit zusammen, dass es sich um ein Bare-Repository handelt?

Hier ist die Situation etwas genauer beschrieben, um es verständlicher zu machen:

Ich habe ein nacktes Git-Repo (Hub) auf einem Remote-Server. Dieses Repo hat zwei Klone: "Dev" auf meinem lokalen Rechner und "Staging" auf dem gleichen Server wie Origin.

Wenn ich Änderungen an Dev vornehme, pushe ich sie dann mit git push origin master in das nackte "Hub"-Repo. Dann melde ich mich auf dem Remote-Server an, cd in das "Staging"-Repo und führe git pull origin master durch, um "Staging" von "Hub" zu aktualisieren.

Wenn ich das gemacht habe, und die Commit-Logs von Hub und Staging mit git log --pretty=oneline vergleiche, sehe ich, dass sie identisch sind.

Wenn ich jedoch in das "Staging"-Verzeichnis gehe und git status ausführe, erhalte ich folgendes:

$ git status
# Im Branch master
# Ihr Branch ist um 1 Commit vor 'origin/master'.
#
Nichts zu committen (Arbeitsverzeichnis sauber)

Dann führe ich normalerweise git push origin master von dort aus durch und mir wird gesagt:

$ git push origin master
Everything up-to-date

Alles funktioniert einwandfrei, aber ich habe immer noch diese nagende Frage im Kopf, ob ich einen Fehler gemacht habe, als ich die Repos eingerichtet habe, oder ob das normal ist...

5voto

Michelle Tilley Punkte 153542

Laut man git-pull:

Merge in den aktuellen Branch den Remote-Branch next ein:

$ git pull origin next

Dies hinterlässt eine Kopie von next vorübergehend in FETCH_HEAD, aktualisiert jedoch keine Remote-Tracking-Branches. Mit Remote-Tracking-Branches kann dasselbe durch Aufrufen von Fetch und Merge erfolgen:

$ git fetch origin
$ git merge origin/next

Hervorhebung von mir.

Im Grunde genommen sagt Git Ihnen, dass Ihr aktualisiertes Master vor origin/master liegt, was ein Remote Tracking Branch für master ist. Da dieser Tracking Branch nicht von git pull origin master aktualisiert wird (wie im man page angegeben), sind Sie ihm technisch gesehen voraus. Der Aufruf von git fetch origin aktualisiert Ihre Remote-Tracking-Branches und dann können Sie diesen Tracking-Branch manuell mergen (wie im zweiten Beispiel der manpage angegeben).

Soweit ich weiß, wenn Sie keinen Branch-Namen mit git pull angeben (z.B. git pull origin), wird in der Datei .git/config nachgelesen, was es abrufen soll, und die Remote-Tracking-Branches werden aktualisiert.

1voto

Phil Miller Punkte 34232

Haben Sie auch Änderungen lokal vorgenommen? Wenn ja, dann ruft Ihr git pull die entfernten Commits ab und generiert einen Merge-Commit, der von Ihrem lokalen HEAD und dem HEAD von origin abstammt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X