Wie erzwinge ich ein Update beim Git-Pull?

Lesezeit: 6 Minuten

Ich mache Git-Pull einer Open-Source-Bibliothek, es ist mir egal, was meine lokale Kopie ist, ich möchte sie nur mit der Ursprungsversion aktualisieren.

dh es kann meine lokalen Änderungen wegblasen.

Das sollte den Trick machen:

git reset --hard HEAD
git pull

  • Und wenn Sie lokale Commits erstellt haben, die Sie wegwerfen möchten, verwenden Sie: git reset --hard origin/master stattdessen.

    – Greg Hewgill

    29. Dezember 2010 um 2:07 Uhr

  • Und wenn Sie keine benutzerdefinierten lokalen Änderungen haben, sollten Sie dies tun git pull --rebase

    – Henrik

    9. August 2011 um 7:40 Uhr

  • funktioniert nicht, wenn ich KONFLIKTE und Fehlermeldungen zum automatischen Zusammenführen bekomme. Mir egal, ich will nur alles komplett überschreiben…

    – Nathan Schwermann

    25. Oktober 2011 um 17:48 Uhr

  • @schwiz Sie können den Zweig löschen oder umbenennen und neu erstellen, um ihn vom Ursprung zu verfolgen: stackoverflow.com/questions/2665045/…

    – Ian Jäger

    19. Dezember 2011 um 21:25 Uhr

  • Diese Antwort geht davon aus, dass Sie noch nie Commits für Ihren Zweig vorgenommen haben, ziemlich weit entfernt von dem, was die Frage sagte (“I don’t care what my local copy is”).

    – jwg

    16. Januar 2013 um 13:40 Uhr

Benutzer-Avatar
jwg

git fetch
git checkout origin/name_of_branch  # correct state but in 'head without a name'
git checkout -B name_of_branch      # overwrite current tree onto name_of_branch

Dies checkt den Remote-Tracking-Zweig in einen Kopf ohne Namen aus, dann können Sie einen Blick darauf werfen und überprüfen, ob Sie zufrieden sind. Wann immer Sie möchten (auch nach Änderungen oder Commits), beschriftet der zweite Git-Checkout Ihren aktuellen Baum mit „Name_des_Zweigs“, selbst wenn er dazu den alten Name_des_Zweigs löschen muss.


Bearbeiten: „Was für eine verrückte Befehlszeilensyntax“

Die Syntax von Git-Befehlen scheint nicht intuitiv zu sein. Tatsächlich ist es das Git-Datenmodell, das nicht intuitiv ist. Das ist kein schlechtes Design, aber weil es mit Dateien, Zweigen und Commits auf eine Weise arbeitet, die viel flexibler und leistungsfähiger ist als andere Versionskontrollsysteme. Sobald Sie wissen, wie diese Dinge in Git funktionieren, wird die Befehlszeile viel Sinn machen und Sie werden in der Lage sein, genau zu erraten, wie komplizierte Dinge zu tun sind.

  • git fetch

    Das holt alle Updates, die auf dem passiert sind origin Server seit dem letzten Mal. Git trennt das Abrufen vom Server vom Aktualisieren, Zusammenführen usw. Ihrer Branches. Alle Filialen haben angerufen origin/XXX sind dein die neuesten Versionen dessen, was auf dem Server ist. Sie sind nicht entfernte Filialen sondern Remote-Tracking-Zweige, lokale Verzweigungen, die entfernte Verzweigungen verfolgen. Wenn Sie das tun git fetch, aktualisieren Sie sie, ohne Ihre eigenen Zweige zu berühren. Wenn Sie das tun git merge, git rebaseund so weiter, verwenden Sie die abgerufene Version, ohne Holen Sie sich eine neuere Kopie vom Server. Dies bedeutet, dass Sie die Kontrolle darüber haben, wann Netzwerkanfragen gestellt werden (wenn Sie nicht immer mit dem Server verbunden sind), und Sie können einen Snapshot des Servers „holen“ und dann nach Belieben zusammenführen. Im Zweifel tun git fetch Erste.

  • git checkout origin/name_of_branch
    git checkout macht zwei Dinge. Es aktualisiert Ihre Dateien auf diesen Zweig und legt Ihre fest HEAD zu dieser Filiale. Die Dateien sind das, was Sie erwarten würden. Das HEAD Dinge bedeutet, dass, wenn Sie Commits machen, sie am Ende des Zweigs that hinzugefügt werden HEAD verweist auf. IOW, checkout tut beides Ausgang – die richtigen Versionen der Dateien schreiben und vorbereiten Eingang – bereitet sich darauf vor, die Commits, die Sie durchführen werden, an der richtigen Stelle zu speichern. Wenn Sie zur Kasse gehen, rufen Sie eine Filiale an fooändert sich Ihr Baum in den Zustand, in dem er gespeichert wurde foo, und Die nächsten Commits, die Sie ausführen, werden hinzugefügt foo. Im Falle von origin\xyzkönnen Sie Ihre Änderungen nicht in eine schreiben origin Zweig – diese verfolgen, was auf dem ist origin server und kann nicht direkt festgeschrieben werden. Die Kasse aktualisiert also die Dateien und setzt HEAD zu nichts – ein unbenannter Zweig. Dies hält Sie davon ab, Ihre neu ausgecheckten Daten versehentlich wieder in den vorherigen Branch zu übertragen, den Sie verwendet haben, und tatsächlich werden Sie von git stark davon abgehalten, überhaupt zu committen, bis Sie einen Ziel-Zweig haben.
  • git checkout -B name_of_branch

    Wie gewöhnlich, Wenn git zwei verschiedene Dinge mit einem Befehl macht, können beide separat konfiguriert werden. Also der zweite Teil von was checkout tut, Einstellung HEAD zu dem Zweig, zu dem Sie sich verpflichten möchten, kann ein neuer Zweig sein, anstatt zu dem Zweig, den Sie auschecken, wenn Sie den verwenden -B Möglichkeit. So git checkout -B new_stuff old_stuff setzt alle Ihre Dateien in den Status in old_stuffaber bereiten Sie sich darauf vor, Ihre Commits in den neuen Zweig zu schreiben new_stuff. Dies ist eine häufige Aufgabe und erspart Ihnen das Auschecken eines Zweigs und das anschließende Forken in zwei Schritten. Jetzt, Fast alle Argumente für git-Befehle können weggelassen werden, und git wird das Naheliegendste tun. In diesem Fall macht das einen neuen Zweig basierend auf dem, auf dem Sie sich befinden, anstatt eines, das Sie auschecken möchten. Git nimmt also den unbenannten Zweig, auf dem Sie sich befinden, und erstellt einen neuen Zweig mit dem Namen name_of_branch, für die Sie sich verpflichten können. Beachten Sie, dass ein Großbuchstabe „B“ so etwas wie „Kraft“ bedeutet. Wenn Sie “-b” verwenden, würde Git sich weigern, einen bereits vorhandenen Zweig zu überschreiben. Mit “-B” wird es ohne Warnung oder Bestätigung fortgesetzt.

  • @cept0 Wenn Sie nur mehrere hundert Wörter mit vielen Aufzählungszeichen und fettgedruckten Erklärungen lesen, könnten auch Sie lernen, die git-Befehlssyntax zu lieben!

    – jwg

    19. Mai 2014 um 9:44 Uhr

Benutzer-Avatar
Antak

Das Ziel, ruckzuckLösung ist: git reset --hard origin/master

† oder origin/main oder wie auch immer der Name der Filiale Ihres Ursprungs lautet.

Es ist die allmächtige Lösung für Experten und Anfänger gleichermaßen, die die Arbeit schnell erledigt. Obwohl alle nicht festgeschriebenen Änderungen ohne Vorwarnung weggeblasen werden.

Das sicherer Der Befehl ist etwas mühsamer zu tippen: git checkout -B master origin/master

Aliase eingeben:

git config --global alias.become '!git checkout -B "$(git symbolic-ref --short HEAD)"'

Fortan kann man eingeben: git become origin/master

  • origin/master gibt Fehlermeldung. origin/main funktioniert. Außerdem haben die Ordner und Dateien das aktuelle Datum/die aktuelle Uhrzeit, nicht das Datum/die Uhrzeit im Repo.

    – WinEunuuchs2Unix

    4. Dezember 2021 um 22:50 Uhr


  • Aktualisiert, um den Zweignamen zu verdeutlichen. Die Sache mit Datum/Uhrzeit klingt nach einer schlechten Erwartung, da Git keine Zeitstempel von Dateien oder Ordnern aufzeichnet.

    – Antak

    6. Dezember 2021 um 3:42 Uhr

  • Ich bitte um abweichende Zeitstempel. Git sagt Ihnen, vor wie vielen Minuten, Stunden, Tagen, Monaten oder Jahren eine Datei zuletzt geändert wurde. Das ist nur mit einem Zeitstempel auf jeder Datei möglich.

    – WinEunuuchs2Unix

    6. Dezember 2021 um 11:52 Uhr

  • @WinEunuuchs2Unix Diese Informationen in Visualisierungen wie in GitHub basieren auf dem Zeitstempel des Commit. Es ist nicht der Zeitstempel der Datei. Git kümmert sich nicht um Dateisystem-Zeitstempel und weder Aufzeichnungen noch Versuche zur Wiederherstellung dieser Zeitstempel beim Auschecken von Dateien.

    – Antak

    7. Dezember 2021 um 9:18 Uhr

1014470cookie-checkWie erzwinge ich ein Update beim Git-Pull?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy