Sagen Sie, ich habe einen Git-Klon von einer URL für ein Repository erstellt. Ich habe einige Änderungen an einer Datei vorgenommen, habe eine git commit gemacht.
Wenn ich einen git pull mache, sehe ich, dass dort "Up-to-date" steht.
Sollte es nicht etwas zeigen, das sagt, dass ich nicht auf dem neuesten Stand bin?
Meine Frage ist:
Ich habe gesagt, dass ich die obige Änderung zu meinem lokalen Repo gemacht habe, aber beginne nicht für zwei Tage, aber bevor die zwei Tage vergangen sind, hat jemand anderes eine Änderung am Remote-Repo vorgenommen. Welche Schritte muss ich unternehmen, um sicherzustellen, dass ich Änderungen im Remote-Repo nicht überschreibe oder zumindest die letzten Änderungen vor dem Commit ausführen kann?
Gibt es eine Möglichkeit, zwischen meinem lokalen Repo und dem entfernten Repo zu unterscheiden, um zu prüfen, welche Unterschiede es gibt? (falls ich mich nur daran erinnern möchte, was ich vorher hatte?)
Mein erster Rat ist, nicht git pull
. Machen Sie eine git fetch
gefolgt von einer git merge
.
Um Ihre nullte Frage zu beantworten: Tatsächlich sind Sie aktuell . Sie haben alle Commits, die das Remote-Repository hat. Also, es gibt nichts mehr zu holen oder zu verschmelzen 1 .
Um Ihre erste Frage zu beantworten:
git commit
: Übernehmen Sie Ihre Änderungen in Ihrem eigenen Zweig, völlig unabhängig davon, was in entfernten Repositories vor sich geht. git fetch origin
: Erhalte den Inhalt des Remote-Repositorys ( origin
), behalte ihn aber unter origin/branch
branches. Ihr eigener Code ist an dieser Stelle nicht betroffen. git merge origin/master
: füge origin/master
hinzu, das ist der Zweig master
des entfernten Repositorys origin
(den du gerade abgerufen hast) mit deinem aktuellen Zweig. git push origin
: schiebt das Commit und die Zusammenführung zurück zum Remote-Repository Um Ihre zweite Frage zu beantworten:
git fetch origin
: update origin/branch
Zweige. git diff origin/master
: Ermitteln Sie die Differenz zwischen Ihrem aktuellen Zweig und dem Zweig origin/master
. 1 Angenommen, die Commits in Ihrem Repository sehen zunächst auf dem Zweig master
:
Dies ist direkt nachdem Sie das Repository geklont haben. Jetzt sagen Sie, dass Sie eine neue Festschreibung in Ihrer lokalen Verzweigung master
:
Es gibt also zwei Dinge, die man hier beobachten kann.
Wenn keine Aktivität von jemand anderem in der remote origin
angenommen wird, gibt es nichts neues zu holen. Also git fetch origin master
sagt dir, dass es nichts neues gibt.
Wenn Sie git merge origin/master
erneut ausführen, wird nichts zusammengeführt. origin/master
ist ein Präfix von master
. Mit anderen Worten, master
enthält bereits alle Commits, die origin/master
hat, also gibt es nichts Neues zu verschmelzen.
Wenn Sie fetch
und merge
anstelle von pull
verwendet hätten, könnten Sie leicht nachvollziehen, welcher Teil des Doppelbefehls ( pull
) zu dem unerwarteten (Ihrer Meinung nach) Verhalten führt.
Natürlich erhalten Sie nach einem git push origin master
:
Wenn Sie ziehen, zieht es den Verlauf vom Server ein und versucht automatisch, alles, was Sie geändert haben, mit Dingen zusammenzuführen, die andere Personen geändert haben. Wenn es das automatisch macht, wird es gelingen und Sie werden nichts sehen, und wenn es scheitert, werden Sie aufgefordert, alle Konflikte zu beheben. Sie werden nie in der Lage sein, Änderungen, die andere Personen gemacht haben, stillschweigend zu überschreiben.
Wenn Sie sehen möchten, ob jemand etwas geändert hat, können Sie git fetch
und dann git status
ausführen. Der Status gibt aus, welche Dateien lokal geändert wurden, aber es sagt auch etwas wie "Ihre Verzweigung ist 2 Commits vor dem Ursprung / Master", was bedeutet, dass Sie 2 Commits haben, die nicht auf den Server übertragen wurden. Wenn jemand anderes auch auf den Server gedrängt hat, sagt er etwas wie "Ihre lokale Zweigstelle und der Ursprung / Master sind auseinander gegangen. Das bedeutet, dass Sie und jemand anderes sich verpflichtet haben, zu masteren , wie oben beschrieben.
Tags und Links git